2013-02-22 77 views
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] 

回答

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和英語版是iterables,你不需要索引,所以你不需要在你的循環中使用範圍。

  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) 
+0

謝謝你的幫助! – Johanna 2013-02-22 15:06:38

0

您可以將字典的值作爲列表而不是單個值進行轉換,即具有列表字典。

1

不是存儲單個值,嘗試的關鍵列表關聯:

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

路線[K,chinese_sent [我]]應該是一個列表或一個數組,如果你看到當前vaue高,那麼你將它設置爲一個新的列表或數組,並存儲概率並更新argmax。如果它是相同的,那麼你給該列表添加一個新的值。