Количество кортежей Python в списке

Есть ли способ подсчитать, сколько раз каждый кортеж встречается в этом списке токенов?

Я пробовал метод count, но он не работает.

Это список:

['hello', 'how', 'are', 'you', 'doing', 'today', 'are', 'you', 'okay']

Это кортежи на основе списка:

('hello', 'how')
('how', 'are')
('are','you')
('you', 'doing')
('doing', 'today')
('today', 'are')
('you', 'okay')

Я хочу, чтобы результат был примерно таким

('hello', 'how')1
('how', 'are')1
('are','you')2
('you', 'doing')1
('doing', 'today')1
('today', 'are')1
('you', 'okay')1

person MyTivoli    schedule 05.04.2017    source источник
comment
Как насчет использования Counter?   -  person Willem Van Onsem    schedule 05.04.2017
comment
Должны ли токены быть рядом друг с другом в списке, чтобы соответствовать кортежу?   -  person Andria    schedule 05.04.2017
comment
@chbchb55: это более или менее идея n-граммы.   -  person Willem Van Onsem    schedule 05.04.2017
comment
Спасибо! Я новичок в этом, но если я хочу использовать n-граммы в качестве словаря, где каждый из них указан один раз, а затем проверить, сколько раз каждый из них встречается во многих разных списках, есть ли способ сделать это?   -  person MyTivoli    schedule 05.04.2017


Ответы (2)


Вы можете легко использовать Counter для этого. Общая функция для подсчета n-граммов выглядит следующим образом:

from collections import Counter
from itertools import islice

def count_ngrams(iterable,n=2):
    return Counter(zip(*[islice(iterable,i,None) for i in range(n)]))

Это генерирует:

>>> count_ngrams(['hello', 'how', 'are', 'you', 'doing', 'today', 'are', 'you', 'okay'],2)
Counter({('are', 'you'): 2, ('doing', 'today'): 1, ('you', 'doing'): 1, ('you', 'okay'): 1, ('today', 'are'): 1, ('how', 'are'): 1, ('hello', 'how'): 1})
>>> count_ngrams(['hello', 'how', 'are', 'you', 'doing', 'today', 'are', 'you', 'okay'],3)
Counter({('are', 'you', 'okay'): 1, ('you', 'doing', 'today'): 1, ('are', 'you', 'doing'): 1, ('today', 'are', 'you'): 1, ('how', 'are', 'you'): 1, ('doing', 'today', 'are'): 1, ('hello', 'how', 'are'): 1})
>>> count_ngrams(['hello', 'how', 'are', 'you', 'doing', 'today', 'are', 'you', 'okay'],4)
Counter({('doing', 'today', 'are', 'you'): 1, ('today', 'are', 'you', 'okay'): 1, ('are', 'you', 'doing', 'today'): 1, ('how', 'are', 'you', 'doing'): 1, ('you', 'doing', 'today', 'are'): 1, ('hello', 'how', 'are', 'you'): 1})
person Willem Van Onsem    schedule 05.04.2017

Для этого решения требуется сторонний модуль (iteration_utilities.Iterable), но должен делать то, что вы хотите:

>>> from iteration_utilities import Iterable

>>> l = ['hello', 'how', 'are', 'you', 'doing', 'today', 'are', 'you', 'okay']

>>> Iterable(l).successive(2).as_counter()
Counter({('are', 'you'): 2,
         ('doing', 'today'): 1,
         ('hello', 'how'): 1,
         ('how', 'are'): 1,
         ('today', 'are'): 1,
         ('you', 'doing'): 1,
         ('you', 'okay'): 1})
person MSeifert    schedule 05.04.2017
comment
Благодарю вас! Знаете ли вы, что мне делать, если я хочу использовать n-граммы в качестве словаря, а затем проверять этот словарь по множеству списков? - person MyTivoli; 05.04.2017
comment
Не уверен, что вы имеете в виду. Может быть, это может потребовать другого вопроса, где вы можете более четко объяснить, что вам нужно. - person MSeifert; 05.04.2017