计算一组推文中的所有标签数量
我有一些来自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']
是一个包含多个 dict
的 list
,所以这一行:
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]