FreqDist与NLTK

时间:2011-01-08 16:12:47

标签: 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]

你知道我错了吗?谢谢!

6 个答案:

答案 0 :(得分:39)

FreqDist期望一个可迭代的标记。字符串是可迭代的 - 迭代器产生每个字符。

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

答案 1 :(得分:23)

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

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

答案 2 :(得分:14)

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 documentation中阅读。

答案 3 :(得分:6)

你只需要像这样使用它:

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”,包含单词的频率分布。

答案 4 :(得分:1)

Your_string = "here is my string"
tokens = Your_string.split()

执行此操作,然后使用 NLTK 函数

它将以单词而不是字符的形式提供令牌

答案 5 :(得分:0)

text_dist = nltk.FreqDist(word for word in list(text) if word.isalpha())
top1_text1 = text_dist.max()
maxfreq = top1_text1