其他分享
首页 > 其他分享> > NLTK FreqDest对象比较

NLTK FreqDest对象比较

作者:互联网

我是Python的新手,遇到了一个使用NLTK的代码示例,如下所示(在IDLE中):

>>> letters = nltk.FreqDist('ageqwst')
>>> words = nltk.corpus.words.words()
>>> [word for word in words if nltk.FreqDist(word) <= letters]

并且生成的输出显示可以用字母字符制成的单词.

我想知道nltk.FreqDist(word)< =字母部分的工作原理. 我查了一下NLTK documentation on FreqDist,找不到满意的答案.我发现type(letters)返回nltk.probability.FreqDist类的对象,并且我想知道此对象比较在Python中是如何工作的.

Python是否还有像JAVA的compareTo这样的可重写方法?

谢谢,

解决方法:

FreqDist.__init__(samples)构造函数创建一个dict,

>键=样本
>值=样本计数(频率)

因此,在您的情况下:

nltk.FreqDist('ageqwst')
<FreqDist: 'a': 1, 'e': 1, 'g': 1, 'q': 1, 's': 1, 't': 1, 'w': 1>

然后在您的list comprehension声明中,

[word for word in words if nltk.FreqDist(word) <= letters]

它对语料库中的每个单词都执行相同的操作,因此它现在具有两个FreqDist字典,可以将其与if子句进行比较.给定运算符< =,它将寻找频率小于/等于样本中字母频率的单词.这里要注意的重要一点是小于部分.这样就可以跳过示例中不包含的单词中的字母. 因此,如果我们将运算符更改为显式,

[word for word in words if nltk.FreqDist(word) == letters]

它会返回一个空列表,因为提供的语料库中没有单词出现任何样本“ ageqwst”的单数形式.

以以下语句为例:

words = nltk.corpus.words.words()
foo = nltk.FreqDist('foo')

print [word for word in words if nltk.FreqDist(word) <= foo]
>>> ['f', 'foo', 'o', 'of', 'of']

毫不奇怪,我们也看到原始样本(‘foo’)也出现在列表中,因此,如果我们将运算符更改为显式,

print [word for word in words if nltk.FreqDist(word) == foo]
>>> ['foo']

我们得到一个唯一单词的列表,该单词的样本分布与我们的单词分布完全相同.

最后一个例子:

words = nltk.corpus.words.words()
bar = nltk.FreqDist('bar')

print [word for word in words if nltk.FreqDist(word) <= bar]
>>> ['a', 'ar', 'b', 'ba', 'bar', 'bra', 'r', 'ra', 'rab', 'a']

我们仍然看到样本(“ bar”)出现在列表中,但是,还有另外两个词具有与我们相同的样本分布,因此,如果

print [word for word in words if nltk.FreqDist(word) == bar]
>>> ['bar', 'bra', 'rab']

我们仍然得到原始样本(“ bar”)以及该样本的其他两个迭代“ bra”和“ rab”.这突显了样本顺序无关紧要的事实,这与python mapping types的行为一致.

我强烈建议您阅读NLTK Book.是的,它很长,有时是干燥的,但是它涉及到很多有关不同模块的理论和方法.因此,根据您提出问题的兴趣程度,我认为您会发现它很有见地.

标签:comparison-operators,nltk,python
来源: https://codeday.me/bug/20191122/2056104.html