我是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
那样可覆盖的方法?
谢谢,
答案 0 :(得分:3)
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
子句进行比较。给定运算符<=
,它正在寻找频率小于/等于(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',...]