Подсчитайте частоту слов ngram, используя словосочетания - PullRequest
0 голосов
/ 01 февраля 2019

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

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')

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

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

три слова после 'dracula', отсортированныйcount

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

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

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

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 01 февраля 2019

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

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" в разных позициях.Вот как выглядит 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),
 ...]
...