为什么NLTK中的FreqDist比较不对称?即'>'和'<'表现不同

时间:2016-07-06 02:51:30

标签: python nltk

nltk.FreqDist('abc') > nltk.FreqDist('abd')

返回True

nltk.FreqDist('abd') < nltk.FreqDist('abc') 

返回False

这背后的原因是什么?这对我来说似乎有点奇怪。

1 个答案:

答案 0 :(得分:2)

我查看了FreqDist类的比较方法,发现它们都基于一种方法:__le__。这只是为了说明这意味着什么:

>>> abc = nltk.FreqDist('abc')
>>> abd = nltk.FreqDist('abd')

这两个陈述是等价的:

>>> abc < abd
False
>>> abc.__le__(abd)
False

现在,此方法的第一件事是检查第一个FreqDist的键是否是第二个键的键的子集。在您的示例中,这将始终为False,这是此方法返回的内容。

但是,>运算符会触发要运行的__gt__方法,编写该方法以返回__le__的否定。因此,结果就是True

说实话,我不知道为什么比较方法被添加到FreqDist。它的父母Counter不支持比较,我怀疑这正是因为提出一个很好的解决方案并不是微不足道的(至少可以说)。我预感到这段代码是FreqDist未从Counter继承而来的遗留物,而一些过分热心的OOP粉丝认为该类需要支持比较。我个人很难想出一个有用的情况。

如果我是你,我会在NLTK's issue tracker打开错误报告。或者,如果你有时间,只需打开公关,删除这些东西。