0

我有一本包含翻译概率 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]
4

4 回答 4

3

如果您需要为每个键存储多个值,则“对齐”字典必须存储某种集合,例如列表。例如:

from collections import defaultdict

alignments = defauldict(list)

...
[the remainder of your code]
... 

alignments[k, chinese_sent[i]].append(english_sent[j])

顺便说一句,两项更改将使您的代码更清晰:

  1. chinese_sent 和 english sent 是可迭代的,您不需要索引,因此您不需要在循环中使用 range。

  2. 您可以使用元组而不是字符串作为概率字典键。

您的代码将变为:

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)
于 2013-02-22T12:42:23.497 回答
1

尝试将键关联到列表,而不是存储单个值:

alignments[k, chinese_sent[i]].append(english_sent[j])
于 2013-02-22T12:42:43.857 回答
0

您可以将字典的值转换为列表而不是单个值,即拥有一个列表字典。

于 2013-02-22T12:42:05.230 回答
0

alignments[k, chinese_sent[i]] 应该是一个列表或数组,如果您看到当前值更高,则将其设置为新列表或数组并存储概率并更新 argmax 。如果它相同,那么您向该列表添加一个新值。

于 2013-02-22T12:43:35.297 回答