我想计算文本语料库中单词的术语 - 频率.我一直在使用NLTK的word_tokenize,然后是probability.FreqDist一段时间才能完成.word_tokenize返回一个列表,该列表由FreqDist转换为频率分布.但是,我最近在集合(collections.Counter)中遇到了Counter函数,它似乎做了完全相同的事情.FreqDist和Counter都有一个most_common(n)函数,它返回n个最常用的单词.有谁知道这两者之间是否存在差异?一个比另一个快吗?是否存在可以工作而另一个不工作的情况?
nltk.probability.FreqDist
是.的子类collections.Counter
.
来自文档:
实验结果的频率分布.频率分布记录实验的每个结果发生的次数.例如,频率分布可用于记录文档中每个单词类型的频率.形式上,频率分布可以定义为从每个样本映射到样本作为结果发生的次数的函数.
继承是从代码中明确显示的,基本上,a Counter
和a FreqDist
的初始化没有区别,请参阅https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106
所以速度快,创造一个Counter
并且FreqDist
应该是一样的.速度的差异应该是微不足道的,但值得注意的是,开销可能是:
在解释器中定义类时的类的编译
鸭子打字的成本 .__init__()
主要区别在于FreqDist
提供统计/概率自然语言处理(NLP)的各种功能,例如查找hapaxes.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 DataFrame).