乘以归一化值 - 如何取单词的加权平均值
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
与总数之间的差异你得到的等于被清零的权重的总和,就像在这个例子中一样。找那个。
我有两个文件,格式如下:
文件 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
与总数之间的差异你得到的等于被清零的权重的总和,就像在这个例子中一样。找那个。