Twitterからつぶやきを取得する。

エコノミスト誌(6/4号;使える統計学)」で特集を組んだ「Twitterのつぶやきから景気動向指数を推定する」についてだが、第一ステップの簡単な絵を書くと、以下のようになる。

NTTデータさんが、Twitterの全データの取得権を持っている(これは、「権利を買える」という意味なのだろうか)ということで、TwitterAPIを経由して、分散処理環境に「つぶやき」を取得してモデリングする。
特集記事では、分散処理に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プラザ西口