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

Pyt*_*ner 4 python name-matching dataframe pandas cosine-similarity

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

样本输入

df1                           
mahesh                 
suresh


df2                                                                                  
surendra    
mahesh    
shrivatsa    
suresh    
maheshwari
Run Code Online (Sandbox Code Playgroud)

样本输出

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
Run Code Online (Sandbox Code Playgroud)

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

pol*_*ist 5

有许多不同的字符串距离度量。我不确定如何在这种情况下使用余弦相似度,但我建议查看一个strsim库。

我会给你一个例子,说明我将如何使用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)
Run Code Online (Sandbox Code Playgroud)

返回:

     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
Run Code Online (Sandbox Code Playgroud)

贾罗-温克勒

     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
Run Code Online (Sandbox Code Playgroud)

返回:

    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

Run Code Online (Sandbox Code Playgroud)

余弦相似度

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

返回:

    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

Run Code Online (Sandbox Code Playgroud)