R でツイッターから情報を取得するパッケージは twitteR が有名だが*1, R で Streaming API へアクセスできる streamRパッケージを紹介してみたい.
streamR の概要
CRAN - Package streamR によると作者は NYU の Ph.D. candidate (現在) の Pablo Barberá という方で
Description This package provides a series of functions that allow R users to access Twitter’s filter, sample, and user streams, and to parse the output into data frames. OAuth authentication is supported.
Date/Publication 2013-01-19 08:27:32
とのこと. streaming API ということなので, twitteR と比較し,
- 長所
- 大量のツイートを取得できる
- twitteR の status オブジェクトより情報量が多い.
- 短所
- 現在進行形で投稿されてるツイートしか取得できない (遡ることができない)
- そのためニッチな条件にすると全くヒットしないということもありうる.
- 接続中は処理待ちなので暇.
- 現在進行形で投稿されてるツイートしか取得できない (遡ることができない)
という特徴がある. streaming API のパラメータ詳細については公式リファレンス を参照. status オブジェクトより多様な情報が取得できるといっても, それらは twitteR でも取得できないことはないので, 最新のツイートを取得したい時と過去のツイートを遡りたいときとで使い分ける, 程度の活用法しか自分は思いつかなかった. R-bloggers には一つだけ記事が存在するが, ぶっちゃけ twitteR でもできるような……
とりあえず使い方を紹介しておく. と言っても関数は少ししか無いが.
使用法の紹介
まずは使用可能な状態する. 下準備として認証が必要. streaming API を用いるには認証アカウントが必要で, API にアクセスする関数はその都度入力する必要がある. user
password
に直接入力してもよいが, 作者はセキュリティ上の観点から oauth を推奨している.
oauth 認証には R言語でTwitterを操作する を参考に OAuth オブジェクトを作成すること.
この OAuth オブジェクトは twitteR でも使いまわせるので保存しておくといい. 下記のコードでは, twit.oauth.RData に保存しておいたオブジェクトを使っているのでそこは適宜変更.
注意事項として, RStudio の不具合で handshake ができない ことが挙げられる. ので, 普段 RStudio を使用している人は R を直接起動して認証操作を行なったほうが良い.
2015/1/31 追記 RStudio ver 0.98 でもPINコードを入力できることを確認しましたので RStudio だけで全作業を行えます.
# rjson, RCurl が必要 library(streamR) # Oauth オブジェクトには ROAuth パッケージが必要 load(file="twit.oauth.RData")
filterStream
関数
おそらく一番用途がありそうなのがこの filterStream
. public stream にアクセスし, 条件にマッチするツイートを取得する. 出力は json 形式.
file
引数は json ファイルの保存先. 空白にするとコンソールに出力する.timeout
は接続時間. 単位は秒. デフォルトでは10800秒 (3時間)! なのでとりあえず20秒くらいにした.track
引数はキーワードでマッチさせる."hoge foo"
とすると "hoge" AND "foo" に,"hoge, foo"
だと "hoge" OR "foo" という条件になる.locations
引数は所在地でマッチさせる. これにはクセがあり, 南西端の経緯度と北東端の経緯度のベクトルを与えることで, その矩形の範囲に所在するユーザーをマッチさせる. マニュアルの用例を引用するなら,locations=c(-74,40,-73,41)
でニューヨーク市内になる. 矩形の南西端の経緯度, 矩形の北東端の経緯度 というように南が先に来る点に注意*2.user
password
引数は認証のためのものだが, 先ほどの理由で省略.oauth
引数に OAuth オブジェクトを与えることで代わりとする.
例1: 東京周辺に所在しているユーザーのツイートを取得.
cache.1 <- filterStream( file="", locations=c(139.45, 35.60, 139.8, 37.9), timeout=20, oauth=twit.oauth)
結果
Capturing tweets... Connection to Twitter stream was closed after 21 seconds with up to 20 tweets downloaded.
例2: "Ukraine" とかにしようと思ったが, 永井一郎氏の訃報を耳にしたので…
cache.2 <- filterStream(file="", track="永井一郎", timeout=20, oauth=twit.oauth)
結果:
Capturing tweets... Connection to Twitter stream was closed after 21 seconds with up to 1 tweets downloaded.
1ツイートしかヒットしなかったのでやり直し. このように, リアルタイムのツイートしか取得しないため, ホットな話題でも時間が短いとほとんど取得できない点に注意.
例2-take 2: 例2の取得時間を5分に伸ばす.
cache.2 <- filterStream(file="", track="永井一郎", timeout=300, oauth=twit.oauth)
結果
Capturing tweets... Connection to Twitter stream was closed after 301 seconds with up to 13 tweets downloaded.
使い方としては, 1時間くらい取得するRスクリプトを作って, ターミナルで繰り返し実行するように流しておくことだろうか. ツイートを取得するだけなので大して負荷はかからないから, 他の作業も並行できる.
parseTweets
関数
json 形式のままでは R で処理するのは難しいが, この parseTweets
関数は streamR の各関数で取得した json 式テキストデータをデータフレーム型に変換できる.
先ほどの json 形式 (R 上では character 型オブジェクト) を代入するだけでいい.
cache.1.df <- parseTweets(cache.1) cache.2.df <- parseTweets(cache.2) # 取得したツイート本文をいくつか表示 head(cache.df$text)
その他
sampleStream
は public stream 全体からランダムに抽出する. track, locations 等の引数は使えない.userStream
は自分の user stream を追う. track, locations 等が使える他, with 引数に "followings" を与えると followee のツイートも含める.
参照
- R言語でTwitterを操作する
- CRAN - Package streamR
- RではじめるTwitter解析
- twitteRで「カモノハシペリー」のTweet情報を集めてみよう
- Streaming API request parameters
- No surprises: More people tweet more. Visualizing twitter counts during election day.
- 第3回Twitter API勉強会 - ストリーミングAPI
*1:TwitteR の使用法については『RではじめるTwitter解析』や『twitteRで「カモノハシペリー」のTweet情報を集めてみよう』等が良い資料と思われる
*2:第3回Twitter API勉強会 - ストリーミングAPI SlideShare の説明が図入りでわかりやすいか.