ранжирование позиций в списке терминов

У меня есть параллельный корпус в этом формате:

parallel_corpus = one sentence in Italian : one sentence in English one sentence in Italian : one sentence in English 

И у меня есть список двуязычных терминов в этом формате

 bigram_list = Difensori dei diritti umani, libertà di espressione > Human rights defenders, freedom of expression sgomberi forzati, violazioni dei diritti umani > forced evictions, human rights violations 

Таким образом, каждая строка в файле двуязычных терминов содержит термины двух языков, разделенных символом ">"

Я хочу связать для каждой строки в вышеприведенном файле пары перевода кандидатов (термин на одном языке рядом с одним термином на другом языке). Итак, для первого примера выше битрамы будут выглядеть так:

 ('Difensori dei diritti umani','Human rights defenders') ('Difensori dei diritti umani','freedom of expression') ('libertà di espressione','Human rights defenders') ('libertà di espressione','freedom of expression') 

Впоследствии я хочу оценить взаимную информацию для каждого битрама, как и выше, и будет выбран большой график с большим значением. Я пробовал этот код

 for line in bigram_list.splitlines(): n = 0 s = 0.001 a = 0 b = 0 c = 0 d = 0 mi = '' bi= [] trans = line.split(' > ') left = trans[0].split(', ') right = trans[1].split(', ') for i in left: for j in right: for line in parallel_corpus.splitlines(): n += 1 if i in line and j in line: a += 1 elif i in line and not j in line: b+= 1 elif j in line and not i in line: c+= 1 else: d +=1 mi = log(((a +s)/n)/(((b+s)/n)*((c+s)/n))) bi.append((i,j,mi)) print (bi) 

Этот код дает следующий результат

 [('Difensori dei diritti umani', 'Human rights defenders', 9.747427586368971), ('Difensori dei diritti umani', 'freedom of expression', 4.054309816276213), ('libertà di espressione', 'Human rights defenders', 1.7964873912918353), ('libertà di espressione', 'freedom of expression', 3.5916971873132355)] [('sgomberi forzati', 'forced evictions', 9.971061859787796), ('sgomberi forzati', 'human rights violations', 5.278014664230184), ('violazioni dei diritti umani', 'forced evictions', 4.3759922075718447), ('violazioni dei diritti umani', 'human rights violations', 2.760410122135915)] 

Что мне нужно для каждой строки в bigram_list, если есть пары с одним и тем же первым элементом, выберите одну пару с большим значением. Пример: в следующей строке

 [('Difensori dei diritti umani', 'Human rights defenders', 4.747427586368971), ('Difensori dei diritti umani', 'freedom of expression', 4.054309816276213), ('libertà di espressione', 'Human rights defenders', 3.7964873912918353), ('libertà di espressione', 'freedom of expression', 3.5916971873132355)] 

У нас есть

 ('Difensori dei diritti umani', 'Human rights defenders', 9.747427586368971) 'Difensori dei diritti umani', 'freedom of expression', 4.054309816276213 

Поэтому мы должны выбрать первую пару, которая содержит тот же самый первый элемент («Difensori dei diritti umani») со второй парой, но имеет большое значение.

Может кто-нибудь помочь?

One Solution collect form web for “ранжирование позиций в списке терминов”

Поскольку вам нужна только пара, которая имеет тот же самый первый элемент, а также максимальное значение, вы можете создать словарь с first element качестве ключа. Вы можете перебирать список кортежей и проверять, существует ли ключ (первый элемент кортежа). Если он проверяет, превышает ли значение значение словаря в словаре и заменит, если true.

Вот код, соответствующий вашему примеру:

 temp_dict = {} for i in a: if temp_dict.has_key(i[0]): if (temp_dict[i[0]][2] < i[2]): temp_dict[i[0]] = i else: temp_dict[i[0]] = i 

Вывод после итерации по обоим спискам в вашем примере кода:

{'violazioni dei diritti umani': («violazioni dei diritti umani», «принудительные выселения», 4.375992207571844), «Difensori dei diritti umani»: («Difensori dei diritti umani», «Правозащитники», 9.747427586368971), 'sgomberi forzati ': (' sgomberi forzati ',' принудительные выселения ', 9.971061859787795),' libert \ xc3 \ xa0 di espressione ': (' libert \ xc3 \ xa0 di espressione ',' свобода выражения ', 3.5916971873132355)}

Демонстрация вашего рабочего кода

Python - лучший язык программирования в мире.