2017-08-17 70 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。这只是你玩转技巧。您仍然可以以正常字典的形式访问它。 –