ill-identified diary

所属組織の見解などとは一切関係なく小難しい話しかしません

[R] [Twitter] streamR パッケージで Twitter Streaming API にアクセスしてみた

この記事は最終更新日から3年以上が経過しています

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 のツイートも含める.

参照

*1:TwitteR の使用法については『RではじめるTwitter解析』や『twitteRで「カモノハシペリー」のTweet情報を集めてみよう』等が良い資料と思われる

*2:第3回Twitter API勉強会 - ストリーミングAPI SlideShare の説明が図入りでわかりやすいか.