Python的集合之间的区别.Counter和nltk.probability.FreqDist

时间:2016-01-05 03:58:27

标签: python nlp nltk

我想计算文本语料库中单词的术语频率。我已经使用NLTK的word_tokenize,然后使用probability.FreqDist一段时间来完成这项工作。 word_tokenize返回一个列表,该列表由FreqDist转换为频率分布。但是,我最近在集合(collections.Counter)中遇到了Counter函数,它似乎做了完全相同的事情。 FreqDist和Counter都有一个most_common(n)函数,它返回n个最常用的单词。有谁知道这两者之间是否存在差异?一个比另一个快吗?是否有人会工作而另一个人不会?

1 个答案:

答案 0 :(得分:8)

nltk.probability.FreqDistcollections.Counter的子类。

来自docs

  

实验结果的频率分布。一个   频率分布记录每个结果的次数   实验已经发生。例如,频率分布可以   用于记录文档中每个单词类型的频率。   形式上,频率分布可以定义为函数   从每个样本映射到样本发生的次数   作为结果。

The inheritance is explicitly shown from the code基本上,CounterFreqDist的初始化方式没有区别,请参阅https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106

因此,速度方面,创建CounterFreqDist应该是相同的。速度的差异应该是微不足道的,但值得注意的是,开销可能是:

  • 在解释器中定义类时的编译
  • 鸭子打字的费用.__init__()

主要区别在于FreqDist为统计/概率自然语言处理(NLP)提供的各种功能,例如finding hapaxesFreqDist扩展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(参见Transform a Counter object into a Pandas DataFrame)。