share facebook facebook twitter menu hatena pocket slack

2011.07.12 TUE

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

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)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。