乘以标准化值 - 如何获取单词的加权平均值

时间:2015-11-27 15:54:01

标签: python file python-2.7 normalization multiplication

我有以下格式的两个文件:

文件1:

 TOPIC:topic_0 24
 track 0.25000000000000000
 record 0.25000000000000000
 athlete 0.25000000000000000  
 run 0.25000000000000000
 star 0.0
 film 0.0
 TOPIC:topic_1 0
 run 0.0  
 track 0.0
 athlete 0.0
 record 0.0
 star 0.0
 film 0.0 
 TOPIC:topic_2 20
 film 0.25000000000000000
 star 0.25000000000000000
 track 0.25000000000000000
 record 0.25000000000000000
 athlete 0.0
 run 0.0

文件2:

0.25 0.5 0.25

然后我想计算每个单词的权重。例如,“记录”一词的重量为:

record (0.25*0.25) + (0*0.5) + (0.25*0.25) which is 0.125. 

也就是说,在文件1中,在主题0,1和2中存在单词记录。因此,从文件2中取出第0个位置的第1个,第2个位置值并乘以主题0中存在的单词的相应权重。 ,1和2.我使用了代码:

from collections import defaultdict
from itertools import groupby, imap

d = defaultdict(list)
with open("file1.txt") as f, open("file2.txt") as f2:
    values = map(float, f2.read().split()) 
    for line in f:
        if line.strip() and not line.startswith("TOPIC"):
            name, val = line.split()
            d[name].append(float(val))

for k,v in d.items():
     print("{} {}".format(k ,sum(i*j for i, j in zip(v,values)) ))

我将输出视为:

 run 0.0625
 track 0.125
 athlete 0.0625
 record 0.125
 star 0.0625
 film 0.0625

求和时的输出列应该为1。对不起,这个样本数据很糟糕,因为取值所以它不会总和为1。但在实际数据中,在乘法**之后,当输出文件的第二列求和时,它应该给1 )**我得到的值介于0.95到0.99之间但不完全是1.

File1和File2都已规范化。也就是说,file2的值之和等于1,并且每个主题总和如每个主题的总权重值等于1.

当乘法发生时,最终结果也应该总和为1.我所显示的数据只是一个样本。我的实际数据运行到大约1000个主题。

我们可以看到所有主题中都包含所有单词。并且,这里主题1总共为0.所有单词都没有权重。

当所有主题都包含一些权重的单词时,上面的代码工作正常。当总主题(如topic_2)为零时,我的输出总和不是1.

我采取的例子很简单,因为数字是这样的,所以不会总结为1。但是,对于我所拥有的数据,它应总计为1.

我可以纠正这个问题,还是有更好的编码方式(如上所示)来增加单词的值?

1 个答案:

答案 0 :(得分:1)

你说每个主题总和如每个主题的总权重值等于1 ,但事实并非如此。

由于topic_1中的所有内容都为零,因此它可能不存在。因此,文件2的第二列中的0.5也可能不存在;它在乘法中被归零。因此,实际上,文件2的总数为0.25 + 0.25 = 0.5,这是您获得的总数。

由于您的实际数据总和大约为0.99,而这只发生在一个或多个主题都为零的情况下,我会猜测1与您总数之间的差异re get等于被归零的权重之和,就像在这个例子中一样。寻找那个。