按多个条件从列表中过滤令牌

时间:2017-08-17 08:51:47

标签: python list token counter

我想通过以下条件从列表中提交一些令牌。 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 个答案:

答案 0 :(得分: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(python< 3.6或dict(python> = 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