此问题的扩展:Classify type of tweet (tweet/retweet/mention) based on tweet text in Python
我想将我的数据集中的每条推文分类为以下之一,并将推文类型附加到数据集中的每条记录。目前,当我运行下面显示的脚本时,我得到[None]
返回,显然我在这里遗漏了一些东西。
当前格式:
['CREATED_AT']['text']
所需格式:
['CREATED_AT']['text']['tweet_type']
推文分类:
(1)转发 - >在推文文本栏中的某处有一个“RT @anyusername”
(2)提及 - >在推文列中有一个“@anyusername”但没有“RT @anyusername”
(3)Tweet - >推文栏中没有“RT @anyusername”或任何“@anyusername”
代码:
import json
import time
import re
# load Twitter Streaming JSON data into a dict
def import_tweets(parameter1):
data = []
for line in open(parameter1):
try:
data.append(json.loads(line))
except:
pass
for i in data:
i['CREATED_AT'] = time.strftime('%Y-%m-%d %H:%M:%S',time.strptime(i['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
return data
# Extract timestamp and tweet text into a list
def extract_tweets(parameter2):
tweets = []
for i in parameter2:
tweets.append(
[i['CREATED_AT'],
i['text']]
)
return tweets
# Classify each tweet as retweet/mention/tweet
def tweet_type(parameter3):
tweet_type = []
for i in parameter3:
match = re.match(r'RT\s@....+', i[1])
if match:
tweet_type.append([i, 'retweet'])
else:
match = re.match(r'@....+', i[1])
if match:
tweet_type.append([i, 'reply'])
else:
match = re.match(r'....+@', i[1])
if match:
tweet_type.append([i, 'mention'])
else:
tweet_type.append([i, 'tweet'])
return tweet_type
data = import_tweets('tweets.json')
tweets = extract_tweets(data)
tweet_type = tweet_type(tweets)
# Print sample to make sure tweet text was classified properly
print tweet_type[:5]
答案 0 :(得分:0)
有两个问题:
tweet_type.append(i.append(['tweet']))
- 调用list.append()
不会返回任何内容(意味着他们隐式返回无)。您将tweet_type附加到None。这是主要问题。
return tweet_type
向右缩进太多 - 循环在第一次迭代时退出函数。
答案 1 :(得分:0)
import json
import time
import re
def import_tweets(parameter1):
"""
Loads data from Twitter Streaming API for analysis.
Args:
parameter1: input file
Returns:
List of nested dictionaries
"""
# load JSON data into a dict
data = []
for line in open(parameter1):
try:
data.append(json.loads(line))
except:
pass
# Transform Twitter tweet date/time format into standard date/time format
for i in data:
i['CREATED_AT'] = time.strftime('%Y-%m-%d %H:%M:%S',time.strptime(i['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
# Classify each tweet as a retweet/reply/mention/tweet
for i in data:
match = re.match(r'RT\s@....+', i['text'])
if match:
i['TYPE'] = 'retweet'
else:
match = re.match(r'@....+', i['text'])
if match:
i['TYPE'] = 'reply'
else:
match = re.match(r'....+@', i['text'])
if match:
i['TYPE'] = 'mention'
else:
i['TYPE'] = 'tweet'
return data