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

2023-12-25

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


nltk.probability.FreqDist是一个子类collections.Counter.

来自docs https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L61:

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

从代码中可以清楚地看出继承关系 https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L61本质上,在如何Counter and FreqDist已初始化,请参阅https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106 https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106

所以从速度上来说,创建一个Counter and FreqDist应该是一样的。速度差异应该微不足道,但值得注意的是,开销可能是:

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

主要区别在于不同的功能FreqDist提供统计/概率自然语言处理(NLP),例如寻找半轴 https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L130。完整的函数列表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 into a pandas.DataFrame (see 将 Counter 对象转换为 Pandas DataFrame https://stackoverflow.com/questions/31111032/transform-a-counter-object-into-a-pandas-dataframe).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python的collections.Counter和nltk.probability.FreqDist之间的区别 的相关文章

随机推荐