NLTK FreqDest对象比较

时间:2014-03-13 14:45:13

标签: python nltk comparison-operators

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

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

,生成的输出显示可以使用letters中的字符生成的单词。

我想知道nltk.FreqDist(word) <= letters部分如何运作。

我查了NLTK documentation on FreqDist并找不到令人满意的答案。我发现type(letters)返回了一个nltk.probability.FreqDist类的对象,我想知道这个对象在Python中是如何工作的。

Python是否也有像JAVA compareTo那样可覆盖的方法?

谢谢,

2 个答案:

答案 0 :(得分:3)

FreqDist.__init__(samples)构造函数创建dict其中,

  • key = sample
  • value =样本的计数(频率)

所以在你的情况下:

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子句进行比较。给定运算符<=,它正在寻找频率小于/等于(duh)样本中的单词letters的单词。这里要注意的重要一点是小于的作品。这允许它跳过我们的样本不包含的单词中的字母。

因此,如果我们将运算符更改为显式,

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

它将返回一个空列表,因为所提供的语料库中没有单词出现任何样本的单词,&#39; ageqwst&#39;。

以此声明为例:

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']

这里没有任何惊喜,我们也看到原始样本(&#39; foo&#39;)也出现在列表中,所以如果我们将运算符更改为显式,

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']

我们仍然看到我们的示例(&#39; bar&#39;)出现在列表中,然而,还有另外两个单词具有与我们相同的样本分布,所以如果我们,

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

我们仍然可以获得原始样本(&#39; bar&#39;)以及另外两个样本迭代,&#39; bra&#39;和&#39; rab&#39;。这突出了样本的顺序无关紧要的事实,这与python mapping types的行为一致。

我强烈建议您通读NLTK Book。是的,它很长,是的,它有时很干,但它涉及不同模块的许多理论和方法。因此,基于您问题中的阴谋水平,我认为您会发现它具有洞察力。

答案 1 :(得分:0)

基本上我们得到一个dictionary,每个字符作为键,并且单词中该特定字母的计数(频率)作为值。如果我们有:

fdist = nltk.FreqDist('abcdefg')

我们会得到:

FreqDist({'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1,'f': 1, 'g': 1})

所以,每封信只出现一次。接下来如果我们使用:

wordlist = nltk.corpus.words.words()

我们将获得整个单词语料库与我们的示例fdist字典进行比较。现在如果写下这个List Comprehension

[w for w in wordlist if nltk.FreqDist(w) <= fdist]

我们会在字母“abcdefg”中出现不同字母组合的大量字词,每个字母的出现频率不超过字典fdist中给出的频率。输出格式为:

['a','abed','ace','ad','ade','ae','age','aged','b','ba','bac','bad','bade',...]