ElasticsearchとTasteプラグインで作る
レコメンドシステム
白ヤギ勉強会(第16回)
白ヤギ勉強会(第16回)
■ 名前: 菅谷信介
■ 所属: N2SM, Inc.
■ オープンソース活動:
• Apache Portals (Jetspeed2) コミッタ
• Codehausコミッタ
• Seasar Projectコミッタ
• CodeLibsプロジェクト運営
              などなど・・・
■ Blog: http://www.chazine.com/
■ Twitter: https://twitter.com/shinsuke_sugaya/
自己紹介
2
白ヤギ勉強会(第16回)
アジェンダ
■ 概要
➜ Elasticsearchとは
➜ Mahoutとは
■ Tasteプラグインとは
■ 今後対応したいこと
■ まとめ
3
白ヤギ勉強会(第16回)
概要
ElasticsearchとMahout
4
白ヤギ勉強会(第16回)
Elasticsearchとは
5
■ OSSの分散リアルタイム検索&分析エンジン
➔ Luceneベースの全文検索ができるシステム
➔ ドキュメント指向なデータ操作が可能
➔ 簡単に分散環境(クラスタ)を構築できる
➔ プラグインで機能を拡張できる
◆ ネイティブなプラグイン (Tasteプラグインはコレ)
◆ サイトプラグイン
➔ 処理を実行する機能(River)を提供(廃止予定)
弊社(N2SM)ではElasticsearchやFess/Solrなどの検索システム構築支援サービスを提供しています
http://www.n2sm.net/services/search-support.html
白ヤギ勉強会(第16回)
Mahoutとは
6
■ 機械学習アプリを作るための環境を提供
➜ 2015/4に0.10.0リリース
■ 機械学習に関する様々な実装を提供している
■ 近頃はScala向けのSamsaraを提供
➜ MapReduceはやめて、Sparkにシフトしてきている
■ レコメンドはTasteフレームワークとして提供
白ヤギ勉強会(第16回)
Mahout Tasteとは
7
■ レコメンドエンジン・協調フィルタリング
のフレームワーク
➜ DataModel
➜ UserSimilarity
➜ ItemSimilarity
➜ UserNeighborhood
➜ Recommender
■ JavaのAPIを呼び出して、Javaや
JavaEEアプリから呼び出して利用する
白ヤギ勉強会(第16回)
Mahoutの問題点
8
■ どこを目指しているのかがわからない・・・
➜ MapReduceからSparkへ
➜ JavaからScalaへ
✓ これら自体は良いと思うのだが、プロジェクトとし
ては場当たり的な対応をしている感じが強い
■ 導入できるマーケットがない・・・
➜ 大企業はHadoopはあるけど、Mahout使わないでも
自分たちで解決できる
➜ 中小企業はHadoop入れてまでMahoutを使う動機
がない
Mahoutは個別に見れば良いものもあるが…
白ヤギ勉強会(第16回)
そのあたりの課題を
解決していくためにも…
9
白ヤギ勉強会(第16回)
Elasticsearch
Taste Plugin
10
白ヤギ勉強会(第16回)
Tasteプラグインとは
11
■ Mahout Tasteをベースのレコメンド機能
➜ Taste部分のソースコードをフォークしている
➜ Elasticsearchのスケールのしやすさを活かす
■ 利用者/商品/嗜好データ管理
■ 情報をElasticsearchのインデックスで管理
■ 利用者/商品ベースのレコメンド
■ 類似利用者の算出
■ テキストレコメンド (タームベクターの情報を利用)
■ Pluggableな実装
白ヤギ勉強会(第16回)
Index
データ構造
12
■ 利用者(User)、商品(Item)、嗜好(Preference)を
ElasitcsearchのIndexのTypeごとに管理する
■ UsersとItemsには任意のデータも登録可能
Preferences
user_id
item_id
value
@timestamp
long
long
float
date
Users
user_id
system_id
@timestamp
(any)
long
string
date
(any)
Items
item_id
system_id
@timestamp
(any)
long
string
date
(any)
白ヤギ勉強会(第16回)
データ登録
13
■ レコメンドに利用されるデータは「利用者(U001)が商品
(I001)に評価(5)を与える」ようなものを想定
■ 利用者、商品、嗜好の3つのTypeに個別に登録するこ
とも可能だが、Tasteプラグインでは1リクエストで登録
可能なAPI(_taste/event)を提供
$ curl -XPOST localhost:9200/インデックス名/_taste/event -d
'{
"user":{"id":"U001"},
"item":{"id":"I001"},
"value":5,
"timestamp":"2014/01/01 00:00:00"
}'
白ヤギ勉強会(第16回)
商品レコメンド
14
■ 同じ評価の利用者からの商品をレコメンド
■ TasteのUserBasedRecommenderを利用
➜ ItemBasedRecommenderによる方法も提供
■ 利用方法
■ 〜Factoryにより類似利用者の計算を差し替え可能
$ curl -XPOST localhost:9200/_taste/action/recommended_items_from_user -d '{
"num_of_items": 10,
"index_info": {
"index": "movielens"
}
}'
白ヤギ勉強会(第16回)
商品レコメンドの評価
15
■ 平均二乗誤差などを簡単に確認できる
■ TasteのEvaluatorを利用
$ curl -XPOST localhost:9200/_taste/action/evaluate_items_from_user -d '{
"evaluation_percentage": 1.0,
"training_percentage": 0.9,
"margin_for_error": 1.0,
"index_info": {
"index": "movielens"
},
"neighborhood": {
"factory": "org.codelibs.elasticsearch.taste.neighborhood.NearestNUserNeighborhoodFactory",
"neighborhood_size": 100
},
"evaluator": {
"id": "movielens_result",
"factory": "org.codelibs.elasticsearch.taste.eval.RMSEvaluatorFactory"
}
}'
白ヤギ勉強会(第16回)
類似利用者
16
■ 同じ評価の類似する利用者を取得
■ TasteのNeighborhoodを利用
■ 利用方法
■ 〜Factoryにより計算方法を差し替え可能
$ curl -XPOST localhost:9200/_taste/action/similar_users -d '{
"num_of_users": 10,
"data_model": {
"cache": {
"weight": "100m"
}
},
"index_info": {
"index": "movielens"
}
}'
白ヤギ勉強会(第16回)
テキストレコメンド
17
■ 利用者/商品/嗜好→ドキュメント/ターム/出現数として、協
調フィルタリングによるドキュメントのレコメンド
■ Elasticsearch(Lucene)のタームベクター情報を用いて、
テキスト文書をベクトル化する
curl -XPOST localhost:9200/_taste/action/generate_term_values?pretty -d '{
"source": {
"index": "ap", "type": "article", "fields": ["description"]
},
"event": {
"index": "ap_term",
"user_type": "doc", "item_type": "term", "preference_type": "preference"
}
}'
白ヤギ勉強会(第16回)
拡張ポイント (その1)
18
■ DataModelに対する利用者または商品の絞り込み
■ 差し替え可能な機能
➜ Recommender
✓ UserBasedRecommender
✓ ItemBasedRecommender
➜ Neighborhood
✓ NearestNUserNeighborhood
✓ ThresholdUserNeighborhood
"neighborhood": {
"factory": "org.codelibs.elasticsearch.taste.neighborhood.
NearestNUserNeighborhoodFactory",
"neighborhood_size": 100
}
使用例
白ヤギ勉強会(第16回)
拡張ポイント (その2)
19
➜ Similarity
✓ CityBlockSimilarity
✓ LogLikelihoodSimilarity
✓ SpearmanCorrelationSimilarity
✓ TanimotoCoefficientSimilarity
✓ EuclideanDistanceSimilarity
✓ PearsonCorrelationSimilarity
✓ UncenteredCosineSimilarity
➜ Evaluator
✓ RMSEvaluator
✓ AverageAbsoluteDifferenceEvaluator
白ヤギ勉強会(第16回)
今後対応したいこと
20
■ 分散処理化
➜ Elasticsearchのクラスタ内通信を利用して、計算を
分散処理をしたい
➜ Riverが廃止になるので、適切な運用方法の提供
■ 交差検定等での評価方法の強化
■ Bulk APIの対応
白ヤギ勉強会(第16回)
まとめ
21
白ヤギ勉強会(第16回)
■ Mahoutの課題について
➜ TasteをElasticsearch上で実現することで、簡単に
導入できるようにする
■ Tasteプラグインについて
➜ 商品レコメンド
➜ 類似利用者
➜ テキストレコメンド
■ 今後対応したいこと
➜ 分散処理化
➜ バルクAPI対応
まとめ
22
白ヤギ勉強会(第16回)
Q&A
23

ElasticsearchとTasteプラグインで作るレコメンドシステム