我想计算文本语料库中单词的术语频率。我已经使用NLTK的word_tokenize,然后使用probability.FreqDist一段时间来完成这项工作。 word_tokenize返回一个列表,该列表由FreqDist转换为频率分布。但是,我最近在集合(collections.Counter)中遇到了Counter函数,它似乎做了完全相同的事情。 FreqDist和Counter都有一个most_common(n)函数,它返回n个最常用的单词。有谁知道这两者之间是否存在差异?一个比另一个快吗?是否有人会工作而另一个人不会?
答案 0 :(得分:8)
nltk.probability.FreqDist
是collections.Counter
的子类。
来自docs:
实验结果的频率分布。一个 频率分布记录每个结果的次数 实验已经发生。例如,频率分布可以 用于记录文档中每个单词类型的频率。 形式上,频率分布可以定义为函数 从每个样本映射到样本发生的次数 作为结果。
The inheritance is explicitly shown from the code基本上,Counter
和FreqDist
的初始化方式没有区别,请参阅https://github.com/nltk/nltk/blob/develop/nltk/probability.py#L106
因此,速度方面,创建Counter
和FreqDist
应该是相同的。速度的差异应该是微不足道的,但值得注意的是,开销可能是:
.__init__()
主要区别在于FreqDist
为统计/概率自然语言处理(NLP)提供的各种功能,例如finding 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
(参见Transform a Counter object into a Pandas DataFrame)。