0

翻訳確率 P(c|e) を含むバイリンガル辞書 (「確率」) があります。これは、特定の英単語 e が与えられた場合に、翻訳が特定の中国語の単語 c になる確率です。辞書のキーは次のようになります。probabilities[chinese_word + " | " + english_word]

また、英語の翻訳に合わせた中国語の文章のコーパス (「バイテキスト」) もあります。ここで、文の各ペア、各中国語の単語 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])

ところで、2つの変更により、コードがよりクリーンになります。

  1. Chinese_sentとenglishsentは反復可能であり、インデックスは必要ないため、ループで範囲を使用する必要はありません。

  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 に答える