2014-01-22 3 views
0

Я смущен, как найти частые пары слов в файле. Сначала я получил биграммы, но как это исходит отсюда? я попытался раздевая пунктуация, используя регулярное выражение перед наклеиванием nltk.bigramsКод Python для подсчета частых пар слов в nltk

raw=open("proj.txt","r").read() 
tokens=nltk.word_tokenize(raw) 
pairs=nltk.bigrams(tokens) 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
trigram_measures = nltk.collocations.TrigramAssocMeasures() 
finder = BigramCollocationFinder.from_words(pairs) 
finder.apply_freq_filter(3) 
finder.nbest(bigram_measures.pmi, 10) 

ответ

1

Вы, кажется, называют BigramCollocationFinder без импорта. Правильный путь: nltk.collocations.BigramCollocationFinder. Таким образом, вы можете попробовать это (убедитесь, что в вашем текстовом файле есть текст!):

>>> import nltk 
>>> raw = open('test2.txt').read() 
>>> tokens = nltk.word_tokenize(raw) 
# or, to exclude punctuation, use something like the following instead of the above line: 
# >>> tokens = nltk.tokenize.RegexpTokenizer(r'\w+').tokenize(raw) 
>>> pairs = nltk.bigrams(tokens) 
>>> bigram_measures = nltk.collocations.BigramAssocMeasures() 
>>> trigram_measures = nltk.collocations.TrigramAssocMeasures() 
>>> finder = nltk.collocations.BigramCollocationFinder.from_words(pairs) # note the difference here! 
>>> finder.apply_freq_filter(3) 
>>> finder.nbest(bigram_measures.pmi, 10) # from the Old English text of Beowulf 
[(('m\xe6g', 'Higelaces'), ('Higelaces', ',')), (('bearn', 'Ecg\xfeeowes'), ('Ecg\xfeeowes', ':')), (("''", 'Beowulf'), ('Beowulf', 'ma\xfeelode')), (('helm', 'Scyldinga'), ('Scyldinga', ':')), (('ne', 'cu\xfeon'), ('cu\xfeon', ',')), ((',', '\xe6r'), ('\xe6r', 'he')), ((',', 'helm'), ('helm', 'Scyldinga')), ((',', 'bearn'), ('bearn', 'Ecg\xfeeowes')), (('Ne', 'w\xe6s'), ('w\xe6s', '\xfe\xe6t')), (('Beowulf', 'ma\xfeelode'), ('ma\xfeelode', ','))] 
+0

Спасибо, что решила одну проблему. Теперь, чтобы получить пары слов, нужно ли сначала вырезать пунктуации? или после последней строки кода «finder.nbest» он возвращает наиболее часто встречающиеся пары слов из файла – user3182194

+0

@ user3182194. Вы можете, конечно, преградить пунктуацию, если вы не хотите включать какие-либо знаки препинания. Вы можете сделать что-то такое же простое: 'tokens = nltk.tokenize.RegexpTokenizer (r '\ w +'). Tokenize (raw)'. Я обновлю ответ выше. –

+0

Я использовал его, и это устранило пунктуации. Но мой окончательный результат возвращает всего два словаря (наиболее частого по моему коду) из всего файла. Изменение значения finder.apply_freq_filter (3) до 1/2 не изменяет результат? – user3182194

0

Похоже, вам просто нужен список пар слов. Если да, то я думаю, что вы имеете в виду использовать finder.score_ngrams так:

bigram_measures = nltk.collocations.BigramAssocMeasures() 
finder = BigramCollocationFinder.from_words(tokens) 
scores = finder.score_ngrams(bigram_measures.raw_freq) 
print scores 

Есть другие показатели скоринга, которые могут быть использованы. Похоже, вы хотите только частоту, но другие показатели оценки для общих Нграм здесь - http://nltk.googlecode.com/svn-/trunk/doc/api/nltk.metrics.association.NgramAssocMeasures-class.html

+0

да, мне нужен список наиболее часто используемых пар слов. Я получил оценки каждого биграма, используя вышеупомянутый код. Как получить количество пар слов? Можно ли использовать FreqDist на bigrams, чтобы получить их частоты, а затем я могу извлечь пары слов с наибольшим счетом – user3182194

+0

Думаю, что второй блок кода в разделе nltk docs Finders - это то, что вы хотите - http: //nltk.googlecode .com/SVN/багажник/DOC/HOWTO/collocations.html # искатели – gfritz

Смежные вопросы