计算一组推文中的所有标签数量

1 投票
1 回答
4517 浏览
提问于 2025-04-18 09:17

我有一些来自Twitter流式API的JSON数据,我想用Counter这个功能来了解这个数据集中最受欢迎的标签(hashtags)。我遇到的问题是,如何遍历那些包含多个标签的推文,而不是只提取第一个标签,忽略掉其他的标签。

问题:我该如何遍历字典中的嵌套列表,以提取推文中的所有标签,而不仅仅是第一个标签呢?

In [1]: import json

In [2]: from collections import Counter

In [3]: data = []

In [4]: for line in open('DC.json'):
   ...:     try:
   ...:         data.append(json.loads(line))
   ...:     except:
   ...:         pass
   ...:     

In [5]: hashtags = []

In [6]: for i in data:
   ...:     if 'entities' in i and len(i['entities']['hashtags']) > 0:
   ...:         hashtags.append(i['entities']['hashtags']['text'])
   ...:     else:
   ...:         pass
   ...:     
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-66d7538509f9> in <module>()
      1 for i in data:
      2     if 'entities' in i and len(i['entities']['hashtags']) > 0:
----> 3         hashtags.append(i['entities']['hashtags']['text'])
      4     else:
      5         pass

TypeError: list indices must be integers, not str

In [7]: Counter(hashtags).most_common()[:10]

举个例子,假设在i['entities']['hashtags']中有4个标签

In [12]: i[0]['entities']['hashtags']
Out[12]: 
[{u'indices': [28, 35], u'text': u'selfie'},
 {u'indices': [82, 92], u'text': u'omg'},
 {u'indices': [93, 104], u'text': u'Champ'},
 {u'indices': [105, 117], u'text': u'FIRST'}]

1 个回答

4

你说 i['entities']['hashtags'] 是一个包含多个 dictlist,所以这一行:

hashtags.append(i['entities']['hashtags']['text'])

是在用一个字符串去索引一个列表。这是没有道理的,会导致错误。我觉得你可以把这个过程分成几个步骤,首先获取所有的 'hashtag' 字典:

hashtags = []
for i in data:
    if 'entities' in i:
        hashtags.extend(i['entities']['hashtags'])

然后提取出 'text'

hashtags = [tag['text'] for tag in hashtags]

最后把它放进 Counter 里:

Counter(hashtags).most_common()[:10]

撰写回答