amebaサーチのデータを用いた応用

43
Amebaサーチのデータを用いた応用 1 2010423日金曜日

Upload: moai-kids

Post on 15-Jan-2015

1.534 views

Category:

Technology


4 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Amebaサーチのデータを用いた応用

Amebaサーチのデータを用いた応用

12010年4月23日金曜日

Page 2: Amebaサーチのデータを用いた応用

クエリーログは宝の山

•ユーザーの興味関心事がわかる•正確な単語リストが自動的に得られる•クエリーログの解析結果を応用することで利便性の高いサービスを提供出来る。

22010年4月23日金曜日

Page 3: Amebaサーチのデータを用いた応用

例:急上昇ワード

※今日は触れません32010年4月23日金曜日

Page 4: Amebaサーチのデータを用いた応用

例:ワードサジェスト

42010年4月23日金曜日

Page 5: Amebaサーチのデータを用いた応用

例:もしかして機能

52010年4月23日金曜日

Page 6: Amebaサーチのデータを用いた応用

✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ

アジェンダ

62010年4月23日金曜日

Page 7: Amebaサーチのデータを用いた応用

ワードサジェスト機能

suggest【他動】1.~を[~しようと]提案する[提言する・勧める]、〔提案などを〕持ちかける2.〔悪いことを〕入れ知恵する3.〔名前や表現などが〕~を意味する、示唆する、暗示する、それとなく示す[言う]

入力された条件にふさわしいと思われる候補を推薦する。

より狭義には入力文字列と前方一致する文字列集合を返す。

72010年4月23日金曜日

Page 8: Amebaサーチのデータを用いた応用

少ない辞書データであれば手軽に実現できる。(テキストファイル+JavaScript)(suggest.jsやjquery suggestなどが便利)

大規模の辞書データを扱う際に工夫が必要になる。- データの効率的な格納- 高速な文字列検索

特に難しくないのでは?

82010年4月23日金曜日

Page 9: Amebaサーチのデータを用いた応用

以下のような文字列検索が行える必要がある。- 完全一致:exact match

- 東京都→東京都- 前方一致:predictive match

- 東京→東京事変、東京03、東京大神宮、東京ドーム...

- 共通接頭辞検索:common prefix search- 東京都→東京、東京都

適切なデータ構造は...※Key Value Storeはexact matchしかできないので不適

サジェストの機能要件

92010年4月23日金曜日

Page 10: Amebaサーチのデータを用いた応用

順序付き木構造の一種。

ルートノード(右図最上位ノード)に下位ノードが階層的にぶら下がる。文字列の場合、文字の先頭から順にノードがぶら下がることになる。

Trie木(トライ木)

102010年4月23日金曜日

Page 11: Amebaサーチのデータを用いた応用

クエリー:tea

ルートノードから該当するノードを走査クエリー文字列と経路が同一でかつ終端ノードとなるノードが存在する場合、一致。

exact match(完全一致)

112010年4月23日金曜日

Page 12: Amebaサーチのデータを用いた応用

クエリー:te

ルートノードから該当するノードを走査クエリー文字列の配下にぶら下がるノード集合(今回はtea,ted,ten)が存在する場合、それらを全て返す。

predictive match(前方一致)

122010年4月23日金曜日

Page 13: Amebaサーチのデータを用いた応用

クエリー:inn

ルートノードから該当するノードを走査走査中に存在する終端ノードを全て返す(今回はin,inn)

common prefix search

132010年4月23日金曜日

Page 14: Amebaサーチのデータを用いた応用

以下の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日金曜日

Page 15: Amebaサーチのデータを用いた応用

[J Aoe 1989 ] An Efficient Digital Search Algorithm by Using a Double-Array Structure

要素に数値を持つ二つの配列(BASE/CHECK)を用いる事でTrie木を表現するアルゴリズム。

Double Array Trie Tree

152010年4月23日金曜日

Page 16: Amebaサーチのデータを用いた応用

メリット• 木構造を数値だけで表現できるため検索速度が高速。• 同様の理由で木構造を省サイズ化できる。

Double Array Trie Tree

162010年4月23日金曜日

Page 17: Amebaサーチのデータを用いた応用

以下のルールにより実装される。

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日金曜日

Page 18: Amebaサーチのデータを用いた応用

以下のルールにより実装される。

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日金曜日

Page 19: Amebaサーチのデータを用いた応用

http://chasen.org/~taku/software/darts/

工藤拓氏が開発したDouble Aray Trie実装LGPLもしくはBSDライセンスで配布可。

MeCabやChaSenの内部構造で用いられている。

Darts

192010年4月23日金曜日

Page 20: Amebaサーチのデータを用いた応用

[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日金曜日

Page 21: Amebaサーチのデータを用いた応用

http://code.google.com/p/tx-trie/

岡野原大輔氏が開発したLOUDS実装BSDライセンスで配布可。

Google 日本語入力のデータを構築する際に使用されている模様(txのクローンライブラリrx)

tx

212010年4月23日金曜日

Page 22: Amebaサーチのデータを用いた応用

Darts付属の「linux.words」を用いて検証

※単位はbyte

ALGOLANSIARCOARPAARPANETASCII・・・

Darts vs tx(サイズ比較)

元サイズ 409,048

Darts 1,358,400

tx 174,070

222010年4月23日金曜日

Page 23: Amebaサーチのデータを用いた応用

• ワードサジェストの辞書データ構造には、求められる機能要件からTrie木構造が向いている。

• Trie木構築ライブラリの中ではLOUDSがオススメ。ライブラリは岡野原氏作成のtxが現在著名で、優秀。

• 実際のサジェストデモは後ほど

ここまでのまとめ

232010年4月23日金曜日

Page 24: Amebaサーチのデータを用いた応用

スペルチェック機能

• タイプミス、スペルミスと思われるワード• 上記ワードの正解データ(本来入力しようとした、と思われるワード)

をクエリーログを解析することにより抽出。スペルミス候補が入力されたら正解データをサジェスト。

242010年4月23日金曜日

Page 25: Amebaサーチのデータを用いた応用

ワードの距離の近さを元に算出する。二文字間の距離が近く、何かしらの条件を満たすものをスペルミス⇔正解データの対とする。

• 編集距離二文字間がどの程度異なっているかを示す数値- レーベンシュタイン距離- Jaro-Winkler距離

• コサイン距離(x・y /(|x|*|y|))

• ジャッカード距離(x・y /(Σxi+Σyi-x*y)) 等々

スペルミス⇔正解データ

252010年4月23日金曜日

Page 26: Amebaサーチのデータを用いた応用

ワードの距離の近さを元に算出する。二文字間の距離が近く、何かしらの条件を満たすものをスペルミス⇔正解データの対とする。

• 編集距離二文字間がどの程度異なっているかを示す数値- レーベンシュタイン距離- Jaro-Winkler距離

• コサイン距離(x・y /(|x|*|y|))

• ジャッカード距離(x・y /(Σxi+Σyi-x*y)) 等々

スペルミス⇔正解データ

A:さだまさしB:さらまわし

Aの「だ」と「さ」を「ら」と「わ」に置換すれば

同じ文字になる

262010年4月23日金曜日

Page 27: Amebaサーチのデータを用いた応用

以下のような実装が存在する(他にもあると思います)

• Oluolu方式(mixi)同一ユーザの「連続したクエリー」のうち「距離が近いクエリー」を抽出http://alpha.mixi.co.jp/blog/?p=1425

• Lucene方式距離が近いクエリーのうち「編集距離が近くて」「出現頻度が多い」ものを正解データ、少ないものをスペルミスhttp://wiki.apache.org/lucene-java/SpellChecker

スペルチェック機能各種

272010年4月23日金曜日

Page 28: Amebaサーチのデータを用いた応用

org.unigram.oluolu.rqe.RelatedQueryExtractionReducer.java

Oluolu

282010年4月23日金曜日

Page 29: Amebaサーチのデータを用いた応用

org.apache.lucene.spell.SpellCheker.java

Lucene

292010年4月23日金曜日

Page 30: Amebaサーチのデータを用いた応用

以下の仕様でアルゴリズムを実装し、実験。1.1日のクエリーログを抽出(ワード、出現頻度)

- Hadoopで解析

2.編集距離が近いペアを抽出- PPJoin+アルゴリズムで抽出

3.ペアのうち、出現頻度の落差が大きいものをスペルミス⇔正解データの候補として抽出

※類似度:0.8以上 出現頻度落差:1:10で実施

実験

302010年4月23日金曜日

Page 31: Amebaサーチのデータを用いた応用

[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日金曜日

Page 32: Amebaサーチのデータを用いた応用

抽出できたワード(抜粋)

スペルミス 正解データ

アイアムレジェント アイ・アム・レジェンド

アプワイザーリッシュ アプワイザーリッシェ

ネイチャーリパプリックネイチャーパブリック ネイチャーリパブリック

荒川アンダーザブリッチ 荒川アンダーザブリッジ

クリスピークリームドーナッツ クリスピークリームドーナツ

アケミときどき純士 アケミと心ときどき純士

プリザードフラワー プリザーブドフラワー

322010年4月23日金曜日

Page 33: Amebaサーチのデータを用いた応用

精度評価

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日金曜日

Page 34: Amebaサーチのデータを用いた応用

• クエリー間の距離(編集距離)と、出現頻度の落差によりスペルミス⇔正解データの自動抽出は行える。

• 類似ワードのペア抽出はPPJoin+を使用。今のままだとスケールしないので要検討。

• もっと多くのクエリーログを収集しないと実用はまだ難しいか・・・

ここまでのまとめ

342010年4月23日金曜日

Page 35: Amebaサーチのデータを用いた応用

✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ

アジェンダ

352010年4月23日金曜日

Page 36: Amebaサーチのデータを用いた応用

手軽にワードサジェスト機能を実現できるフレームワークを作成中です。(辞書データさえあれば手軽にサジェスト機能が実現可)

以下のTrie木構造に対応(一部予定)- ナイーブなTrie木- Double Array Trie木- LOUDS(予定... txかrxをポーティング予定)

サジェストフレームワーク

362010年4月23日金曜日

Page 37: Amebaサーチのデータを用いた応用

http://nd-ilab.jp/suggest/sample/sada/index.html

デモ:さだまさし曲名サジェスト

372010年4月23日金曜日

Page 38: Amebaサーチのデータを用いた応用

http://nd-ilab.jp/suggest/sample/talent/index.html

デモ:Amebaタレント名サジェスト

382010年4月23日金曜日

Page 39: Amebaサーチのデータを用いた応用

http://nd-ilab.jp/suggest/sample/search/index.htmlAmebaサーチの1ヶ月分のクエリーデータを使用クエリー出現頻度順にサジェスト候補を並び替え

デモ:いわゆるワードサジェスト

392010年4月23日金曜日

Page 40: Amebaサーチのデータを用いた応用

http://nd-ilab.jp/suggest/sample/search/index.htmlAmebaなうの1ヶ月分の投稿データを元に絵文字と共起するワードを抽出し辞書とする。(以前つくった「Ameba絵文字IME」をJavaScript+Trie木構造にポーティング)Common Prefix Searchで候補を検索。

デモ:絵文字サジェスト

402010年4月23日金曜日

Page 41: Amebaサーチのデータを用いた応用

✓クエリーログを用いた応用-ワードサジェスト-スペルチェック✓応用アプリのデモ✓まとめ

アジェンダ

412010年4月23日金曜日

Page 42: Amebaサーチのデータを用いた応用

クエリーログの解析結果を用いた応用機能について解説しました。- ワードサジェスト- スペルチェック

ワードサジェストについては手軽に使えるフレームワークを作成中です。興味の有る方は声をかけてください。(ライブラリ or APIの公開は5月中を予定)

まとめ

422010年4月23日金曜日

Page 43: Amebaサーチのデータを用いた応用

ご清聴ありがとうございました。

ロケ地:渋谷432010年4月23日金曜日