2017-08-17 50 views
0

我想通過以下條件從列表中過濾出一些令牌。 1)令牌長度大於5 2)出現的頻率(在原文)超過100通過多個條件從列表中過濾令牌

我用下面的代碼

#token_list is a list object containing tokenized words from raw text 

from collections import Counter 
c = Counter(token_list) 
selected_tokens = [word for word in token_list if len(word) > 5 and c.item[2] > 100] 

selected_tokens 

,但似乎無法得到它。我相信錯誤來自'c.item [2]',但不太瞭解'Counter()'命令背後的機制。

如果有人能夠啓發我,我會非常感激。

謝謝。

+1

字面上[Counter'documentation](https://docs.python.org/3/library/collections.html#collections.Counter)中的第一句告訴你如何工作與他們:「計數器是一個字典的子類」,如果你打算使用一個類或函數,你最好先閱讀它的文檔。 –

回答

2

有人說filter

selected_tokens = list(filter(lambda x: len(x) > 5 and c[x] > 100, token_list)) 

此外,您使用c[...]訪問計數器計數。此外,您可能希望對案件問題保持警惕(在不同情況下出現相同的單詞)。


如果你想要的速度,使用列表理解來代替:

selected_tokens = [x for x in token_list if len(x) > 5 and c[x] > 100] 

如果你正在尋找獲得滿足於set,而不是一組你的病情沒有不必要的重複,工作字:

token_set = set(token_list) 
selected_tokens = [x for x in token_set if if len(x) > 5 and c[x] > 100] 

當心,訂單已丟失。如果你想爲了不重複,使用OrderedDict(蟒蛇< 3.6或dict(蟒蛇> = 3.6)。

dict_ = OrderedDict() 
for t in token_list: 
    dict_[t] = None 

selected_tokens = [x for x in dict_ if len(x) > 5 and c[x] > 100] 

如果dict不這樣做,你可以看看OrderedSet配方和實施的東西相同的效果:

token_set = OrderedSet(token_list) 
selected_tokens = [x for x in token_set if ...] # as usual 
+0

@Rawing啊,謝謝你,先生。 –

+0

因爲從我以前的嘗試,Counter()返回此形式'[('token1',freq1),('token2,freq2)]'的輸出。因此,我使用Counter()。item [2]來訪問'頻率'。 –

+0

@ChrisT。這只是你玩轉技巧。您仍然可以以正常字典的形式訪問它。 –