Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

Twitter4JとRで最近Tweetしたユーザーを調べる

Rのキャッチアップのために「直近の100Tweetsを投稿したユーザーを調べる」プログラムを作成しました。最初は「自身の投稿を曜日を横軸・時間を縦軸にプロットする」プログラムを組もうと思ったのですが、Twitter APIを利用するためのJavaライブラリ(Twitter4J)の仕様で最近24時間のデータしか取得できない*1ことがわかったので変更しています。

Twitter4Jでタイムライン取得

まずはTwitter APIを利用してタイムラインを調べるJavaプログラムを作成。今回利用したTwitter4Jは簡単に使えて便利ですが、API仕様書]が充実していないので利用する際はまずコード例から読むことを薦めます。

// FriendsTimelineから直近の100Tweetsを取得して日付とユーザー名をファイルに書き出す
// FIXME コード簡略化のためimportと例外処理を省略
public class RecentTweetReader {
	public static void main(String[] args) {
		Twitter          twitter = new Twitter("username", "password");
		BufferedWriter   writer  = new BufferedWriter(new FileWriter("timeline.txt"));
		SimpleDateFormat format  = new SimpleDateFormat("HH:mm:ss");

		List<Status> timeline = twitter.getFriendsTimeline(new Paging(1, 100));
		for (Status status : timeline) {
			writer.write(format.format(status.getCreatedAt()));
			writer.write(' ');
			writer.write(status.getUser().getScreenName());
			writer.newLine();
		}
		writer.close();
	}
}

RでTweet回数を求める

次に、Javaプログラムで作成したファイルからユーザー名とTweetした回数を導出するRプログラムを作成。「どのユーザーが何回Tweetしたか」を求める方法としては(初めて使う言語の場合)コントロールブレイクが最も簡単に利用できますが、今回は検索で見つけたrle()関数オブジェクトを利用します。

# ユーザーごとにユーザー名とTweetした回数を出力
timeline<-data.frame(scan("timeline.txt",list(time="",name="")))
sorted_authors<-sort(timeline[,2])

rle_data <- rle(as.vector(sorted_authors))
for (i in 1:length(rle_data$lengths)) {
  write(c(rle_data$values[i], rle_data$lengths[i]), "authors.txt", append=(1 < i))
}

結果は以下の通り。ユーザー名とTweet回数の間に改行が入ってしまうのが残念ですが、当初の目的は果たせました。

user01
2
user02
7
user03
3
user04
2
user05
1
user06
5
...(以下略)

Rの情報はまずRjpWikiを当たると良いようです。最近の言語全般に言えることだと思いますが、Rはライブラリが膨大で全体像がつかみにくいという印象があります。こうしたWikiは全体像をつかむのに有用ではないでしょうか。

*1:実際どうなのかは調べていない