【问题标题】:How to calculate the similarity measure of text document?如何计算文本文档的相似度?
【发布时间】:2019-10-23 20:58:26
【问题描述】:

我的 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

我想要读取文件并执行相似度差异的代码。

我查看了很多关于此的帖子,例如1234,但要么我很难理解,要么不完全是我想要的。

基于一些帖子和网页说“一个简单而有效的方法是余弦相似度”或“通用句子编码器”或“Levenshtein 距离”。

如果你能提供我也可以在我身边运行的代码,那就太好了。谢谢

【问题讨论】:

标签: python pandas csv dataframe nlp


【解决方案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

【讨论】:

  • 感谢您的评论。是的,计算是对称的。正如我所提到的,计算是基于与其他字符串检查每个字符串并给出他们的单词之间的相似度,就像你写的78.0一样。我尝试运行您的代码,但出现AttributeError: 'DataFrame' object has no attribute 'messages' 错误。我在 python 中很新,但我不确定为什么会出错。你能告诉我我在哪里失踪吗?
  • @Bilgin 是列的名称,包含所有字符串。在您提供的示例中,它似乎是'messages',但在您的真实数据中,情况并非如此。使用任何列名(我使用 df.idx 的地方也是如此)
  • 谢谢我解决了这个问题。那么,据我所知,这是一个模糊的比率相似性​​检查?我怎样才能在这里执行余弦相似度?感谢帮助。
  • @Bilgin 见this post。使用公认的解决方案(将这些定义复制到您的程序中),您需要类似:vector1 = text_to_vector(ac)vector2 = text_to_vector(bc) 然后sim = get_cosine(vector1, vector2)
猜你喜欢
  • 2023-03-24
  • 2012-02-12
  • 2020-03-10
  • 2020-01-25
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多