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

问题描述 投票:0回答:1

我在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的每个文档进行比较。

python pandas dataframe cosine-similarity name-matching
1个回答
0
投票

有许多不同的弦距量度。我不确定在这种情况下如何使用余弦相似度,尽管我建议研究strsim库。

我将为您提供一个示例,说明如何使用最适合短字符串的strsim度量标准解决该问题。

此外,在上述库文档的示例中,我也尝试使用Jaro-Winkler

这可能是完全错误的,但应该给您一个大致的概念


数据准备

cosine similarity

返回:

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)

Jaro-Winkler

     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)
© www.soinside.com 2019 - 2024. All rights reserved.