两个不同长度的数据帧的列之间的余弦相似性?

2024-09-22 22:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在df1中有文本列,在df2中有文本列。df2的长度将不同于df1的长度。 我想计算df1[text]中每个条目与df2[text]中每个条目的余弦相似性,并为每个匹配项打分。你知道吗

样本输入

df1                           
mahesh                 
suresh


df2                                                                                  
surendra    
mahesh    
shrivatsa    
suresh    
maheshwari

样本输出

mahesh    surendra       30
mahesh    mahesh         100
mahesh    shrivatsa      20
mahesh    suresh         60
mahesh    maheshwari     80
suresh    surendra       70
suresh    mahesh         60
suresh    shrivatsa      40
suresh    suresh         100
suresh    maheshwari     30

当我试图使用tf-idf方法匹配这两个列以获得相似性时,我遇到了一些问题(得到了关键错误),因为这些列的长度不同。 有没有其他方法可以解决这个问题。。。 任何帮助都将不胜感激。 我搜索了很多,发现在几乎所有的情况下,人们都会将第一个文档与同一个语料库中的其他文档进行比较。 这就像是比较语料库1中的每一个文档和语料库2中的每一个文档。你知道吗


Tags: 方法text文档文本条目相似性df1样本
1条回答
网友
1楼 · 发布于 2024-09-22 22:36:38

有许多不同的弦距离度量。我不能确定如何在这种情况下使用余弦相似性,尽管我建议查看^{}库。你知道吗

我将举一个例子,说明如何使用最适合于短字符串的Jaro-Winkler度量来解决这个问题。你知道吗

另外,我还包括了我使用cosine similarity的尝试,该示例来自上述库的文档。你知道吗

这可能是完全错误的,但应该让您大致了解如何从两列不同长度的笛卡尔积生成数据帧,以及如何将strsim的算法应用于pd.DataFrame中存储的数据


数据准备:

import pandas as pd

from similarity.jarowinkler import JaroWinkler
from similarity.cosine import Cosine


df1 = pd.DataFrame({
    "name": ["mahesh", "suresh"]
})

df2 = pd.DataFrame({
    "name": ["mahesh", "surendra", "shrivatsa", "suresh", "maheshwari"]
})

df = pd.MultiIndex.from_product(
    [df1["name"], df2["name"]], names=["col1", "col2"]
).to_frame(index=False)

退货:

     col1        col2
0  mahesh      mahesh
1  mahesh    surendra
2  mahesh   shrivatsa
3  mahesh      suresh
4  mahesh  maheshwari
5  suresh      mahesh
6  suresh    surendra
7  suresh   shrivatsa
8  suresh      suresh
9  suresh  maheshwari

雅罗·温克勒:

jarowinkler = JaroWinkler()
df["jarowinkler_sim"] = [jarowinkler.similarity(i,j) for i,j in zip(df["col1"],df["col2"])]

退货:

    col1    col2        jarowinkler_sim
0   mahesh  mahesh      1.0
1   mahesh  surendra    0.4305555555555555
2   mahesh  shrivatsa   0.5185185185185185
3   mahesh  suresh      0.6666666666666666
4   mahesh  maheshwari  0.9466666666666667
5   suresh  mahesh      0.6666666666666666
6   suresh  surendra    0.8333333333333334
7   suresh  shrivatsa   0.611111111111111
8   suresh  suresh      1.0
9   suresh  maheshwari  0.48888888888888893


余弦相似性

cosine = Cosine(2)
df["p0"] = df["col1"].apply(lambda s: cosine.get_profile(s)) 
df["p1"] = df["col2"].apply(lambda s: cosine.get_profile(s)) 
df["cosine_sim"] = [cosine.similarity_profiles(p0,p1) for p0,p1 in zip(df["p0"],df["p1"])]

df.drop(["p0", "p1"], axis=1)

退货:

    col1    col2        cosine_sim
0   mahesh  mahesh      0.9999999999999998
1   mahesh  surendra    0.0
2   mahesh  shrivatsa   0.15811388300841897
3   mahesh  suresh      0.3999999999999999
4   mahesh  maheshwari  0.7453559924999299
5   suresh  mahesh      0.3999999999999999
6   suresh  surendra    0.5070925528371099
7   suresh  shrivatsa   0.15811388300841897
8   suresh  suresh      0.9999999999999998
9   suresh  maheshwari  0.29814239699997197

相关问题 更多 >