@Timebird

Как итерировать по биграммам?

Имеются биграммы из текста, полученные следующим кодом:
token = nltk.word_tokenize(train_words)
bigrams = ngrams(token, 2)
print(list(bigrams))

Вывод (сократил):
[('Вот', 'дом'), ('дом', 'Который'), ('Который', 'построил'), ('построил', 'Джек'), ('Джек', 'А'), ('А', 'это'), ('это', 'пшеница'), ('пшеница', 'Которая'), ('Которая', 'в'), ('в', 'тёмном'), ('тёмном', 'чулане'), ('чулане', 'хранится'), ('хранится', 'В'), ('В', 'доме'), ('доме', 'Который'), ('Который', 'построил'), ('построил', 'Джек'), ('Джек', 'А'), ('А', 'это'), ('это', 'весёлая'), ('весёлая', 'птица-синица'), ('птица-синица', 'Которая'), ('Которая', 'часто'), ('часто', 'ворует'), ('ворует', 'пшеницу'), ('пшеницу', 'Которая'), ('Которая', 'в'), ..., ]

Вопрос: необходимо, допустим, банально проитерировать -- сначала вывести первую биграмму в списке, а потом первое слово первой биграммы списка. Как это сделать?
Пробую банально:
for bigram in bigrams:
    print(bigram)

Но jupyter не выводит вообще ничего. В чём же дело?
  • Вопрос задан
  • 648 просмотров
Решения вопроса 2
Winsik
@Winsik
сис.админ, недопрограммист :)
Не знаю почему, но вывод print(list(bigrams)) ломает выполнение for, если закомментить, то цикл нормально отработает, но можно ещё как то так:
lst= list(bigrams)
print(lst)
bigrams=iter(lst)
Ответ написан
adugin
@adugin Куратор тега Python
Выше уже ответили - потому что ngrams возвращает генератор, по которому можно пройтись в цикле только один раз. Можете сделать себе N независимых итераторов и экспериментировать)))
from itertools import tee
bgen1, bgen2, bgen3 = tee(ngrams(token, 2), 3)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы