FreqDist与NLTK

afg*_*102 26 python nlp nltk

python中的NLTK有一个函数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]
Run Code Online (Sandbox Code Playgroud)

你知道我错了吗?谢谢!

Ale*_*vik 42

FreqDist期待一个可迭代的令牌.字符串是可迭代的 - 迭代器产生每个字符.

首先将文本传递给tokenizer,然后将标记传递给FreqDist.


Era*_*mpf 28

FreqDist在一系列令牌上运行.您正在向它发送一个字符数组(字符串),您应该首先对输入进行标记:

words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)
Run Code Online (Sandbox Code Playgroud)


Tim*_*ara 16

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)
Run Code Online (Sandbox Code Playgroud)

word_tokenize从句子构建单词模型.需要一次一个地输入每个句子.给出整段甚至文件时,它的工作相对较差.

那么该怎么办?容易,添加一个句子tokenizer!

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

要记住的一件事是,有许多方法可以标记文本.这些模块nltk.tokenize.sent_tokenizenltk.tokenize.word_tokenize简单的挑选比较干净,英文文本合理的默认值.还有其他几个选项可供选择,您可以在API文档中阅读.


Aak*_*nuj 8

你只需要像这样使用它:

import nltk
from nltk.probability import FreqDist

sentence='''This is my sentence'''
tokens = nltk.tokenize.word_tokenize(sentence)
fdist=FreqDist(tokens)
Run Code Online (Sandbox Code Playgroud)

变量fdist的类型为"class'nltk.probability.FreqDist",并包含单词的频率分布.