amebaサーチのデータを用いた応用
DESCRIPTION
TRANSCRIPT
Amebaサーチのデータを用いた応用
12010年4月23日金曜日
クエリーログは宝の山
•ユーザーの興味関心事がわかる•正確な単語リストが自動的に得られる•クエリーログの解析結果を応用することで利便性の高いサービスを提供出来る。
22010年4月23日金曜日
例:急上昇ワード
※今日は触れません32010年4月23日金曜日
例:ワードサジェスト
42010年4月23日金曜日
例:もしかして機能
52010年4月23日金曜日
✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ
アジェンダ
62010年4月23日金曜日
ワードサジェスト機能
suggest【他動】1.~を[~しようと]提案する[提言する・勧める]、〔提案などを〕持ちかける2.〔悪いことを〕入れ知恵する3.〔名前や表現などが〕~を意味する、示唆する、暗示する、それとなく示す[言う]
入力された条件にふさわしいと思われる候補を推薦する。
より狭義には入力文字列と前方一致する文字列集合を返す。
72010年4月23日金曜日
少ない辞書データであれば手軽に実現できる。(テキストファイル+JavaScript)(suggest.jsやjquery suggestなどが便利)
大規模の辞書データを扱う際に工夫が必要になる。- データの効率的な格納- 高速な文字列検索
特に難しくないのでは?
82010年4月23日金曜日
以下のような文字列検索が行える必要がある。- 完全一致:exact match
- 東京都→東京都- 前方一致:predictive match
- 東京→東京事変、東京03、東京大神宮、東京ドーム...
- 共通接頭辞検索:common prefix search- 東京都→東京、東京都
適切なデータ構造は...※Key Value Storeはexact matchしかできないので不適
サジェストの機能要件
92010年4月23日金曜日
順序付き木構造の一種。
ルートノード(右図最上位ノード)に下位ノードが階層的にぶら下がる。文字列の場合、文字の先頭から順にノードがぶら下がることになる。
Trie木(トライ木)
102010年4月23日金曜日
クエリー:tea
ルートノードから該当するノードを走査クエリー文字列と経路が同一でかつ終端ノードとなるノードが存在する場合、一致。
exact match(完全一致)
112010年4月23日金曜日
クエリー:te
ルートノードから該当するノードを走査クエリー文字列の配下にぶら下がるノード集合(今回はtea,ted,ten)が存在する場合、それらを全て返す。
predictive match(前方一致)
122010年4月23日金曜日
クエリー:inn
ルートノードから該当するノードを走査走査中に存在する終端ノードを全て返す(今回はin,inn)
common prefix search
132010年4月23日金曜日
以下のTrie木実装が有名
• Double Array Trie Tree- Darts
http://chasen.org/~taku/software/darts/
• LOUDS- tx
http://code.google.com/p/tx-trie/
Trie木の種類
142010年4月23日金曜日
[J Aoe 1989 ] An Efficient Digital Search Algorithm by Using a Double-Array Structure
要素に数値を持つ二つの配列(BASE/CHECK)を用いる事でTrie木を表現するアルゴリズム。
Double Array Trie Tree
152010年4月23日金曜日
メリット• 木構造を数値だけで表現できるため検索速度が高速。• 同様の理由で木構造を省サイズ化できる。
Double Array Trie Tree
162010年4月23日金曜日
以下のルールにより実装される。
Double Array Trie Tree
• 配列は「BASE」と「CHECK」の二つの整数値をもっている。(この配列をBCとする)
• 文字を整数にマッピングするテーブルCODEにより、対象文字とBC配列のマッピングをする。(このマッピングテーブルをCODEとする)
• 節xにおいて文字cに対応する枝が存在し、その枝をたどることでyに辿りつくことが出来る時、BC[x].BASE + CODE[c] = y ならびに BC[y].CHECK = x が成り立つ
• 文字の終端には BASE=(マイナスの値)を設定する。
172010年4月23日金曜日
以下のルールにより実装される。
Double Array Trie Tree
• 配列は「BASE」と「CHECK」の二つの整数値をもっている。(この配列をBCとする)
• 文字を整数にマッピングするテーブルCODEにより、対象文字とBC配列のマッピングをする。(このマッピングテーブルをCODEとする)
• 節xにおいて文字cに対応する枝が存在し、その枝をたどることでyに辿りつくことが出来る時、BC[x].BASE + CODE[c] = y ならびに BC[y].CHECK = x が成り立つ
• 文字の終端には BASE=(マイナスの値)を設定する。
詳しくは以下のブログを御覧下さい(「Double Aray Trie Trie」「just-do-neet」で
辿りつけると思います。)http://ameblo.jp/just-do-neet/entry-10211041622.html
182010年4月23日金曜日
http://chasen.org/~taku/software/darts/
工藤拓氏が開発したDouble Aray Trie実装LGPLもしくはBSDライセンスで配布可。
MeCabやChaSenの内部構造で用いられている。
Darts
192010年4月23日金曜日
[O’Neil Delpratt 2006 ] Engineering the LOUDS Succinct Tree Representation
LOUDS→Level-Order Unary Degree Sequence木の表現を省サイズ化。- 木のポインタ表現は約96bit必要- LOUDS表現を用いると1ノードあたり約2bitに減らせる。
※http://www-tsujii.is.s.u-tokyo.ac.jp/~hillbig/papers/kvs_okanohara.pptx より表現引用
LOUDS
202010年4月23日金曜日
http://code.google.com/p/tx-trie/
岡野原大輔氏が開発したLOUDS実装BSDライセンスで配布可。
Google 日本語入力のデータを構築する際に使用されている模様(txのクローンライブラリrx)
tx
212010年4月23日金曜日
Darts付属の「linux.words」を用いて検証
※単位はbyte
ALGOLANSIARCOARPAARPANETASCII・・・
Darts vs tx(サイズ比較)
元サイズ 409,048
Darts 1,358,400
tx 174,070
222010年4月23日金曜日
• ワードサジェストの辞書データ構造には、求められる機能要件からTrie木構造が向いている。
• Trie木構築ライブラリの中ではLOUDSがオススメ。ライブラリは岡野原氏作成のtxが現在著名で、優秀。
• 実際のサジェストデモは後ほど
ここまでのまとめ
232010年4月23日金曜日
スペルチェック機能
• タイプミス、スペルミスと思われるワード• 上記ワードの正解データ(本来入力しようとした、と思われるワード)
をクエリーログを解析することにより抽出。スペルミス候補が入力されたら正解データをサジェスト。
242010年4月23日金曜日
ワードの距離の近さを元に算出する。二文字間の距離が近く、何かしらの条件を満たすものをスペルミス⇔正解データの対とする。
• 編集距離二文字間がどの程度異なっているかを示す数値- レーベンシュタイン距離- Jaro-Winkler距離
• コサイン距離(x・y /(|x|*|y|))
• ジャッカード距離(x・y /(Σxi+Σyi-x*y)) 等々
スペルミス⇔正解データ
252010年4月23日金曜日
ワードの距離の近さを元に算出する。二文字間の距離が近く、何かしらの条件を満たすものをスペルミス⇔正解データの対とする。
• 編集距離二文字間がどの程度異なっているかを示す数値- レーベンシュタイン距離- Jaro-Winkler距離
• コサイン距離(x・y /(|x|*|y|))
• ジャッカード距離(x・y /(Σxi+Σyi-x*y)) 等々
スペルミス⇔正解データ
A:さだまさしB:さらまわし
Aの「だ」と「さ」を「ら」と「わ」に置換すれば
同じ文字になる
262010年4月23日金曜日
以下のような実装が存在する(他にもあると思います)
• Oluolu方式(mixi)同一ユーザの「連続したクエリー」のうち「距離が近いクエリー」を抽出http://alpha.mixi.co.jp/blog/?p=1425
• Lucene方式距離が近いクエリーのうち「編集距離が近くて」「出現頻度が多い」ものを正解データ、少ないものをスペルミスhttp://wiki.apache.org/lucene-java/SpellChecker
スペルチェック機能各種
272010年4月23日金曜日
org.unigram.oluolu.rqe.RelatedQueryExtractionReducer.java
Oluolu
282010年4月23日金曜日
org.apache.lucene.spell.SpellCheker.java
Lucene
292010年4月23日金曜日
以下の仕様でアルゴリズムを実装し、実験。1.1日のクエリーログを抽出(ワード、出現頻度)
- Hadoopで解析
2.編集距離が近いペアを抽出- PPJoin+アルゴリズムで抽出
3.ペアのうち、出現頻度の落差が大きいものをスペルミス⇔正解データの候補として抽出
※類似度:0.8以上 出現頻度落差:1:10で実施
実験
302010年4月23日金曜日
[Chuan Xiao+ 2008]Efficient Similarity Joins for Near Duplicate Detection
Similarity Join系アルゴリズムの一つ(類似するペアを高速に抽出する技術)
「二つのデータ群を先頭から見たときにそれぞれに出現する同一データの出現位置」により一致度を判定。
※詳しくは以下のブログを見てください。(「PPJoin+」「just-do-neet」でググればたどり着きます)http://ameblo.jp/just-do-neet/entry-10317825348.html
[参考]PPJoin+
312010年4月23日金曜日
抽出できたワード(抜粋)
スペルミス 正解データ
アイアムレジェント アイ・アム・レジェンド
アプワイザーリッシュ アプワイザーリッシェ
ネイチャーリパプリックネイチャーパブリック ネイチャーリパブリック
荒川アンダーザブリッチ 荒川アンダーザブリッジ
クリスピークリームドーナッツ クリスピークリームドーナツ
アケミときどき純士 アケミと心ときどき純士
プリザードフラワー プリザーブドフラワー
322010年4月23日金曜日
精度評価
0
0.25
0.5
0.75
1
4/10 4/11 4/12 4/13 4/14 4/15 4/16 4/17 4/18 4/19 4/200
7.5
15
22.5
30
適合率ペア抽出件数スペルミス+表記ゆれスペルミス
332010年4月23日金曜日
• クエリー間の距離(編集距離)と、出現頻度の落差によりスペルミス⇔正解データの自動抽出は行える。
• 類似ワードのペア抽出はPPJoin+を使用。今のままだとスケールしないので要検討。
• もっと多くのクエリーログを収集しないと実用はまだ難しいか・・・
ここまでのまとめ
342010年4月23日金曜日
✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ
アジェンダ
352010年4月23日金曜日
手軽にワードサジェスト機能を実現できるフレームワークを作成中です。(辞書データさえあれば手軽にサジェスト機能が実現可)
以下のTrie木構造に対応(一部予定)- ナイーブなTrie木- Double Array Trie木- LOUDS(予定... txかrxをポーティング予定)
サジェストフレームワーク
362010年4月23日金曜日
http://nd-ilab.jp/suggest/sample/sada/index.html
デモ:さだまさし曲名サジェスト
372010年4月23日金曜日
http://nd-ilab.jp/suggest/sample/talent/index.html
デモ:Amebaタレント名サジェスト
382010年4月23日金曜日
http://nd-ilab.jp/suggest/sample/search/index.htmlAmebaサーチの1ヶ月分のクエリーデータを使用クエリー出現頻度順にサジェスト候補を並び替え
デモ:いわゆるワードサジェスト
392010年4月23日金曜日
http://nd-ilab.jp/suggest/sample/search/index.htmlAmebaなうの1ヶ月分の投稿データを元に絵文字と共起するワードを抽出し辞書とする。(以前つくった「Ameba絵文字IME」をJavaScript+Trie木構造にポーティング)Common Prefix Searchで候補を検索。
デモ:絵文字サジェスト
402010年4月23日金曜日
✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ
アジェンダ
412010年4月23日金曜日
クエリーログの解析結果を用いた応用機能について解説しました。- ワードサジェスト- スペルチェック
ワードサジェストについては手軽に使えるフレームワークを作成中です。興味の有る方は声をかけてください。(ライブラリ or APIの公開は5月中を予定)
まとめ
422010年4月23日金曜日
ご清聴ありがとうございました。
ロケ地:渋谷432010年4月23日金曜日