2014-03-13 70 views
2

我新的Python和我使用NLTK如下(在IDLE)碰到一個代碼示例:NLTK FreqDest對象比較

>>> 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這樣的可覆蓋的方法?

感謝,

+1

我認爲您的問題的第二部分由http://www.rafekettler.com/magicmethods.html#comparisons – jonrsharpe

回答

2

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] 
    

    因爲有在所提供的語料庫沒有的話有任何樣品的奇異發生它會返回一個空列表,「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'] 
    

    沒有意外在這裏,我們也看到了原始樣本(「富」)出現在列表中,因此,如果我們改變我們的運營商要明確,

    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')加上樣本'bra'和'rab'的另外兩個迭代。這突出樣品的順序無關緊要這與蟒蛇mapping types的行爲是一致的。

    我會強烈建議您通過閱讀NLTK Book。是的,它很長,是的,它有時會變幹,但它涉及到不同模塊的很多理論和方法。所以根據你問題中的陰謀水平,我認爲你會發現它具有洞察力。

  • 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',...]