【问题标题】:Right way to calculate the cosine similarity of two word-frequency-dictionaries in python?在python中计算两个词频词典的余弦相似度的正确方法?
【发布时间】:2017-06-09 05:45:21
【问题描述】:

我正在尝试遍历包含文本的文件并计算当前行与用户提出的查询之间的余弦相似度。我已经对查询和行进行了标记,并将它们的单词并集保存到一个集合中。

例子:

line_tokenized = ['Karl', 'Donald', 'Ifwerson']

query_tokenized = ['Donald', 'Trump']

word_set = ['Karl', 'Donald', 'Ifwerson', 'Trump']

现在我必须为每行和查询创建一个字典,其中包含词频对。我想到了这样的事情:

line_dict = {'Karl': 1, 'Donald': 1, 'Ifwerson': 1, 'Trump': 0}
query_dict = {'Karl': 0, 'Donald': 1, 'Ifwerson': 0, 'Trump': 1}

但是由于键值对是无序的,因此无法正确计算余弦相似度。我遇到了OrderedDict(),但我不明白如何实现一些东西,因为它的元素存储为元组:

所以我的问题是:

  • 如何设置键值对并在之后访问它们?
  • 如何增加某个键的值?
  • 或者还有其他更简单的方法吗?

【问题讨论】:

  • “键值对无序”是什么意思?您希望如何订购它们?
  • 我希望它们按照我添加到字典中的顺序排列。
  • 我不明白你的意思,我在你的代码中没有看到你指的是哪个顺序,我有一个很好的答案给你,你给我解释一下顺序
  • @LucaIonescu:字典是一个哈希表,因此没有内在的顺序。您确实可以使用数据结构来强制执行顺序,但是要计算 cos sim,这不是必需的。

标签: python python-3.x nlp nltk cosine-similarity


【解决方案1】:

你不需要为Cosine similarity订购字典,简单的查找就足够了:

import math

def cosine_dic(dic1,dic2):
    numerator = 0
    dena = 0
    for key1,val1 in dic1.items():
        numerator += val1*dic2.get(key1,0.0)
        dena += val1*val1
    denb = 0
    for val2 in dic2.values():
        denb += val2*val2
    return numerator/math.sqrt(dena*denb)

您只需使用.get(key1,0.0) 来查找元素是否存在,如果不存在则假定为0.0。因此dic1 和dic2 都不需要以0 作为值来存储值。

回答您的其他问题:

如何设置键值对并在之后访问它们?

您只需声明:

dic[key] = value

如何增加某个键的值?

如果您确定该键已经是字典的一部分:

dic[key] +=  1

否则你可以使用:

dic[key] = dic.get(key,0)+1

或者还有其他更简单的方法吗?

您可以使用Counter,它基本上是一个带有一些附加功能的字典。

【讨论】:

    【解决方案2】:

    使用pandas 和scipy

    import pandas as pd
    from scipy.spatial.distance import cosine
    
    line_dict = {'Karl': 1, 'Donald': 1, 'Ifwerson': 1, 'Trump': 0}
    query_dict = {'Karl': 0, 'Donald': 1, 'Ifwerson': 0, 'Trump': 1}
    
    line_s = pd.Series(line_dict)
    query_s = pd.Series(query_dict)
    
    print(1 - cosine(line_s, query_s))
    

    这段代码会输出0.40824829046386291

    我不明白您所说的“订单”是什么意思,所以我没有处理这个问题,但这段代码应该是一个好的开始。

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 2015-05-03
      • 2017-03-19
      • 2015-08-04
      • 2021-09-02
      • 2014-03-25
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多