全ツイート履歴からツイートの文章だけを抜き取る
昔はCSVで全ツイート履歴をくれたTwitterくんですが,JSONでしか投げてくれなくなりました.
これをPythonで扱う方法があんまり載ってなかったので記事を書きます.
扱うデータ
Twitterに全ツイート履歴くれ~って言って降ってきたzipを解凍します.
解凍した中身に,data
ってディレクトリがあると思うんですが,その中のtweet.js
を使います.
これはそのままでは使えないので,tweet.js
をvimなりなんなりで開いてやって,先頭にあるwindow.YTD.tweet.part0 =
を消してあげるときれいなJSONになります.やったね!
JSONを読む
PythonでJSONを読むのは,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')
ちなみに,この中身はこのようになっています.
もっといい感じに読めてて欲しかったんですが,まあ仕方ないです.中身は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が含まれるので加工しています.)
ここからまずRTを除きたいので,RT @
を含む要素を除外していきましょう.この部分には,この記事を参考にしました.
tweet_list_ignored_RT = [tweet for tweet in tweet_list if 'RT @' not in tweet]
この中身は以下のようになっています.RTが取り除けていますね.
ツイート履歴の使いみち次第では,リプの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)
これで,ツイートから文章部分だけが抜き出せました.