处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图

Posted

技术标签:

【中文标题】处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图【英文标题】:Processing a large amount of tweets for exploratory data analysis such as number of unique tweets, and histogram of tweet counts per user 【发布时间】:2020-10-09 06:00:19 【问题描述】:

我在一个单独的 tweet.txt 文件(给我)中有 1400 万条推文,其中推文的整个 JSON 是 txt 文件的一行。我想获得一些基本统计数据,例如唯一推文的数量、唯一用户的数量、每条推文的转发计数直方图以及每个用户的推文直方图。后来我对也许更复杂的分析感兴趣。

我有以下代码,但速度极慢。我让它运行了一整天,它只处理了 200,000 条推文。可以以某种方式修复当前代码以便加快速度吗?目前创建一个包含 1400 万条推文的 pandas 数据框的想法对于探索性数据分析来说是一个好主意还是可行的?我目前的机器有 32GB RAM 和 12 个 CPU。如果这在这台机器上不可行,我也可以在我的大学访问shared cluster。

import pandas as pd

import json
from pprint import pprint
tweets = open('tweets.txt')

columns = ['coordinates', 'created_at', 'favorite_count', 'favorited', 'tweet_id', 'lang', 'quote_count', 'reply_count', 'retweet_count',
           'retweeted', 'text', 'timestamp_ms', 'user_id', 'user_description', 'user_followers_count', 'user_favorite_count',
           'user_following_count', 'user_friends_count', 'user_location', 'user_screenname', 'user_statuscount', 'user_profile_image', 'user_name', 'user_verified' ]

#columns =['coordinates', 'created_at']


df = pd.DataFrame()

count = 0
for line in tweets:
    count += 1
    print(count)
    #print(line)
    #print(type(line))
    tweet_obj = json.loads(line)
    #pprint(tweet_obj)
    #print(tweet_obj['id'])
    #print(tweet_obj['user']['id'])
    df = df.append('coordinates': tweet_obj['coordinates'],
                    'created_at': tweet_obj['created_at'],
                    'favorite_count': tweet_obj['favorite_count'],
                    'favorited': tweet_obj['favorited'],
                    'tweet_id': tweet_obj['id'],
                    'lang': tweet_obj['lang'],
                    'quote_count': tweet_obj['quote_count'],
                    'reply_count': tweet_obj['reply_count'],
                    'retweet_count': tweet_obj['retweet_count'],
                    'retweeted': tweet_obj['retweeted'],
                    'text': tweet_obj['text'],
                    'timestamp_ms': tweet_obj['timestamp_ms'],
                    'user_id': tweet_obj['user']['id'],
                    'user_description': tweet_obj['user']['description'],
                    'user_followers_count': tweet_obj['user']['followers_count'],
                    'user_favorite_count': tweet_obj['user']['favourites_count'],
                    'user_following': tweet_obj['user']['following'],
                    'user_friends_count': tweet_obj['user']['friends_count'],
                    'user_location': tweet_obj['user']['location'],
                    'user_screen_name': tweet_obj['user']['screen_name'],
                    'user_statuscount': tweet_obj['user']['statuses_count'],
                    'user_profile_image': tweet_obj['user']['profile_image_url'],
                    'user_name': tweet_obj['user']['name'],
                    'user_verified': tweet_obj['user']['verified']

                    , ignore_index=True)

df.to_csv('tweets.csv')

【问题讨论】:

【参考方案1】:

一个显着的速度提升是将append 字典转换为list 而不是使用df.append,然后在循环之外创建数据帧。比如:

count = 0
l_tweets = []
for line in tweets:
    count += 1
    tweet_obj = json.loads(line)
    #append to a list
    l_tweets.append('coordinates': tweet_obj['coordinates'],
                     # ... copy same as yours
                     'user_verified': tweet_obj['user']['verified']
                    )
df = pd.DataFrame(l_tweets, columns=columns)

关于你的 RAM 是否可以处理 1400 万条推文,我真的不知道。在集群上通常是的,但是关于如何处理数据取决于我认为集群的配置。

或者,如果您确保元素的顺序与列表columns 中的相同,那么list 也可以代替字典:

count = 0
l_tweets = []
for line in tweets:
    count += 1
    tweet_obj = json.loads(line)
    #append to a list
    l_tweets.append([tweet_obj['coordinates'], tweet_obj['created_at'], 
                     # ... copy just the values here in the right order
                     tweet_obj['user']['name'], tweet_obj['user']['verified']
                    ])
df = pd.DataFrame(l_tweets, columns=columns)

【讨论】:

以上是关于处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图的主要内容,如果未能解决你的问题,请参考以下文章

Twitter 流式处理脚本在推文的位置字段上抛出一个 keyerror

Huggingface 在情绪分析任务中给出 pytorch 索引错误

在 Twitter 上预测未来推文的情绪

获取推文作者对特定推文的推文回复

特定推文的 Twitter 链接的 URL

如何获取喜欢我的推文的用户列表和引用转发我的推文的用户列表?