биграммы в словаре python - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы перебрать список:

inc_list = ['one', 'two', 'one', 'three', 'two', 'one', 'three']

и создать словарь, в котором будут показаны все биграммы соседних слов и количество их вхождений, при этом подсчитанные комбинации обратного порядка равны, поэтому обратные комбинации исключены и исключены одни и те же словосочетания. Таким образом, ..'one', 'two'.. и ..'two', 'one'.. должны оба добавить к счету ('one', 'two') в словаре.

ожидаемый результат:

{('one', 'two'): 3, ('one', 'three'): 2, ('two', 'three'): 1}

До сих пор я пробовал с:

import itertools
from collections import Counter

inc_list = ['one', 'two', 'one', 'three', 'two', 'one', 'three',]

coocurences = dict(Counter(itertools.combinations(inc_list, 2)))

print(coocurences)

Это, очевидно, учитывает все комбинации возможностей, включая и обратные, и одинаковые словосочетания, поэтому не то, что я ищу.

Есть ли в itertools инструмент, который делает что-то ближе к моему? желаемый вывод?

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

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

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

from collections import Counter

inc_list = ['one', 'two', 'one', 'three', 'two', 'one', 'three',]

bigrams = Counter()
for previous, current in zip(inc_list, inc_list[1:]):
    opt1 = (f"{previous}", f"{current}")
    opt2 = (f"{current}", f"{previous}")
    if opt2 not in bigrams:
        bigrams[opt1] += 1
        continue
    bigrams[opt2] += 1
coocurences = dict(bigrams)
print(coocurences)

вывод:

{('one', 'two'): 3, ('one', 'three'): 2, ('three', 'two'): 1}
0 голосов
/ 29 марта 2020

Спасибо за быстрый ответ и отличное предложение. Я немного изменил его, чтобы дать мне именно то, что мне нужно.

from collections import Counter

inc_list = ['one', 'two', 'one', 'three', 'two', 'one', 'three',]

bigrams = Counter()
for previous, current in zip(inc_list, inc_list[1:]):
    opt1 = f"{previous}", f"{current}"
    opt2 = f"{current}", f"{previous}"
    if opt2 not in bigrams:
        bigrams[opt1] += 1
        continue
    bigrams[opt2] += 1
coocurences = dict(bigrams)
print(coocurences)

это выдает:

{('one', 'two'): 3, ('one', 'three'): 2, ('three', 'two'): 1}

Спасибо:)

...