基于python中的正则表达式对推文类型进行分类

时间:2014-07-31 22:46:46

标签: python regex twitter

此问题的扩展: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]

2 个答案:

答案 0 :(得分:0)

有两个问题:

  1. tweet_type.append(i.append(['tweet'])) - 调用list.append()不会返回任何内容(意味着他们隐式返回无)。您将tweet_type附加到None。这是主要问题。

  2. 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