2011年7月11日月曜日

#AWS77の結果でリコメンデーション(Mahout)

スズキです。

下記で、"Elastic MapReduce"上で"Mahout"を利用して簡単なリコメンデーションを試したので
"Elastic MapReduce"で"Mahout"使ってリコメンデーション
今度は、もう少しリアリティがあるデータで試してみたいと思います。

ちょうど、#AWS77の集計結果があるので、そのデータから、おすすめの「願い事」を
特定のユーザー(@suz_lab, @kaz_goto, @shouhei, @bond_honey)に対して計算してみました。

まずはリコメンデーションの計算に利用するデータの作成です。
#AWS77の集計結果から、下記のプログラムで作成しました。

▼ group_by_user.php: Tweet単位のデータをUser単位に集計
$url = "http://www.suz-lab.com/aws77/tweet.json";
$tweets = json_decode(file_get_contents($url), true);
$id = 1;
$output = array();
foreach($tweets as $tweet) {
  if(!isset($output[$tweet["tweet_user"]])) {
    $output[$tweet["tweet_user"]] = array("id" => $id, "tweets" => array());
    $id++;
  }
  array_push($output[$tweet["tweet_user"]]["tweets"], $tweet["tweet_id"]);
  foreach($tweet["retweet_users"] as $retweet) {
    if(!isset($output[$retweet["retweet_user"]])) {
      $output[$retweet["retweet_user"]] = array("id" => $id, "tweets" => array());
      $id++;
    }
    array_push($output[$retweet["retweet_user"]]["tweets"], $tweet["tweet_id"]);
  }

}
print(json_encode($output));

上記を実行すると下記のようなファイルが作成されます。
./group_by_user.php > group_by_user.json
{
    ...
    "suz_lab":{"id":12,"tweets":[
        "81281819516997632",
        "81277810991300608",
        "81313605047418880",
        "82765546730438656"
    ]},
    "shouhei":{"id":13,"tweets":[
        "81281819516997632",
        "81313605047418880"
    ]},
   ...
}

このファイルを下記のプログラムでMahout用のデータにします。

▼ vote_data.php: "User ID,Tweet ID"の形式に
$file = "group_by_user.json";
$users = json_decode(file_get_contents($file), true);
foreach($users as $user) {
  foreach($user["tweets"] as $tweet) {
    print($user["id"] . "," . $tweet . "\n");
  }
}

上記を実行すると下記のようなファイルが作成されます。
./vote_data.php > vote.txt
...
12,81281819516997632
12,81277810991300608
12,81313605047418880
12,82765546730438656
13,81281819516997632
13,81313605047418880
13,86608704149004289
13,86045577703456768
...

さらに、今回はおすすめ「願い事」を計算する対象ユーザーも限定するので、
下記のようなユーザーIDを記述したファイルを
"s3n://emr.suz-lab.com/input/aws77/user.txt"に配置します。
12
13
15
46

そして、下記で紹介したように、"Elastic MapReduce"です。
"Elastic MapReduce"で"Mahout"使ってリコメンデーション
今回指定した"Jar Arguments"は下記となります。
org.apache.mahout.cf.taste.hadoop.item.RecommenderJob
-Dmapred.output.dir=s3n://emr.suz-lab.com/output/aws77
-Dmapred.input.dir=s3n://emr.suz-lab.com/input/aws77/vote.txt
--usersFile s3n://emr.suz-lab.com/input/aws77/user.txt
--similarityClassname SIMILARITY_COOCCURRENCE
--booleanData true

結果は下記のようになりました。

12 [81297382536515585:21.0,81294622684495872:19.0,83106534015516672:18.0,81297425146458113:15.0,88869226823172096:14.0,88854630196453376:13.0,83076098203725824:10.0,81278165409988608:10.0,88588223273635840:9.0,88769415855882240:9.0]
13 [82765546730438656:12.0,81277810991300608:12.0,81278229155028992:10.0,82584012752830464:9.0,88869044358356992:8.0,88863566211465216:8.0,81277731974811648:8.0,82923122696781824:7.0,88825952167145473:7.0,83853092373798912:7.0]
15 [81277810991300608:23.0,88863566211465216:16.0,83853092373798912:15.0,82923122696781824:15.0,86608704149004289:15.0,88825952167145473:15.0,88869044358356992:13.0,81297323505889280:11.0,81278116756078593:11.0,86045577703456768:10.0]
46 [81281819516997632:7.0,82765546730438656:6.0,81277731974811648:6.0,81313605047418880:5.0,83853092373798912:4.0,82584012752830464:4.0,88825952167145473:4.0,81277810991300608:4.0,81278116756078593:4.0,81297323505889280:4.0]

つまり、おすすめの「願い事」は、

@suz_lab (ID:12)

「SecurityGroupでホスト名(Route53で管理されている物に限定)が指定出来るようになりますように」 #AWS77 #jawsugless than a minute ago via YoruFukurou Favorite Retweet Reply



@shouhei (ID:13)

ELBでsorry画面出せますように(出せないよね?) #AWS77 #jawsugless than a minute ago via Twitter for iPhone Favorite Retweet Reply



@kaz_goto (ID:15)

PostgreSQLのRDSが始まりますように #AWS77 #jawsugless than a minute ago via Janetter Favorite Retweet Reply



@bond_honey (ID:46)

VPCが東京リージョンにきますように。 #AWS77 #jawsugless than a minute ago via web Favorite Retweet Reply



ということになります。

そろそろLTの準備をするか。。。
--------
http://www.suz-lab.com

0 コメント: