Pythonを使ってTwitterのタイムラインを収集する
「実践 機械学習システム」の第六章ではTwitterのタイムラインを使った感情分析を行っています。ただし英語のTweetを対象としているので、(たぶん)*1サンプルコードを実行してもあまり面白くはないのです。できることなら日本語でやりたい、というわけで自分のタイムラインからTweetを収集してみましょう。実行環境はPython3系を想定してますが、2系でも動くはずです。
基本的には↓のやり方を踏襲します。
必要なものは以下
Twitter APIの認証キーを取得する
Twitterのアプリケーションマネジメントサイトに行ってアプリケーションの登録を行います。
"Create New App"から必要事項を入力していくと特に問題なく登録できるはず。最近は電話番号の登録を迫られるみたいです。営業電話でもかかってくるんだろうか。。
登録が完了したら"Consumer Key (API Key)"の欄にある"manage keys and access tokens"のリンクから先に進み、以下の4種類のキーを取得します。
これはコピペでどっかわかるところに保管しておきます。
Pythonライブラリの取得
pip使って導入。
pip3 install requests_oauthlib pip3 install pandas
タイムラインの収集
Twitter APIでタイムラインを取得しますが、一度に取得できるTweet数の上限とAPI制限があるのでその辺と上手く付き合います。取得Tweetの上限が100件、API制限が15分に15回までとのこと。
分類器作る場合には10,000件ほどのTweetが欲しいので、パラメータで100件とってくるよう指定して、数分ごとに再取得を繰り返すようにしておきます。
CK、CS、AT、ASには先ほどコピペしたConsumer Key (API Key)、Consumer Secret (API Secret)、Access Token、Access Token Secretをそれぞれ入れておきます。
from requests_oauthlib import OAuth1Session import json import time CK = 'XXXXXXXXXXXXXXXXXXXXXX' CS = 'XXXXXXXXXXXXXXXXXXXXXX' AT = 'XXXXXXXXXXXXXXXXXXXXXX' AS = 'XXXXXXXXXXXXXXXXXXXXXX' url = "https://api.twitter.com/1.1/statuses/home_timeline.json" params = {'count': 100} TweetList = [] twitter = OAuth1Session(CK, CS, AT, AS) for i in range(100): req = twitter.get(url, params = params) if req.status_code == 200: timeline = json.loads(req.text) for tweet in timeline: TweetList.append(tweet["text"]) else: print ("Error: %d" % req.status_code) time.sleep(240)
4分もあればタイムラインが一巡しそうだったので、timeモジュールを使って240秒ごとに回るように指定をかけています。これを7時間ほど置いとくとTweetListにタイムラインが格納されていきます。
CSVで吐き出す
とってきたタイムラインをテキストデータとして加工したいので、Pandasを使ってデータフレームに落とし込み、それをCSVとして吐き出します。他にもやり方はありますが、型やエンコードで嵌らないのでPandasがおすすめです。
import pandas as pd df = pd.DataFrame(TweetList) df.to_csv('hogehoge.csv')
これで教師用データの収集はできたはず。後は発言にネガティブ/ポジティブ/そのほかのラベル貼りをやらないと。その辺は別枠で。
追記
Tweetは200件まで取れました。教えていただいてありがとうございます!
@Takaki_ Twitterの取得制限について、15分に何回APIが叩けるかはここですね。https://t.co/AEG08RJV2J
— まぽよん@しばらくポケモン勢 (@mapoyon) May 8, 2016
一度に取得出来る量については200件まで取れそうですけどダメでしたか?https://t.co/niDEazahLR
*1:実際に動かしてないのでホントのところは不明