【问题标题】:Difference between Python's collections.Counter and nltk.probability.FreqDistPython 的 collections.Counter 和 nltk.probability.FreqDist 的区别
【发布时间】:2016-04-08 19:40:10
【问题描述】:

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

【问题讨论】:

  • 您可以使用timeit 在大型语料库上测试速度(?)。 collections.counter 只会给你每个单词的总数,而不是频率分布。尝试一下,看看它是否适合您的需求。

标签: python nlp nltk


【解决方案1】:

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)。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2012-06-14
    • 1970-01-01
    • 2012-05-05
    • 2021-10-04
    • 2018-02-12
    • 2017-09-25
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多