我想计算一个文本语料库中单词的词频。为了完成这个任务,我已经使用了NLTK的word_tokenize,然后是probability.FreqDist。word_tokenize返回一个列表,该列表由FreqDist转换为频率分布。然而,我最近在集合中遇到了计数器函数(collections.Counter),它似乎在做完全相同的事情。FreqDist和计数器都有一个most_common(n)函数,它返回n个最常见的单词。有人知道这两者之间有什么区别吗?一个比另一个快吗?是否有这样的情况:一种会起作用,而另一种则不会?
发布于 2016-01-05 07:52:39
nltk.probability.FreqDist是collections.Counter的子类。
来自文档
实验结果的频率分布。频率分布记录每个实验结果发生的次数。例如,频率分布可用于记录文档中每个字类型的频率。形式上,频率分布可以定义为从每个样本到采样作为结果发生的次数的函数映射。
继承将从代码中显式显示。和本质上,在初始化Counter和FreqDist方面没有区别,参见https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106
因此,就速度而言,创建Counter和FreqDist应该是相同的.速度上的差异应该是微不足道的,但值得注意的是,间接费用可能是:
.__init__()的成本主要区别在于FreqDist为统计/概率自然语言处理提供的各种功能,例如寻找触觉。FreqDist扩展Counter的函数的完整列表如下:
>>> from collections import Counter
>>> from nltk import FreqDist
>>> x = FreqDist()
>>> y = Counter()
>>> set(dir(x)).difference(set(dir(y)))
set(['plot', 'hapaxes', '_cumulative_frequencies', 'r_Nr', 'pprint', 'N', 'unicode_repr', 'B', 'tabulate', 'pformat', 'max', 'Nr', 'freq', '__unicode__'])当涉及到使用FreqDist.most_common()时,它实际上使用的是来自Counter的父函数,因此对于这两种类型,检索排序的most_common列表的速度是相同的。
就我个人而言,当我只想检索计数时,我使用collections.Counter。但是,当我需要做一些统计操作时,我要么使用nltk.FreqDist,要么将Counter转储到pandas.DataFrame中(参见将计数器对象转换为Pandas)。
https://stackoverflow.com/questions/34603922
复制相似问题