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