一尘不染

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

python

我想计算文本语料库中单词的词频。我一直在使用NLTK的word_tokenize,然后使用概率。FreqDist完成此操作。word_tokenize返回一个列表,该列表由FreqDist转换为频率分布。但是,我最近在集合中遇到了Counter函数(collections.Counter),这似乎在做同样的事情。FreqDist和Counter都具有most_common(n)函数,该函数返回n个最常见的单词。有谁知道这两者之间是否有区别?一个比另一个快吗?是否存在其中一种可行而另一种无效的情况?


阅读 218

收藏
2020-12-20

共1个答案

一尘不染

nltk.probability.FreqDist是的子类collections.Counter

文档

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

继承是从代码中显式显示的,从本质上讲,在CounterFreqDist初始化方式方面没有区别,请参见https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106

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

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

主要区别在于FreqDist提供统计/概率自然语言处理(NLP)的各种功能,例如查找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(请参见将Counter对象转换为Pandas
DataFrame
)。

2020-12-20