【问题标题】:Multiply normalized values - How to take the weighted average of words乘以归一化值 - 如何取单词的加权平均值
【发布时间】: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


【解决方案1】:

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

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

由于您的真实数据总和约为 0.99,并且仅当一个或多个主题都为零时才会发生这种情况,我猜1 与您获得的总数之间的差异是相等的正被归零的权重的总和,就像在这个例子中一样。寻找那个。

【讨论】:

  • 我明白这一点,但我的实际数据中的值是这样的,无论主题为零,它们总和应该为 1。我接近 0.95 和 0.99。但不完全是 1。
  • 然后您需要优化您的 mcve 以反映真实数据的情况。还有人怎么想出来的?请注意,在执行此操作的过程中,您很可能会自己弄清楚。
  • 只有当主题值(如超过 500 个主题)很大时,我才会得到空主题。对于小主题值(小于 200),我不会得到空主题。所以,我无法在这里发布我的实际数据:(
  • @Sanathana - 查看修订版。
  • 令人困惑..关于如何修改此代码以有效地乘法的任何想法?我从昨天开始尝试这个,但它仍然不起作用:(我尝试了 1000 个主题。超过 100 个主题是空的,我的输出也在 0.95 到 0.99 之间。
猜你喜欢
  • 2021-01-07
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多