【Twitter4J】フォロー(フレンド)とフォロワーの片思い・片思われを抽出する方法


今日は大型連休(最近はゴールデンウィークと呼ばない?)の前半3日の最後でしたね。
てぃーは今日は予定はなかったのでゴロゴロ&プログラミングの勉強をしていました。
勉強と書けばかっこいいですが大事な創作活動の下地にあたるものですからじっくりと基礎を抑えていきたいものです。

昨年の大型連休では日経ソフトウエアを使ってiPhoneアプリのマインスイーパの勉強をしましたが、今年はTwitter4Jを使ってツイッターの分析を行うアプリの基礎を築きたいと思います。
(Twitter4J自体は2012/04/04(水)にインストールはしていました。)
Javaプログラミングなのでウィンドウズ、マックを問わずできますね。
勉強したことを書いていきます。


さて、今回はフォロー(フレンド)とフォロワーの片思い・片思われを抽出する方法についてです。
つまりフォローのみしている人、フォローのみされている人を挙げるものです。

次のようにします。
(ネットの情報(特に次のページ)を参考にさせていただきました。ありがとうございます。
 →Twitter4JでフォロワーのIDを取得する(最大175万人) - コードつれづれ

import java.io.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import twitter4j.*;


public class TwitterFriendProfs {

private static int ID_COUNT_PER_REQUEST = 5000;
//自動的に認証してくれる
//(バージョン2.2.4以降はgetInstance()ではなくgetSingleton()を推奨)
new TwitterStreamFactory();
Twitter twitter = TwitterFactory.getSingleton();

public static void main(String[] args) throws TwitterException {

try {

// 取得対象のユーザ名
String targetScreenName = "teapipin";


// カーソル初期値。現状のt4jのjavadocは 1オリジンだが、Twitter API Documentでは -1オリジンなのでそちらに準拠
long cursor = -1L;
// 一時的にIDを格納するオブジェクト
IDs ids;
IDs idFs;
// IDを全てストックするオブジェクト
//HashSetを用いることにする
HashSet<Long> followerIDs = new HashSet();
HashSet<Long> friendIDs = new HashSet();

List<Long> Kataomoi= new ArrayList();
List<Long> Kataomoware= new ArrayList();

long page = 1L;

//フォロワーの取得
do {
// 状況表示
System.out.println(String.format("%dページ目取得中。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
ID_COUNT_PER_REQUEST * page++));

ids = twitter.getFollowersIDs(targetScreenName, cursor);
// 取得したIDをストックする
for (long id : ids.getIDs()) {
followerIDs.add(id);
}

// 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
cursor = ids.getNextCursor();
} while (ids.hasNext());


//クリア
page = 1L;
cursor = -1L;


//フレンドの取得
do {
// 状況表示
System.out.println(String.format("%dページ目取得中。。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
ID_COUNT_PER_REQUEST * page++));

idFs = twitter.getFriendsIDs(targetScreenName, cursor);
// 取得したIDをストックする
for (long idF : idFs.getIDs()) {
friendIDs.add(idF);
}

// 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
cursor = idFs.getNextCursor();
} while (idFs.hasNext());


//一致しないものを抽出

//反復子iteratorによる取得
Iterator<Long> ite = followerIDs.iterator();
Iterator<Long> iteF = friendIDs.iterator();

//1.片思われの場合
while(ite.hasNext()) { //ループ
Long obj = ite.next(); //該当オブジェクト取得

//存在しない場合は片思われ
if (friendIDs.contains(obj) == false) {
Kataomoware.add(obj);
}
}

//2.片思いの場合
while(iteF.hasNext()) { //ループ
Long objF = iteF.next(); //該当オブジェクト取得
//存在しない場合は片思い
if (followerIDs.contains(objF) == false) {
Kataomoi.add(objF);
}
}


// ファイル出力
//片思い
output(String.format("C:\\Kataomoi_"+targetScreenName+".csv", targetScreenName), Kataomoi);

//片思われ
output(String.format("C:\\Kataomoware_"+targetScreenName+".csv", targetScreenName), Kataomoware);

} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}


private static void output(String fileName, List ids) throws TwitterException, IOException {
BufferedWriter wr = null;
try {
//Shift-JISを指定
wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "Shift-JIS"));

for (long eachId : ids) {


//書き出し

//IDから変換してユーザーの詳細を取得
//(数が多い場合は途中でAPI制限に引っ掛かるが)

User user = twitter.showUser(eachId);

//改行記号を除去(半角スペースに変換)
String strDes = user.getDescription().replaceAll("\r\n"," ");
strDes = strDes.replaceAll("\r"," ");
strDes = strDes.replaceAll("\n"," ");

//タブ記号を除去(半角スペースに変換)
strDes = strDes.replaceAll("\t"," ");

wr.write(String.valueOf(eachId)+","+user.getName()+","+user.getScreenName()+",");
wr.write(strDes);
wr.write("\n");


//念のためコンソールにも出力
System.out.println(String.valueOf(eachId)+" "+"ユーザー名: "+user.getName()+" "+user.getScreenName());
System.out.println(strDes);
}
wr.flush();
wr.close();

} catch (IOException e) {

//それまでのものの書き出しを完了する
wr.flush();
wr.close();

e.printStackTrace();
System.exit(-1);
}
}
}

ツイッターの仕様で1時間当たりの処理回数が決められているので(Rate Limiting)、数が多い場合はすべて出力できないですね。
一般にあるシステムではどのように処理しているのでしょうか?
この辺りはまだ勉強中です。
これからパワーアップしていきたいものです。


↓この記事が参考になったら拍手をクリックお願いします。今後のブログ作りに役立てたいので。
関連記事

コメントの投稿

非公開コメント

プロフィール

てぃー

Author:てぃー
詳しい自己紹介:こちら
Twitter:@teapipin


follow us in feedly 
にほんブログ村 IT技術ブログへ にほんブログ村 PC家電ブログへ
現在の閲覧者数:

ブログ内検索
今日のアクセス数の多い記事
カレンダー

08月 | 2017年09月 | 10月
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
過去記事ダイジェスト
お知らせ
ツイッター分析の分析結果が新潟大学教育学部の論文に引用
教育の実証研究の場でも高く評価!

ツイッター分析の分析結果が和歌山大学防災研究教育センターの論文に引用
防災の研究において評価!

2015年版ツイッター分析(世界編)が始動!
今回は世界の国別・言語別ツイートを分析!

ツイッター分析の分析結果が慶應義塾大学有名教授の研究論文などに引用
文系の研究までも制覇!

Interval Timer EX
有名雑誌「Mac Fan 2015月2月号」に「インターバルタイマーEX」が3度目の掲載!ポモドーロテクニックに有効!

自作Macアプリ3部作が2014年 Vector 年間ダウンロードランキング Mac トップ100にすべてランクイン

TimeCalcを公開しています!
時間計算、年齢計算、学歴欄作成など。

ツイッター分析の分析結果が人工知能の研究に!
ブログが学会発表で引用されました。

今まで開発したiPhoneアプリのソースコードを公開しています!
勉強に役立ててください。


2013年 Vector 年間ダウンロードランキング Mac トップ100に「デジカメ変更日を撮影日に一括変更 for Mac」と「インターバルタイマーEX」がランクイン

Interval Timer EX
有名雑誌「Mac Fan 2013月4月号」に「インターバルタイマーEX」が2度目の掲載!!

リアルタイムツイッター地図
リアルタイムツイッター地図を公開しています!
位置情報付きツイートをリアルタイムに表示します。

新たなツイッター分析としてイベントツイート分析を行っています!

2012年8月1日(水)開催の「Twitter勉強会」で発表
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack from teapipin


Interval Timer EX
有名雑誌「Mac Fan 2012月3月号」に「インターバルタイマーEX」が掲載!!



 

はてなブックマークの人気記事
ツイート&いいね!ランキング