【问题标题】:Filtering tokens from a list by multiple conditions按多个条件从列表中过滤标记
【发布时间】:2017-08-17 08:51:46
【问题描述】:

我想通过以下条件从列表中筛选出一些令牌。 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()”命令背后的机制。

如果有人能就此启发我,将不胜感激。

谢谢。

【问题讨论】:

  • 从字面上看,the Counter documentation 中的第一句话告诉你如何使用它们:“A Counter is a dict subclass”。如果要使用类或函数,最好先阅读其文档。

标签: python list token counter


【解决方案1】:

有人说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 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

【讨论】:

  • 因为根据我之前的尝试,Counter() 返回这种形式的输出 '[('token1', freq1), ('token2, freq2)]'。因此,我使用 Counter().item[2] 来访问“频率”。
  • @ChrisT。那只是代表对你耍花招。您仍然可以作为普通字典访问它。
  • @ChrisT。另外,您的意思是过滤set(token_list) 吗?这样,您可以获得重复项
  • 哦停,为什么你需要在这里使用慢速过滤器而不是生成器?
  • @Reishin 因为 OP 在他的帖子中说 filter。 :p 将添加替代解决方案,请稍等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多