我在使用余弦相似度比较两个词典时收到了类型错误。我试图四处寻找,但仍然无法解决它,如果有人能为我提供一些亮点,我将非常感激。
我的词典如下所示。
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操作(交集),它也会给我相同的错误信息......
有人可以告诉我如何解决这个问题吗?
感谢。
答案 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()))))