Подсчитайте частоту слов ngram, используя словосочетания

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

from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from nltk.util import ngrams
with open('dracula.txt', 'r', encoding="ISO-8859-1") as textfile:
    text_data = textfile.read().replace('\n', ' ').lower()
tokens = nltk.word_tokenize(text_data)
text = nltk.Text(tokens)
grams = nltk.ngrams(tokens, 4)
freq = Counter(grams)
freq.most_common(20)

Я не знаю, как искать строку "Дракула" в качестве слова фильтра. Я также попробовал:

text.collocations(num=100)
text.concordance('dracula')

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

(('and', 'he', 'saw', 'dracula'), 4),
(('one', 'cannot', 'see', 'dracula'), 2)

Три слова после слова "Дракула"

(('dracula', 'and', 'he', 'saw'), 4),
(('dracula', 'one', 'cannot', 'see'), 2)

Триграмма, содержащая "Дракулу" в середине, отсортированный счет

(('count', 'dracula', 'saw'), 4),
(('count', 'dracula', 'cannot'), 2)

Спасибо заранее за любую помощь.

1 ответ

Решение

Как только вы получите информацию о частоте в формате кортежа, вы можете просто отфильтровать искомое слово с помощью if заявления. Это использует синтаксис понимания списка Python:

from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from nltk.util import ngrams

with open('dracula.txt', 'r', encoding="ISO-8859-1") as textfile:
    text_data = textfile.read().replace('\n', ' ').lower()
    # pulled text from here: https://archive.org/details/draculabr00stokuoft/page/n6

tokens = nltk.word_tokenize(text_data)
text = nltk.Text(tokens)
grams = nltk.ngrams(tokens, 4)
freq = nltk.Counter(grams)

dracula_last = [item for item in freq.most_common() if item[0][3] == 'dracula']
dracula_first = [item for item in freq.most_common() if item[0][0] == 'dracula']
dracula_second = [item for item in freq.most_common() if item[0][1] == 'dracula']
# etc.

Это создает списки с "Дракулой" в разных позициях. Вот что dracula_last похоже:

[(('the', 'castle', 'of', 'dracula'), 3),
 (("'s", 'journal', '243', 'dracula'), 1),
 (('carpathian', 'moun-', '2', 'dracula'), 1),
 (('of', 'the', 'castle', 'dracula'), 1),
 (('named', 'by', 'count', 'dracula'), 1),
 (('disease', '.', 'count', 'dracula'), 1),
 ...]
Другие вопросы по тегам