在 Python 中使用余弦相似度比较两个词典时出现类型错误

Type Error when Comparing Two Dictionaries Using Cosine Similarity in Python

我在使用余弦相似度比较两个词典时收到类型错误。我已经尝试四处搜索但仍然无法解决它,如果有人能为我提供一些帮助,我将不胜感激。

我的词典如下所示。

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

我在stack overflow也看了一圈,确实也有会员用余弦相似度比较字典的值。而且我认为它应该与我的情况非常相似。这是我引用的 url: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操作(交集),它也会给我同样的错误信息...

谁能告诉我如何解决这个问题?

谢谢。

您可以尝试通过 list(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?