参謀本部の自社開発レコメンドエンジン「スレッジ・ハンマー」
参謀本部では、ユーザー行動履歴と形態素解析の掛け合わせによるハイブリッドレコメンドエンジン「スレッジ・ハンマー」を自社開発しております。既に大手ニュースサイトにも導入され、関連記事のクリック率向上(0.7%から1.4%と約2倍向上)に寄与しています。ここではスレッジ・ハンマーの技術仕様に関してご説明いたします。
バックエンドの集計モジュール
- 1-1.レコメンド分類器生成モジュール(機械学習) クリック履歴あり
- 1-2.レコメンド分類器生成モジュール(機械学習) クリック履歴無し(初回訪問時用)
- 1-3.国別カテゴリ分類器生成モジュール(機械学習)
- 1-4.データ掃除モジュール
- 1-5.記事マスターデータ送信モジュール
- 1-6.記事マスターデータ取り込みモジュール
- 1-7.カテゴリマスター管理モジュール(追加、更新、削除等 Scafold)
- 1-8.記事マスターをカテゴリに分類するモジュール
- 1-9.レコメンド分類器生成用データ前処理モジュール
- 1-10.記事国別カテゴリ分類器生成用データ前処理モジュール
- 1-11.ジャンル別カテゴリ分類器生成モジュール(機械学習)
- 1-12.記事ジャンル別カテゴリ分類器生成用データ前処理モジュール
画面・フロントエンドの集計モジュール
- 2-1.クリック履歴追跡ユニークID取得モジュール
- 2-2.カテゴリ一覧取得モジュール
- 2-3.レコメンド記事取得モジュール
- 2-4.クリック履歴記録モジュール
- 2-5.クリック履歴追跡ユニークID生成モジュール
- 2-6.カテゴリ内記事取得モジュール
- 2-7.レコメンド記事表示モジュール
- 2-8.カテゴリ一覧表示モジュール
レコメンドエンジンのモジュール
- 3-1.レコメンド記事生成モジュール1(リアルタイム) クリック履歴あり
- 3-2.レコメンド記事生成モジュール2(リアルタイム) クリック履歴無し(初回訪問時)
- 3-3.クリック履歴保存モジュール
ウェブサーバー
- 軽量なNginxを使用します
- Reverse Proxy で連携します
- Nginx から Reverse Proxy を活用しての負荷分散を可能にします
- 初期は nginx:jetty は 1:1 の構成
- 場合によって nginx:jetty を 1:n の構成にして URL パターン等で負荷分散します
アプリケーションサーバー
- Jetty 9 を採用
キャッシュ
- Hibernate+EHcacheベースの Level 2 Cache を使用
- EHcache ベースの独自のキャッシュを活用
データベースアクセス
- JPA2 を Hibernate ライブラリを活用して動かします
- Hibernate を活用することで PreparedStatement のキャッシュ、 Level 2 Cache 等を効率的に実装可能です
- Connection Pooling に HikariCP という高速なコネクションプールの実装を使用します
Restfulウェブサービス
- Jerseyを使用します。
- RestfulAPIとして必要な機能が備わっているため採用しております。
- CORS、CSRF等のフィルタで各種セキュリティ対応いたします。
カテゴリ自動分類
カテゴリ自動分類の機械学習では、JubatusのClassifyを使っております。アルゴリズムはAROWです。
Jubatusでの機械学習では「学習するカテゴリの要素数にばらつきがある場合、推定結果が要素の多いものに偏ってしまう」という現象があります。
例えば、性別のようなカテゴリですと、通常は男性50%女性50%で、偏りがありません。ですので、性別不明のデータを適当に推定すると50%ですが、男性100人、女性100人のデータを学習することによって、一般的には精度が70-90%になります。
しかし、Aが10%、Bが90%、といった偏りのある分類ですと、学習して推定すると、すべてBという結果を得ることがあります。すべてBだと、90%正解で、高い精度なのですが、実用として使えません。
Jubatusのままでは上記の問題が起きるので、弊社独自で分類の偏りを補正する処理を入れています。