FreqDist с NLTK - PullRequest
       3

FreqDist с NLTK

24 голосов
/ 08 января 2011

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', '-', 'N', 'S', '1', 'A', 'G', 'P', 'T', 'W', '[', ']', '(', ')', '0', '7', 'E', 'J', 'O', 'R', 'j', 'x']

, тогда как в примере на сайте NLTK результатом были целые слова, а не только буквы. Я делаю это так:

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

Знаете ли вы, что я неправильно, пожалуйста? Спасибо!

Ответы [ 4 ]

39 голосов
/ 08 января 2011

FreqDist ожидает повторяющиеся токены. Строка является итеративной - итератор возвращает каждый символ.

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

24 голосов
/ 28 июня 2011

FreqDist работает на массиве токенов. Вы отправляете ему массив символов (строку), где вы должны были сначала ввести токены:

words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)
14 голосов
/ 08 января 2011

NLTK 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 .

6 голосов
/ 08 августа 2013

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

import nltk
from nltk.probability import FreqDist

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

Переменная fdist имеет тип "class 'nltk.probability.FreqDist" и содержит частотное распределение слов.

...