将最大值写入字典而不覆盖
问题描述:
我有一个包含翻译概率P(c | e)的双语词典(“概率”)。这是给定一个特定的英文单词e的概率,翻译将是一个特定的中文单词c。字典键看起来像这样:probabilities[chinese_word + " | " + english_word]
将最大值写入字典而不覆盖
我也有一个语料库(“bitext”)的中文句子与他们的英文翻译对齐。现在,对于每一对句子,对于每个中文单词i,我想遍历所有英文单词j并选择P(c_i | e_j)最高的单词。我通过将变量argmax定义为0来完成此操作,并在概率相同或更高时更新此变量。
这就是问题:一些c | e组合具有完全相同的转换概率。但是,由于字典键必须是唯一的,因此我的代码只存储它所看到的最后一个c | e组合。如果它们共享最高的翻译概率,我希望它能够存储几个c | e组合。我该怎么做呢?
alignments = {}
for k in range(1, number_of_sent+1):
sentences = bitext[k-1]
chinese_sent = sentences[0]
english_sent = sentences[1]
for i in range(len(chinese_sent)):
argmax = 0
for j in range(len(english_sent)):
if probabilities[chinese_sent[i] + " | " + english_sent[j]] >= argmax:
argmax = probabilities[chinese_sent[i] + " | " + english_sent[j]]
alignments[k, chinese_sent[i]] = english_sent[j]
答
如果您需要为每个键存储多个值,那么您的“路线”字典必须存储某种集合,如列表。例如:
from collections import defaultdict
alignments = defauldict(list)
...
[the remainder of your code]
...
alignments[k, chinese_sent[i]].append(english_sent[j])
顺便说一句,两个变化将使你的代码更清洁:
chinese_sent和英语版是iterables,你不需要索引,所以你不需要在你的循环中使用范围。
您可以使用元组而不是字符串作为概率字典键。
那么您的代码将变为:
from collections import defaultdict
alignments = defauldict(list)
for k in range(1, number_of_sent+1):
sentences = bitext[k-1]
chinese_sent = sentences[0]
english_sent = sentences[1]
for cs in chinese_sent:
argmax = 0
for es in english_sent:
if probabilities[cs,es] >= argmax:
argmax = probabilities[cs,es]
alignments[k, cs].append(es)
答
您可以将字典的值作为列表而不是单个值进行转换,即具有列表字典。
答
不是存储单个值,尝试的关键列表关联:
alignments[k, chinese_sent[i]].append(english_sent[j])
答
路线[K,chinese_sent [我]]应该是一个列表或一个数组,如果你看到当前vaue高,那么你将它设置为一个新的列表或数组,并存储概率并更新argmax。如果它是相同的,那么你给该列表添加一个新的值。
谢谢你的帮助! – Johanna 2013-02-22 15:06:38