Twitterからつぶやきを取得する。
「エコノミスト誌(6/4号;使える統計学)」で特集を組んだ「Twitterのつぶやきから景気動向指数を推定する」についてだが、第一ステップの簡単な絵を書くと、以下のようになる。
NTTデータさんが、Twitterの全データの取得権を持っている(これは、「権利を買える」という意味なのだろうか)ということで、TwitterのAPIを経由して、分散処理環境に「つぶやき」を取得してモデリングする。
特集記事では、分散処理にhadoopを使ったとは記載していないが、Hadoopをつかった、もしくは、Hadoop上で稼働するソフトウェアを利用したと仮定するのが(現時点では)適当だろう。
今回は、TwitterからTweetを取得するプログラムサンプルを作成してみる。
開発言語は、hadoopと同じJavaとした。Tweetを取得するには、簡便なTwitter4Jを使った。
ただし、1回の実行で1500件までしか取得できない。
作成にあたっては、以下のサイトを参考にさせていただいた。
TechBooster; TwitterでOAuth認証を行う(1:Twitterへのアプリケーション登録)
Twitter4JでTweetを収集してみる
開発は、MacBook Pro(OSX Lion)、Eclipse (Juno) JavaEEで行った。
Twitter4Jのダウンロード
Twitter4Jの本家サイトから、witter4j-3.0.3.zipをダウンロードする。
解凍したtwitter4j-3.0.3を、~/に移動し、twitter4jというシンボリックリンクを張る。
MacBook-Pro:~ tetsuya$ mv ./Downloads/twitter4j-3.0.3 . MacBook-Pro:~ tetsuya$ ln -s ./twitter4j-3.0.3/ twitter4j
サンプルプロジェクトの作成
Eclipseでサンプルプロジェクトを作成する。ここではtwittersampleとした。プロジェクトを右クリック、PeopertiesからBuild pathを選択し、外部jarとして上で展開したtwitter4jのjarを追加する。
Twitterへのアプリケーション登録
Twitterの開発者サイトから、アプリケーション登録を行う。
登録後、Create Access Tokenというボタンがでるので、それをクリックすると、AccessTokenが作成される。
作成されたAcceccTokenは、My Application画面から作成したアプリケーションを選択し、OAuthタブをクリックすると見ることができる。
Javaプログラム
まず、oAuthの情報を、Twetter4Jのページの説明にあるように、デフォルトパッケージのtweeter4j.propertiesに書き入れる。
TestTweet.javaを作成し、
- 特定のハッシュタグがついたTweetを取得する。
- 2013/6/13から6/17の5日の間の最大1500Tweetsを取得する。
- Tweet本文は半角スペースで区切り、Retweet(RT)、ダイレクトメッセージの宛先(@)、ハッシュタグ、添付を含まないものをファイルに書き出す。
- 本文とともに、Tweetのアカウント名もファイルに書き出す。
ようにした。
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.StringTokenizer; import twitter4j.Query; import twitter4j.QueryResult; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; public class TestTweet { public static void main(String[] args) throws TwitterException { // 初期化 Twitter twitter = new TwitterFactory().getInstance(); Query query = new Query(); try { File file = new File("[path to the file]/tweets.txt"); PrintWriter pw; //追記で書き込む pw = new PrintWriter(new BufferedWriter(new FileWriter(file,true))); // 検索ワードをセット(試しにバルスを検索) query.setQuery("#[適当なハッシュ]"); // 1度のリクエストで取得するTweetの数(100が最大) query.setCount(100); query.setSince("2013-06-13"); query.setUntil("2013-06-17"); // 1500件(15ページ)最大数 for (int i = 1; i <= 15; i++) { // 検索実行 QueryResult result = twitter.search(query); System.out.println("ヒット数 : " + result.getTweets().size()); System.out.println("ページ数 : " + new Integer(i).toString()); // 検索結果を見てみる for (Status tweet : result.getTweets()) { // 本文 String str = tweet.getText(); // ハッシュタグとURLの削除 StringTokenizer sta = new StringTokenizer(str, " "); //トークンの出力 while(sta.hasMoreTokens()) { String wk = sta.nextToken(); if(wk.indexOf("#") == -1 && wk.indexOf("http") == -1 && wk.indexOf("RT") == -1 && wk.indexOf("@") == -1){ pw.println(wk); } } String u = tweet.getUser().getName(); pw.println(u); } if(result.hasNext()){ query = result.nextQuery(); }else{ break; } } pw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
保存後、プログラムを右クリックし、Run AsでJavaアプリケーションとすると、指定したファイルにTweet本文とアカウント名が書き込まれる。
以下は、ある都市名をハッシュタグに持つTweetを取得した一部(サンプル)である。
おはようございます。今週も、予約注文沢山頂いています。 WILLCOMプラザ西口 埼玉のご当地アイドルを結成します!! トムボウイ・ダンススクール埼玉みずほ台校 『スカラ座大賞結果発表!』でゴェ。さて、1位は? 2位は?(^^* 再上映するらしいゴェよ。 ゴミ屋敷@片付けレスキュー隊 【今なら】DIGNO DUALをご契約いただくと4,775円/月★月々たったこれだけで⇒どこにかけても通話料無料!パケット使い放題!期間限定なのでお見逃しなく! WILLCOMプラザ西口