Edited at

JubatusのRecommenderチュートリアルをGroovyで書いてみた #jubatus_mokumoku

More than 3 years have passed since last update.


準備

AWSのt2microインスタンスにGroovyとjubatus 0.6.6が入ってる前提で。ほかはRecommenderチュートリアルに準じます。

まずはJubatusのライブラリを持ってきます。GroovyなのでGrapeを使えば良いですね。JubatusとmsgpackのMavenリポジトリを追加する形で

@GrabResolver(name='jubatus', root='http://download.jubat.us/maven')

@GrabResolver(name='msgpack', root='http://msgpack.org/maven2/')
@Grab('us.jubat:jubatus:[0.6,)')

import us.jubat.recommender.RecommenderClient
import us.jubat.common.Datum

println "done!"

とかやってあげます。なぜか

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:

General error during conversion: Error grabbing Grapes -- [download failed: org.slf4j#slf4j-api;1.6.1!slf4j-api.jar]

と言われたので slf4j-api-1.6.1.jar を手動でダウンロードして ~/.m2/repository/org/slf4j/slf4j-api/1.6.1/ の中に放り込んだら動きました。ディレクトリはできてたんですが。何でしょうね。


Recommenderチュートリアル(Groovy)

作ったソースはこんな感じ。


update.groovy

@GrabResolver(name='jubatus', root='http://download.jubat.us/maven')

@GrabResolver(name='msgpack', root='http://msgpack.org/maven2/')
@Grab('us.jubat:jubatus:[0.6,)')

import us.jubat.recommender.RecommenderClient
import us.jubat.common.Datum

HOST = "127.0.0.1"
PORT = 9199
NAME = "recommender_baseball"
TIMEOUT = 5

columns = ["打率", "試合数", "打席", "打数", "安打", "本塁打", "打点", "盗塁", "四球", "死球", "三振", "犠打", "併殺打", "長打率", "出塁率", "OPS", "RC27", "XR27"]
csv = new File("dat/baseball.csv")
recommender = new RecommenderClient(HOST,PORT,NAME,TIMEOUT)

csv.eachLine{ line ->
datum = new Datum()
splitted = line.split(",")
datum.addString( "チーム", splitted[1] )
columns.eachWithIndex{ it, idx ->
datum.addNumber( it, splitted[idx+2] as Double )
}
println splitted[0]
recommender.updateRow(splitted[0], datum)
}

println "done!"



analyze.groovy

@GrabResolver(name='jubatus', root='http://download.jubat.us/maven')

@GrabResolver(name='msgpack', root='http://msgpack.org/maven2/')
@Grab('us.jubat:jubatus:[0.6,)')

import us.jubat.recommender.RecommenderClient

HOST = "127.0.0.1"
PORT = 9199
NAME = "recommender_baseball"
TIMEOUT = 5

columns = ["打率", "試合数", "打席", "打数", "安打", "本塁打", "打点", "盗塁", "四球", "死球", "三振", "犠打", "併殺打", "長打率", "出塁率", "OPS", "RC27", "XR27"]
csv = new File("dat/baseball.csv")
recommender = new RecommenderClient(HOST,PORT,NAME,TIMEOUT)

csv.eachLine{ line ->
splitted = line.split(",")
sr = recommender.similarRowFromId(splitted[0],4)
println "player ${splitted[0]} is similar to : ${sr[1].id} ${sr[2].id} ${sr[3].id}"
}

println "done!"


jubarecommenderを起動します。

$ jubarecommender --configpath npb_similar_player.json &

下記のコマンドで実行します。

データを突っ込む:

$ groovy update.groovy

長野久義
大島洋平
鳥谷敬
坂本勇人
中田翔
李大浩
陽岱鋼
糸井嘉男
...
...(以下略)
done!

Recommenderから結果を取得する:

$ groovy analyze.groovy

player 長野久義 is similar to : 糸井嘉男 ミレッジ 栗山巧
player 大島洋平 is similar to : 本多雄一 石川雄洋 荒波翔
player 鳥谷敬 is similar to : サブロー 糸井嘉男 和田一浩
player 坂本勇人 is similar to : 角中勝也 稲葉篤紀 秋山翔吾
player 中田翔 is similar to : 井口資仁 新井貴浩 中村紀洋
player 李大浩 is similar to : 中村紀洋 ミレッジ 中島裕之
player 陽岱鋼 is similar to : 秋山翔吾 枡田慎太郎 長谷川勇也
player 糸井嘉男 is similar to : 長野久義 栗山巧 ミレッジ
...
...(以下略)
done!