蒼を追いかけて

長文が書けるようになりたい.

全ツイート履歴からツイートの文章だけを抜き取る

昔はCSVで全ツイート履歴をくれたTwitterくんですが,JSONでしか投げてくれなくなりました.

これをPythonで扱う方法があんまり載ってなかったので記事を書きます.

扱うデータ

Twitterに全ツイート履歴くれ~って言って降ってきたzipを解凍します.

解凍した中身に,dataってディレクトリがあると思うんですが,その中のtweet.jsを使います.

これはそのままでは使えないので,tweet.jsvimなりなんなりで開いてやって,先頭にあるwindow.YTD.tweet.part0 =を消してあげるときれいなJSONになります.やったね!

JSONを読む

PythonJSONを読むのは,pandasがやりやすいです.後で使う正規表現用のライブラリと一緒にimportしてしまいます.

import pandas as pd
import re

それではJSONを読んでいきましょう.pandasのread_jsonで読めます.ここで,encoding='utf-8'としないと読んでくれません.デフォでUTF-8だった気がするんですけど……Windowsだと違うんですかね?

df = pd.read_json('tweet.js', encoding='utf-8')

ちなみに,この中身はこのようになっています.

f:id:BugP:20200523202950p:plain
キレそう

もっといい感じに読めてて欲しかったんですが,まあ仕方ないです.中身はpython標準のdict型になっているので,見た目以上にかんたんに読めます.

DataFrameの状態だとforで回すのが面倒なので,ここから先はpython標準のlistにして扱うことにします.

tweet_json = df.values.tolist()

ツイート本文のkeyはfull_textなので,ここだけ抜き出してやればいいです.

tweet_list = []
for tweet in tweet_json:
    tweet_text = tweet[0]["full_text"]
    tweet_list.append(tweet_text)

中身は以下のようになっています.(他の人のIDやRTが含まれるので加工しています.)

f:id:BugP:20200523204603p:plain

ここからまずRTを除きたいので,RT @を含む要素を除外していきましょう.この部分には,この記事を参考にしました.

tweet_list_ignored_RT = [tweet for tweet in tweet_list if 'RT @' not in tweet]

この中身は以下のようになっています.RTが取り除けていますね.

f:id:BugP:20200523205258p:plain

ツイート履歴の使いみち次第では,リプのIDやURL,改行文字を消したくなることもあると思います.その場合は,正規表現を使って消しましょう.この部分はこちらの記事を参考にしています.

replypattern = '@[\w]+ '
urlpattern1 = ' https?://[\w/:%#\$&\?\(\)~\.=\+\-]+'
urlpattern2 = 'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+'

tweet_list_only_words = []

for tweet in tweet_list_ignored_RT:
    tweet = re.sub(replypattern, '', tweet)
    tweet = re.sub(urlpattern1, '', tweet)
    tweet = re.sub(urlpattern2, '', tweet)
    tweet = re.sub('\n', ' ', tweet)
    tweet_list_only_words.append(tweet)

これで,ツイートから文章部分だけが抜き出せました.

f:id:BugP:20200523205805p:plain