我有一个看起来像CSV文件:
idx messages
112 I have a car and it is blue
114 I have a bike and it is red
115 I don't have any car
117 I don't have any bike
我想拥有读取文件并执行相似度差异的代码。
我浏览了许多与此相关的帖子,例如1 2 3 4,但我很难理解还是不完全想要。
根据一些帖子和网页上的说法,即“简单有效的是余弦相似度”或“通用句子编码器”或“ Levenshtein距离”。
如果您能提供我也可以在我身边运行的代码的帮助,那将是非常不错的。谢谢
答案 0 :(得分:1)
我不知道这样的计算是否可以很好地向量化,所以循环很简单。至少要利用您的计算是对称且对角线始终为100的事实来减少您执行的计算数量。
import pandas as pd
import numpy as np
from fuzzywuzzy import fuzz
K = len(df)
similarity = np.empty((K,K), dtype=float)
for i, ac in enumerate(df['messages']):
for j, bc in enumerate(df['messages']):
if i > j:
continue
if i == j:
sim = 100
else:
sim = fuzz.ratio(ac, bc) # Use whatever metric you want here
# for comparison of 2 strings.
similarity[i, j] = sim
similarity[j, i] = sim
df_sim = pd.DataFrame(similarity, index=df.idx, columns=df.idx)
df_sim
id 112 114 115 117
id
112 100.0 78.0 51.0 50.0
114 78.0 100.0 47.0 54.0
115 51.0 47.0 100.0 83.0
117 50.0 54.0 83.0 100.0