2013-02-22 2 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, если они имеют наибольшую вероятность перевода. Как мне это сделать?

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]) 

Btw, два изменения сделает ваш код более уборщик:

  1. chinese_sent и английский рассылаемых итерируемыми и вам не нужны индексы, так что вам не нужно использовать диапазон в ваших циклах.

  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

0

Вы можете преобразовать значения своего словаря в список вместо одного значения, то есть иметь словарь списков.

1

Вместо того чтобы хранить одно значение, попробуйте связать ключ к списку:

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

выравнивания [К, chinese_sent [я ]] должен быть списком или массивом, если вы видите текущий vaue его более высокий, тогда вы установите его в новый список или массив и сохраните вероятность и обновите argmax. Если это то же самое, вы добавляете новое значение в этот список.

Смежные вопросы