捗る!リコメンドシステムの裏事情
2014/10/11 @mosa_siru (榎本悠介)
1
@mosa_siru• 「もさ」って呼んでください
• 大学:複雑ネットワーク研究
• ネットワーククラスタリングの高速化手法
• Twitter SmartList 開発
3
@mosa_siru• DeNA(2年目)
• プラットフォーム API開発・運用
• ハッカドール 立ち上げからジョイン
• サーバーAPI 設計・開発・運用(ほぼ全部)
• フロント/バックエンド Web開発
• ログ設計・リコメンドシステムをうんうん考える
• 社内の分析チームと密に連携
4
ボンバーマン• 2年間引きこもって極めてました
• 戦績をつけてRatingで可視化しながら対戦
• 極めるとぷよぷよ化する
7
アジェンダ1. ハッカドールって?
2. ターゲットユーザーの特徴
3. リコメンドシステムの紹介
10
ハッカドールって?• アニメ・マンガ・ゲームなど、オタク系の記事のみを扱ったニュース配信アプリ
• 政治・スポーツなどのニュースは一切扱わない
• 使えば使うほど学習していく
12
ハッカドールって?• ゲーミフィケーション
!
• というかゲームできる
!
• オタクユーザーに刺さる機能が満載
13
2014夏コミに合わせてリリース
14
• 1ヶ月あまりで数十万DL突破
• 高いリターンレート(継続率)
極めて高いユーザー評価
15
なんでこんなアプリ作ったの?
16
捗りたい!• 好きなゲームの情報を毎日調べる辛さ
• え、あの漫画の新刊出てたんだ…
• もっともっと、まだ見ぬ面白いコンテンツに出会いたい!
17
コンテンツのマッチング• 増え続けるコンテンツ
• 漫画の1日あたり新刊数はどんどん増えている
• でも売上は横ばい
• 面白いコンテンツと、それを求めるユーザーをマッチングさせて、エンタメ業界を活性化させたい
18
開発陣• 「オタク以外はチームに入れません」
20
2. ターゲットユーザーの特徴
22
情報収集力が高い• 自力でどんどん好きな情報を集める
• 受動的でない
• そのためには多少の苦労はいとわない
24
こだわりが強い• 「絶対にラブライブ!の情報は逃したくない!」
• 1秒でも速く知りたい!!
• 興味のある・ないでの差が激しい
• 「~のニュースとか本当にどうでもいい」
26
ニッチな記事も好む• 必ずしもTweet数、はてブ数が高い記事を好むわけでもない
• 例:声優ブログ
28
とにかく嗜好にマッチしていることが重要
29
ハッカドールのリコメンドの仕組み
30
一般的なリコメンド手法って?
31
一般的なリコメンド手法
32
• 大きく分けて二分される
• ユーザーベース
• 「この商品を買った人はこんな商品も買っています」
• アイテムベース
• 「この商品はキルラキルのフィギュアなので、キルラキルが好きな人に推薦しよう」
ユーザーベースの特徴
33
• 推薦されるアイテムの中身に依存しないので、汎用的
• ユーザーアクティビティの情報が大量に必要
• コールドスタート問題
• ニュースや新商品のアクティビティ情報が少ない
• 計算量の工夫が必要
アイテムベースの特徴
34
• 推薦対象となるアイテムの情報が必要
• 全体のアクティビティ量は必ずしも多くなくて良い
• ニュース・新情報に対応可能
• 計算量はユーザー数に対して線形
ハッカドールでは
35
• リリース当初はアイテムベースがメイン
• 現在はユーザーベースも組み合わせて記事を配信しています
• 試行錯誤し、各種ABテストで検証しながら導入しています
• 今回は、アイテムベースの手法を紹介します
アイテムベースの手法
(ベクトル空間モデルの紹介)
36
アイテムの持つ情報とは
37
• ニュースの場合
• タイトル
• 記事本文
• 画像
• サイト情報、メタ情報、Tweet情報 etc..
ベクトル空間モデル
38
• 例えば文章情報に着目
• たとえば文章に含まれる「単語の登場数」にだけ着目してみると
39
キーワード 登場数立体機動装置 1講談社 1漫画 2エレン 1リヴァイ 1
ウサイン・ボルト 3進撃の巨人 1空想科学読本 3諫山創 1(略)
※実際は各種の重み調整が必要
ベクトル空間モデル
40
• アイテムを全てベクトルで表現
• ユーザーの嗜好もベクトルで表現
• 例:読んだ記事のベクトルを足していく
• ベクトルの”近さ”は簡単に計算できる
• ユーザーのベクトルと”近い”記事を推薦
今回はどうやって良いベクトル空間を作るか?にフォーカスを当てます
41
形態素解析
43
• wikipedia「対象言語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い、自然言語で書かれた文を形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの品詞を判別する作業を指す。」
mecab
47
• 日本製のオープンソースの形態素解析エンジン
• 簡単、シンプル、速い
• すぐに試せる brew install mecab mecab-ipadic
ちゃんとした辞書が必要
50
• 形態素解析は、辞書(単語リスト)をもとに分割している
• デフォルトのmecabの辞書では、一般用語しか入っていない
• 「ラブライブ!」「μ's」などに対応するには、独自のユーザー辞書が必要
外部リソースを使う
52
• wikipedia
• データが全公開されている
• ニコニコ大百科
• オタクキーワードが満載
• 記事のタイトルから、ニッチなキーワードを取得
でも全然必要ない単語もいっぱい…53
とある声優ソムリエが思いついた手法
55
56
wikipediaにはカテゴリ情報がある
57
どんどんサブカテゴリを辿っていくと…
親カテゴリからの幅優先探索で専門辞書を作成
59
必要な単語だけ抽出することに概ね成功
60
まだまだこだわる
63
• 100%完璧な手法ではない
• 探索の深さはadhoc
• 公開直後の情報など、wikipediaに記事がない場合がある
• 辞書の管理ツールを作成
• 手動で辞書に必要単語を追加できる
• 新単語にいち早く対応
「続きを読む」を含んだ記事を
良く読んでいるので、
「続きを読む」を含んだ記事が 推薦される
66
リコメンドに不要な単語
68
• 辞書には欲しいが、リコメンドには不要かもしれない単語
• 「そもそも」「こちら」「続き」 (各種一般用語)
• 数字、記号 etc…
リコメンドに不要な単語
69
• オタク辞書にない単語は使わない
• 不要単語(ブラックリスト)管理ツールも作成
シノニム変換
70
• 「アイマス」=「アイドルマスター」
• 「ごちうさ」=「ご注文はうさぎですか?」
!
• シノニム管理ツールも作成
いいかんじになってきたのでプロトタイプつくってみた
71
ラブライブ!
の記事しか出ない…
72
重み調整
73
• TFIDF
• 「アニメ」を含む記事を1回読むことと、
「ボンバーマン」を含む記事を1回読むことの重みは異なる
• TFIDFだけじゃうまくいかなくなってきた
• キーワードの重み管理ツールも作成
重み調整
74
• よりオタク向けなキーワードの重みを上げる
• 一般記事全体と、オタク向け記事全体でのキーワード登場回数の違いを考慮
どんどん捗るようになってきた
75
今でも議論・検証しながら 着実に改善しています
77
ありがとうございました!@mosa_siru
79
ターゲットユーザーにさらにフォーカスした機能
81
捗った?機能
83
• ハッカドールちゃんに、リコメンドのフィードバックをするシンプルな機能
• 学習を加速させる
!
• 「自動学習じゃないじゃん!」
• 能動的であるターゲットユーザーから、よりはやく正確な情報が集められる
ウォッチリスト
85
• 好きなタイトル名などを登録しておくと、そのキーワードを含んだニュースが出るたびに教えてくれる
!
• 全文検索エンジンから取得
ユーザーのことを考えると
絶対に必要な機能だった (というか俺が欲しい)
88
僕らが提供しているのは
”サービス”技術とかアルゴリズムはその手段
89
ハッカドールはまだ発展途上。
より多くの「捗る!」を 提供していきます
90
おわり
91
@mosa_siru