我有成千上万的表,每个表包含数百个单词,并且在第二列中包含相应的分数。我需要计算每对表的相关性。
所以,我开始阅读每个表,并将其转换为字典;每个单词都是一个字典键,其得分是值。
现在是计算相关性的时候了。我必须提一下,并不一定所有的词典都有相同的键;更多,更少;每个字典都应根据其对进行扩展 - 意味着如果该对具有一个在另一个字母中不存在的密钥,则另一个字典应该由这些密钥更新,并且那些密钥的值应该为0,最后必须计算相关系数
示例:
dict1 = {'car': 0.1, 'dog':0.3, 'tiger':0.5, 'lion': 0.1, 'fish':0.2}
dict2 = {'goat':0.3, 'fish':0.3, 'shark':0.4, 'dog':0.3}
所以,dict1应该看起来像:
dict1.comparable = {'car':0.1, 'goat':0.0 ,'dog':0.3, 'tiger':0.5, 'lion': 0.1, 'fish':'0.2, 'shark':0.0}
dict2.comparable = {'car': 0.0, 'goat':0.3, 'dog':0.3, 'fish':0.3, 'shark':0.4, ,'tiger':0, 'lion': 0}
然后应计算其值的相关性。
我很感激如何有效地根据它们的值来计算词典的相似性/相关性。
更新
Here是一篇文章,解释了如何从技术上计算相关系数。
这是最简单的版本
import numpy
numpy.corrcoef(list1, list2)[0, 1]
但它只适用于“列表”。基本上我是在以有效的方式计算关于其键的两个字典的相关系数之后。 (减少扩展和排序键的数量)
答案 0 :(得分:2)
keys = list(dict1.viewkeys() | dict2.viewkeys())
import numpy
numpy.corrcoef(
[dict1.get(x, 0) for x in keys],
[dict2.get(x, 0) for x in keys])[0, 1]
首先你得到所有的钥匙。无需排序,但需要重复数据删除。将其存储为列表有助于稍后以相同的顺序迭代它们。
然后你可以创建numpy所需的2个列表。
答案 1 :(得分:0)
不要在字典中添加零。这些只是膨胀,并且在计算相似性时将被消除。如果没有很多时间,抛出零会为你节省一些时间。
然后,要计算相似度,请从两者的最短词典开始。对于最短的每个密钥,检查密钥是否在最长的字典中。这也节省了大量时间,因为使用N个项目循环遍历dict需要N次,而检查该项目是否在较大的dict中只需要1次。
如果只是为了计算相似度,请不要创建中间词典。它浪费时间和记忆。
要最终计算相似度,您可以根据需要尝试余弦指标,欧几里德距离或其他内容。