使用NLTK的频率分布

35 投票
6 回答
111746 浏览
提问于 2025-04-16 09:37

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_tokenizenltk.tokenize.word_tokenize只是为相对干净的英文文本选择了一个合理的默认设置。还有其他几种选择,你可以在API文档中了解更多。

33

FreqDist 是用来处理一组词语的。你现在给它的是一组字符(也就是一个字符串),但其实你应该先把输入的内容分词再给它:

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

FreqDist 需要一个可以遍历的东西,也就是一个包含多个元素的集合。字符串本身是可以遍历的——它会一个一个地输出每个字符。

所以,先把你的文本传给一个分词器,然后把得到的词语传给 FreqDist

撰写回答