1

我有数千个表,每个表都包含数百个单词,以及它们在第二列中的相应分数。我需要计算每对表的相关性。

所以,我开始阅读每个表格,并将其转换为字典;每个单词都是一个字典键,它的分数就是值。

现在是计算相关性的时候了。我必须提到,不一定所有字典都有相同的键;多一些,少一些;每个字典都应根据其对进行扩展 - 意思是如果该对具有另一个不存在的某个键,则另一个字典应由这些键更新,并且这些键的值应为 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}

然后应该计算它们的值的相关性。

我很欣赏如何根据字典的值有效地计算字典的相似性/相关性。

更新

是一篇解释如何从技术上计算相关系数的帖子。

这是最简单的版本

import numpy
numpy.corrcoef(list1, list2)[0, 1]

但它只适用于“列表”。基本上,我在计算两个字典相对于它们的键的相关系数之后,以一种有效的方式。(更少的扩展和排序键)

4

2 回答 2

3
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 个列表。

于 2013-05-23T00:30:04.337 回答
1

不要在字典中添加零。这些只是膨胀,并且在计算相似度时会被消除。省略零已经可以为您节省一些时间,如果不是很多时间的话。

然后,要计算相似度,从两者中最短的字典开始。对于最短的每个键,检查该键是否在最长的字典中。这也节省了大量时间,因为循环一个包含 N 个项目的 dict 需要 N 时间,而检查该项目是否在较大的 dict 中只需要 1 次。

如果只是为了计算相似度,请不要创建中间字典。它浪费时间和记忆。

要最终计算相似度,您可以根据需要尝试余弦度量、欧几里得距离或其他方法。

于 2013-05-22T21:50:20.840 回答