我有以下格式的两个文件:
文件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.
我可以纠正这个问题,还是有更好的编码方式(如上所示)来增加单词的值?
答案 0 :(得分:1)
你说每个主题总和如每个主题的总权重值等于1 ,但事实并非如此。
由于topic_1
中的所有内容都为零,因此它可能不存在。因此,文件2的第二列中的0.5
也可能不存在;它在乘法中被归零。因此,实际上,文件2的总数为0.25 + 0.25 = 0.5
,这是您获得的总数。
由于您的实际数据总和大约为0.99
,而这只发生在一个或多个主题都为零的情况下,我会猜测1
与您总数之间的差异re get等于被归零的权重之和,就像在这个例子中一样。寻找那个。