在Python中使用余弦相似度比较两个词典时输入错误

时间:2015-01-25 19:28:35

标签: python dictionary typeerror cosine-similarity

我在使用余弦相似度比较两个词典时收到了类型错误。我试图四处寻找,但仍然无法解决它,如果有人能为我提供一些亮点,我将非常感激。

我的词典如下所示。

dict1 = {'a': 1, 'b': 0, 'c': 1}
dict2 = {'a': 1, 'b': 1, 'c': 0}

我也在堆栈溢出中查看,确实有成员也使用余弦相似性比较字典的值。我认为它应该与我的情况非常相似。这是我引用的网址:Python: calculate cosine similarity of two dicts faster

这是由@Davidmh提供的功能(稍作修改):

import numpy as np

def cos(v1, v2):
    up = 0
    for key in set(v1).intersection(v2):
        v1_value = v1[key]
        v2_value = v2[key]
        up += v1_value * v2_value
    if up == 0:
        return 0
    return up / (np.sqrt(np.dot(v1.values(), v1.values())) * np.sqrt(np.dot(v2.values(), v2.values())))

所以我接下来要做的就是调用函数:

print(cos(dict1, dict2))

以下是我收到的类型错误消息。

File "C:/Users/Yoshiaki/TextProcessing/compute.py", line 157, in cos
    return up / (np.sqrt(np.dot(v1.values(), v1.values())) * np.sqrt(np.dot(v2.values(), v2.values())))
TypeError: unsupported operand type(s) for *: 'dict_values' and 'dict_values'

我已经搜索了出现的类型错误,但它并没有给我很多解释也没有结果。它似乎与集合操作有关......?我甚至尝试过不使用set操作(交集),它也会给我相同的错误信息......

有人可以告诉我如何解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试通过列表(v1.values())将它们更改为列表吗? dict_values是一种类型,因此将其转换为列表可以解决问题。

return up / (np.sqrt(np.dot(list(v1.values()), list(v1.values()))) * np.sqrt(np.dot(list(v2.values()), list(v2.values()))))

参考: Python: simplest way to get list of values from dict?