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

最近twitter上で話題になっていたAWSへの七夕の願い事tweetである#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でMahout使ってリコメンデーションで紹介したように、Jar Argumentsを指定して、Elastic MapReduceを実行したいと思います。

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得上竜一
tottokug

@shouhei (ID:13)

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

@kaz_goto (ID:15)

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

@bond_honey (ID:46)

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

ということになります。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら