使用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]
我哪里做错了呢?
6 个回答
23
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文档中了解更多。
33
FreqDist 是用来处理一组词语的。你现在给它的是一组字符(也就是一个字符串),但其实你应该先把输入的内容分词再给它:
words = nltk.tokenize.word_tokenize(p)
fdist = FreqDist(words)
51
FreqDist
需要一个可以遍历的东西,也就是一个包含多个元素的集合。字符串本身是可以遍历的——它会一个一个地输出每个字符。
所以,先把你的文本传给一个分词器,然后把得到的词语传给 FreqDist
。