Ответ 1
FreqDist
ожидает итератор токенов. Строка итерируется --- итератор выводит каждый символ.
Сначала передайте текст в токенизатор и передайте токены на FreqDist
.
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']
тогда как в примере на сайте НЛТК результатом были целые слова, а не только буквы. Я делаю это так:
file_y = open(fileurl)
p = file_y.read()
fdist = FreqDist(p)
vocab = fdist.keys()
vocab[:100]
Знаете ли вы, что я неправильно, пожалуйста? Спасибо!
FreqDist
ожидает итератор токенов. Строка итерируется --- итератор выводит каждый символ.
Сначала передайте текст в токенизатор и передайте токены на FreqDist
.
FreqDist работает с массивом токенов. Вы отправляете ему массив символов (строку), где вы должны сначала ввести токены:
words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)
NLTK FreqDist
принимает любую итерацию. Поскольку строка повторяется символ за символом, она разделяет вещи так, как вы их испытываете.
Для того, чтобы подсчитывать слова, вам нужно кормить слова FreqDist
. Как ты это делаешь? Что ж, вы можете подумать (как другие предлагали в ответе на ваш вопрос) nltk.tokenize.word_tokenize
весь файл в nltk.tokenize.word_tokenize
.
>>> # first, let 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.
Вы просто должны использовать это так:
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" и содержит частотное распределение слов.
Если вы не хотите зависеть от nltk tokenizer, вы можете просто использовать разделение строк.
sentence = "This is some text"
print(sentence.split(' '))