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

## 準備

AWSのt2microインスタンスにGroovyと[jubatus 0.6.6が入ってる](http://jubat.us/ja/quickstart.html)前提で。ほかは[Recommenderチュートリアル](http://jubat.us/ja/tutorial/recommender.html)に準じます。

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

```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

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を起動します。

```shell-session
$ jubarecommender --configpath npb_similar_player.json &
```

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

データを突っ込む：

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

Recommenderから結果を取得する：

```shell-session
$ 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!
```