【发布时间】:2016-03-01 20:46:57
【问题描述】:
我有两个格式如下的文件:
文件 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,但
topic_1不是,文件 2 中的值也不是。 -
不,我获取的数据只是一个样本。实际数据如此庞大。在那,这两个文件都有标准化的值。所以,当我相乘时,它应该自动加起来为 1。我们不需要在代码中对其进行规范化。但是,由于这里有像 topic_2 这样的空主题,我想这会引起一些混乱。当整个输入数据文件中存在非零主题时,代码可以正常工作。
-
好吧,对于 mcve,您也应该对样本数据进行规范化。
-
输出数据的第二列相乘后应该总和为1。样本输入数据(file1 和 file2)被标准化。每个主题单独加起来为 1,file2 的总值也为 1。
标签: python file python-2.7 normalization multiplication