Python 带NLTK的FreqDist

Python 带NLTK的FreqDist,python,nlp,nltk,Python,Nlp,Nltk,python中的NLTK有一个函数,可以提供文本中单词的频率。我试图将我的文本作为参数传递,但结果如下: 而在NLTK网站的例子中,结果是完整的单词,而不仅仅是字母。我是这样做的: file_y = open(fileurl) p = file_y.read() fdist = FreqDist(p) vocab = fdist.keys() vocab[:100] 你知道我做错了什么吗?谢谢!frekdist需要一个iterable标记。字符串是iterable的——迭代器产生每个字符 首

python中的NLTK有一个函数,可以提供文本中单词的频率。我试图将我的文本作为参数传递,但结果如下:

而在NLTK网站的例子中,结果是完整的单词,而不仅仅是字母。我是这样做的:

file_y = open(fileurl)
p = file_y.read()
fdist = FreqDist(p)
vocab = fdist.keys()
vocab[:100]

你知道我做错了什么吗?谢谢!

frekdist
需要一个iterable标记。字符串是iterable的——迭代器产生每个字符


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

NLTK的
FreqDist
接受任何iterable。由于字符串是逐字符迭代的,因此它会以您所经历的方式将内容分开

为了计算单词,您需要输入
FreqDist
单词。您是如何做到的?您可能会想(正如其他人在回答您的问题时所建议的那样)将整个文件输入
nltk.tokenize.word\u 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\u 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\u tokenize
nltk.tokenize.word\u tokenize
只需为相对干净的英文文本选择一个合理的默认值。还有几个其他选项可供选择,您可以在令牌数组。您将向其发送一个字符数组(字符串),其中您应该首先对输入进行令牌化:

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

您只需像这样使用它:

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

Your_string = "here is my string"
tokens = Your_string.split()
这样做,然后使用NLTK功能


它将以文字而不是字符的形式给出您的标记

请添加到示例的链接。注意,更好的Python习惯用法是:
将open(fileurl)作为file_y:…
作为open中的行(fileurl):
OP不需要字母频率!(没有其他人这样做了…)他们想要词频。事实上,字母频率是自动语言检测的常见功能。没错,对于那个小生境来说。还有解密。虽然一般来说不太多。真正有用的答案,但似乎有点过时:
AttributeError:'frekdist'对象没有属性“inc”
。不是抱怨,只是把它扔出去没有其他人知道这一点。我将尝试找出答案;)谢谢,在过去5年中,一些内部NLTK API的情况发生了相当大的变化!将更新代码:)确实如此,但它的docstring在任何地方都没有说这一点,也没有错误消息,而且它的
\uuuu init\uuuuuu()
在非迭代器输入时发出这样的错误消息,或者接受一个序列并将其转换为迭代器。@afg102如果有效,请接受答案,以便其他人也知道问题的解决方案。虽然此代码可以回答问题,但最好在不介绍的情况下解释它是如何解决问题的其他人和为什么要使用它。从长远来看,纯代码的答案是没有用的。
text_dist = nltk.FreqDist(word for word in list(text) if word.isalpha())
top1_text1 = text_dist.max()
maxfreq = top1_text1