подсчет частоты n-грамм в python nltk

У меня есть следующий код. Я знаю, что могу использовать функцию apply_freq_filter, чтобы отфильтровать словосочетания, которые меньше числа частот. Однако я не знаю, как получить частоты всех n-граммовых кортежей (в моем случае двухграммных) в документе, прежде чем я решу, какую частоту установить для фильтрации. Как видите, я использую класс коллокаций nltk.

import nltk
from nltk.collocations import *
line = ""
open_file = open('a_text_file','r')
for val in open_file:
    line += val
tokens = line.split()

bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(tokens)
finder.apply_freq_filter(3)
print finder.nbest(bigram_measures.pmi, 100)

person Rkz    schedule 16.01.2013    source источник
comment
Вы пробовали finder.ngram_fd.viewitems()?   -  person Suzana    schedule 17.01.2013
comment
Спасибо finder.ngram_fd.viewitems () работает!   -  person Rkz    schedule 21.01.2013


Ответы (4)


NLTK имеет свою собственную bigrams generator, а также удобную FreqDist() функцию.

f = open('a_text_file')
raw = f.read()

tokens = nltk.word_tokenize(raw)

#Create your bigrams
bgs = nltk.bigrams(tokens)

#compute frequency distribution for all the bigrams in the text
fdist = nltk.FreqDist(bgs)
for k,v in fdist.items():
    print k,v

Получив доступ к BiGrams и частотным распределениям, вы можете фильтровать их в соответствии с вашими потребностями.

Надеюсь, это поможет.

person Ram Narasimhan    schedule 19.01.2013
comment
Это оставляет меня с File "/usr/local/lib/python3.6/site-packages/nltk/util.py", line 467, in ngrams while n > 1: TypeError: '>' not supported between instances of 'str' and 'int' - person m02ph3u5; 23.11.2017

Функция finder.ngram_fd.viewitems() работает

person Rkz    schedule 21.01.2013
comment
похоже, что это устарело, но вы можете использовать finder.ngram_fd[('this', 'bigram')], чтобы получить частоту биграммы - person wordsforthewise; 12.12.2018

Я попробовал все вышеперечисленное и нашел более простое решение. NLTK поставляется с простой программой наиболее распространенных частот.

filter_sentence - мои токены слова

import nltk
from nltk.util import ngrams
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures

word_fd = nltk.FreqDist(filtered_sentence)
bigram_fd = nltk.FreqDist(nltk.bigrams(filtered_sentence))

bigram_fd.most_common()

Это должно дать результат как:

[(('working', 'hours'), 31),
 (('9', 'hours'), 14),
 (('place', 'work'), 13),
 (('reduce', 'working'), 11),
 (('improve', 'experience'), 9)]
person avinash nahar    schedule 01.11.2019

person    schedule
comment
просто вставьте отступы после 'if'; код работает, если python 3.5 - person Vahab; 08.03.2018