我在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的每个文档进行比较。
有许多不同的弦距量度。我不确定在这种情况下如何使用余弦相似度,尽管我建议研究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)