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)
tottokug
@shouhei (ID:13)
hiroohi
@kaz_goto (ID:15)
cloudpack_jp
@bond_honey (ID:46)
ということになります。