使用collections.Counter计算子列表中的元素

时间:2014-10-20 11:37:07

标签: python python-2.7 counter tokenize

我有一个标记化文本句子列表(youtube评论):

sample_tok = [['How', 'does', 'it', 'call', 'them', '?', '\xef\xbb\xbf'], 
              ['Thats', 'smart\xef\xbb\xbf'], 
              ... # and sooo on.....
              ['1:45', ':', 'O', '\xef\xbb\xbf']]

现在我想制作一本字典,其中包含提及它们的次数。

from collections import Counter

d = Counter()
for sent in [sample_tok]:
    for words in sent:
        d = Counter(words)

不幸的是,这只计算了最后一个子列表......

[(':', 1), ('1:45', 1), ('\xef\xbb\xbf', 1), ('O', 1)]

有没有办法让它计算所有标记化的句子?

2 个答案:

答案 0 :(得分:2)

您可以使用Counter实例的update方法。这会计算传递的值并将它们添加到计数器中。

d = Counter()
for sent in [sample_tok]:
    for words in sent:
        d.update(words)

或者您可以将旧计数器添加到旧计数器中:

d = Counter()
for sent in [sample_tok]:
    for words in sent:
        d += Counter(words)

答案 1 :(得分:2)

替换您的计数器,而不是更新它。每次在循环中生成一个新的Counter()实例,丢弃以前的副本。

将嵌套生成器表达式中的每个单词传递给Counter()

d = Counter(word for sublist in sample_tok for word in sublist)

或者,如果您需要先以某种方式处理每个子列表,请使用Counter.update()

d = Counter()
for sent in [sample_tok]:
    for words in sent:
        d.update(words)