2015-09-30 61 views
1
import nltk 
from nltk.tokenize import word_tokenize 

txt = "finding a common place isn't commonly available among commoners place" 

fd = nltk.FreqDist() 

for w in word_tokenize(a.lower()): 
    fd[w] += 1 

我有上面的腳本,工作正常。如果我做fd['place']我得到2,如果我型我fd['common']得到1在nltk中用FreqDist匹配多個單詞

是否有可能鍵入類似fd['common*']東西(不工作),以獲得3個,可能那些比賽的名單?在三場比賽將是(common, commonly, commoners)

我假設它有事情做與regex,但不知道如何與FreqDist()

實施如果不是,是否有可能做任何其他的包?

回答

0

FreqDist只是一種字典,字典鍵只能通過完全匹配來工作。

爲了像這樣使用正則表達式,你需要做到這一點很難:迭代所有的條目,併爲匹配的單詞添加計數。當然,這需要掃描整個列表,所以如果列表很大,它會很慢,而且你需要做很多。

如果您僅在通過前綴進行匹配之後使用稱爲「前綴樹」或"trie"的數據結構。你大概可以猜出它的作用。一個簡單的解決方法是在你看到的每個單詞的每個前綴的FreqDist中記錄計數(所以不僅僅是完整的單詞)。

0

利用Ch 3.4這是我最後做

import re 

for w in fd: 
    if re.search('common', w): 
     print(w,fd[w]) 
+0

正如我在回答中寫道,因爲你必須要掃描整個詞彙爲你檢查每一個字,這是極其緩慢。 – alexis

+0

我同意你的意見。 'FreqDist'總體來說很慢,我可能會把它放在'計數器'上,這似乎跑得快得多。問題不僅在於前綴,我的例子可能已經顯示了這種方式,但我正在尋找包含該詞的所有匹配。 – Leb

+0

但你只是列舉並掃描所有的鍵。這比'FreqDist'和'Counter'之間的差異要慢得多。如果你想快速查找,你需要索引子串,或者你需要改變你的方法。 – alexis