2011-01-08 6 views
19

NLTK в python имеет функцию FreqDist, которая дает вам частоту слов в тексте. Я пытаюсь передать свой текст в качестве аргумента, но результат имеет вид: ['', 'e', ​​'a', 'o', 'n', 'i', 't', 'r', 's', 'l', 'd', 'h', 'c', 'y', 'b', 'u', 'g', '\ n', 'm', 'p', ' w ',' f ',', ',' v ','. ',' '', 'k', 'B', '' ',' M ',' H ',' 9 ',' C ' , '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ') ',' 0 ',' 7 ',' E ',' J ',' O ',' R ',' j ',' x '], тогда как в примере на веб-сайте NLTK результатом были целые слова не только буквы Im делают это следующим образом:.FreqDist с NLTK

file_y = open(fileurl) 
p = file_y.read() 
fdist = FreqDist(p) 
vocab = fdist.keys() 
vocab[:100] 

вы знаете, что у меня есть неправильные PLS Спасибо

+0

Пожалуйста, добавьте ссылку на пример. –

+0

NB, лучше идиома Python: 'open (fileurl) как file_y: ...' или 'для строки в open (файл url):' – smci

ответ

32

FreqDist ожидает Iterable маркеров строки является итерацией --- итератор дает каждый символ?!..

Сначала передайте текст в токенизатор и передайте токены на FreqDist.

+0

Действительно, но в docstring не говорится, что * где угодно *, а также его сообщения об ошибках, и было бы тривиально для его '__init __()' либо поднять сообщение об ошибке, сообщающее об этом на входе без итератора, либо принять последовательность и преобразовать ее в итератор. – smci

+1

@ afg102 Если это сработало, пожалуйста, примите ответ, чтобы другие также знали, что является решением проблемы. – rishi

12

NLTK's FreqDist принимает любые итерации. Поскольку строка является итерированным символом по характеру, она раздвигает вещи так, как вы испытываете.

Чтобы сделать подсчет слов, необходимо передать FreqDist слов. Как ты это делаешь? Ну, вы можете подумать (как другие предложили в ответе на ваш вопрос), чтобы подать весь файл на nltk.tokenize.word_tokenize.

>>> # first, let's import the dependencies 
>>> import nltk 
>>> from nltk.probability import FreqDist 

>>> # wrong :(
>>> words = nltk.tokenize.word_tokenize(p) 
>>> fdist = FreqDist(words) 

word_tokenize строит слова из предложений. Ему нужно кормить каждое предложение по одному за раз. Он будет выполнять относительно плохую работу, когда ему будут предоставлены целые абзацы или даже документы.

Итак, что делать? Легко, добавьте в токенизатор предложения!

>>> fdist = FreqDist() 
>>> for sentence in nltk.tokenize.sent_tokenize(p): 
...  for word in nltk.tokenize.word_tokenize(sentence): 
>>>   fdist[word] += 1 

Одно дело иметь в виду, что существует много способов токенизировать текст. Модули nltk.tokenize.sent_tokenize и nltk.tokenize.word_tokenize просто выбирают разумный по умолчанию для относительно чистого текста на английском языке. Есть несколько других вариантов выбора, о которых вы можете прочитать в файле API documentation.

+0

OP не хочет буквенных частот! (никто другой не делает ...) Они хотят частоты слов. – smci

+0

На самом деле, частоты букв являются очень распространенными функциями автоматического распознавания языков. –

+0

Правда, для этой ниши. Также расшифровка. Вообще не так много. – smci

18

FreqDist работает на множестве жетонов. Вы посылаете это массив символов (строка), где вы должны иметь вход разбиваются на лексемы первым:

words = nltk.tokenize.word_tokenize(p) 
fdist = FreqDist(words) 
4

Вы должны просто использовать его как это:

import nltk 
from nltk import FreqDist 

sentence='''This is my sentence''' 
tokens = nltk.word_tokenize(sentence) 
fdist=FreqDist(tokens) 

Переменная FDIST является типа «class» nltk.probability.FreqDist »и содержит частотное распределение слов.

0

Если вы не хотите зависеть от токенизатора nltk, вы можете просто использовать разделение строк.

sentence = "This is some text" 
print(sentence.split(' ')) 

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

  • Нет связанных вопросов^_^