乘以归一化值 - 如何取单词的加权平均值

Multiply normalized values - How to take the weighted average of words

我有两个文件,格式如下:

文件 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" 的权重为:

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

也就是说,在文件1中,单词记录出现在主题0、1和2中。因此,取文件2中的第0个位置1st、2nd位置值,并乘以在文件中出现的单词各自的权重主题 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。我展示的数据只是一个示例。我的实际数据运行到大约 1000 个主题。

我们可以看到所有的词都出现在所有的话题中。并且,这里主题 1 完全为 0。所有的词都没有权重。

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

我举的例子很简单,它不会加起来为 1,因为数字是这样的。但是,对于我拥有的数据,它应该总和为 1。

我可以纠正这个问题还是有更好的编码方法(比上面显示的)乘以单词的值?

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

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

由于您的真实数据总和约为 0.99,并且只有在一个或多个主题全为零时才会发生这种情况,因此我猜测 1 与总数之间的差异你得到的等于被清零的权重的总和,就像在这个例子中一样。找那个。