Comments
Description
Transcript
類似文字列検索してますか? - Overlasting::Life
類似文字列検索 してますか @overlast 自己紹介 • 名前 : 佐藤敏紀(@overlast) • blog : Overlasting::Life (http://diary.overlasting.net/) • 仕事 : 宝の地図探し – クエリ訂正システムの開発に従事 • 関心 : 検索・関係抽出・データ圧縮・機械学習 参考文献 • Flexible Pattern Matching in Strings • バイオインフォマティクスの ためのアルゴリズム入門 • 高速な類似文字列検索アルゴ リズム,岡崎直観, 辻井潤一 アジェンダ • 曖昧な情報を処理する能力 • ゼロ件ヒット問題 • 曖昧な文字列で正しい文字列を探す方法 • Apporo の紹介と動作デモ 曖昧な情報を処理する能力 • 人間の曖昧な情報の処理能力は高い – 曖昧な質問に対する答えを見つけられる • ものまね芸、や、各種の画像検索 – 結果がユーザの記憶や欲求と関連すれば正解 • 曖昧情報の処理は文字列処理にこそ必要 – 結果の理由を明確に説明できれば正解 – 結果の理由説明が困難でも便利なら正解 ゼロ件ヒット問題 • 検索結果がゼロ件になってしまう問題 – ゼロヒット、ゼロマッチなど様々な呼び方 • ゼロマッチ後に、ワンクリックorゼロクリックで 目的のページに辿りつくのが便利なサイト • 大手サイトは対応してる場合がある • 中小サイトだとなかなか対応する余力がない現実 • 「ゼロ件ヒットは機会損失」だ、と覚えましょう 「正しい文字列」は少なくとも2種類 • 正しさ1. 表記誤りが無い • 表記誤りあり 「スータバックスコーヒー」 • 表記誤り無し 「スターバックスコーヒー」 • 正しさ2. 心の底で求めている • 何とか思いついた文字列 「トトロの森美術館」 • 心の底で探してる文字列 「三鷹の森ジブリ美術館」 – 異表記同義語、同表記異義語、異言語表記等もある 正しい文字列を探す手法 クエリ表記誤りなし クエリ表記誤りあり ⃝ 探したい対象が明確 普通の検索 △ : 表記がヒント 表記の似た 文字列を検索 △ :表記以外がヒント × 探したい対象が曖昧 同じ対象に到達で 対処できない。 きる文字列を探す 人気順結果を表示 • パターン1. 表記をヒントにできる場合 → 事前に用意した資源から文字列距離の近い文字列を探す • パターン2. 表記をヒントにできない場合 → 文字列と文書の共起からグラフを作り、そこから探す 曖昧な文字列で正しい文字列を探す方法 • 「正しさ」はユーザの心のなかによって変わる – 表記誤りの無い文字列 or 心の底で求めている文字列 • 低コストで対応できる 2 種類の曖昧な文字列 – 表記があいまい + 探したい対象が明確 • 事前に用意した辞書から、正しい表記を探す – 表記に誤りがない + 探したい対象が曖昧 • 与えられた正しい表記から、関連する別の語を探す • 後者に高性能で対応するには大規模ログが必要 Approximate String Matching Engine 近似文字列照合エンジン Apporo http://code.google.com/p/ apporo/ Apporoの用途の例 • 検索結果がゼロになることを防止するために使う – クエリ訂正の簡易版を実現できる • メリット – 検索結果ゼロ件による機会損失が減る – 検索結果ゼロ件を防ぐための辞書を メンテナンスするためのコストを減らす • 表記ゆれ(既知な単語とほぼ同じ表記 & 既知な単語と完 全に同義)対応、略語対応、ノイズ文字の事前削除など • デメリット – (きちんと調整すれば) とくにない Apporoの使い方 • 事前準備 – 結果を得られる単語で辞書をつくる • 例) 結果がゼロ件に(ならない|なる)クエリを収集する – ゼロ件にならないクエリで辞書をつくる – ゼロ件になるクエリは詳細に分析する – 辞書をApporoでindexingする • ユーザによる検索時 : 結果がゼロの時だけApporoを起動 – 誤りクエリに表記が近い辞書中の単語をApporoで探す – Apporoから得た結果を使い、ユーザのストレスを減らす 使用例) - 第一位の結果で勝手に検索する - 結果リストの上位を表示する Apporo 割と良いですよ • Apporoは小∼中規模のWebサービスで 検索クエリの訂正をする用途にオススメ – Apporo 以外にも優秀なライブラリがある • SimString : http://www.chokkan.org/software/simstring/ • 現在は文字列の表層に基づき検索している – 今後は「読み仮名」や「ローマ字表記」に 基づく類似文字列検索を実現する • 高速化のための改良も頻繁にしている Apporoの 技術概要 Apporoの概要 • 用途 – 事前に用意した辞書のエントリを、 誤りを含むクエリに見た目が似ている順で取得する • 今後、読みが似ている順で取得できるようになる • 目立った技術 : 独自の新技術は特に無し – Suffix Array – N-gram Search ベースの近似文字列照合 – Bit Parallel Matching による編集距離計算 • 使用しているプログラミング言語 : C++ • 他言語対応 : Perl (今後 Python, Ruby, Java) ngram化 スータバ あ、スタバ Ngram Query Suffix Array 文字列距離で 昇順ソート String Distance SA上での位置を取得 位置頻度で昇順ソート Doc ID SAからIDのKeyを取得 DocID を取得 頻度を集計 Apporoのソースコード コード名 概要 apporo.cc 一番外側のインターフェイス apporo_config.cc configファイルの読み込み apporo_search.cc 検索機能のコア部分 apporo_query.cc ngramクエリの生成 apporo_strdistance.cc 文字列間距離の計算 apporo_tsubomi_db.cc Suffix Array のtsubomiをラップ apporo_utf8.cc UTF-8文字に関する処理 apporo_util.cc どこにも属さない便利関数群 apporo_searcher.cc apporo_searcherの本体 apporo_index.cc apporo_indexerの本体 apporo.cc approximate_match()とサンプル設定ファイルで流れは分かる conf/sample.conf apporo_query.cc & apporo_strdistance.cc コンストラクタ周辺が理解に役立つ apporo_search.cc 検索まわりは毎日更新しまくり apporo_tsubomi_db.cc 簡潔構造でrankが速い実装と置き換えたい apporo_strdistance.cc 64bit以下はビット並列マッチで距離を得る 簡単な実験 • データ : 英語のWikipediaのタイトル – 8,636,112 エントリ, 199.6Mbyte • クエリ : micael_jackson • 環境 : 2.4GHz Intel Core Duo2, Memory 4GB, HDD 500GByte 検索パラメタ 検索時間 2gram is_pref is_suf 8.04sec 2gram is_pref is_suf dice(0.7) 2.85sec 3gram is_pref is_suf 2.04sec 3gram is_pref is_suf dice(0.7) 0.36sec 4gram is_pref is_suf 1.37sec 4gram is_pref is_suf dice(0.7) 0.18sec 5gram is_pref is_suf 0.05sec Apporoの今後のToDO • • • • • マニュアル、ドキュメントの整備 テストコードの整備 索引とクエリの各種正規化 読み仮名検索、ローマ字検索 高速化 – 探索の枝刈りの精度を向上 – Vertical Code – Suffix Array から Trie への置き換え – pthread • • • • 形態素単位index 各種言語バインディング 自前のDBを利用する 現実社会で導入してもらう Apporoの開発モチベーション • 日常の無駄な時間を減らしたい • 時間を得するライブラリをつくる • 現実社会に広く導入してもらう • 便利なアプリケーションが増える • まわりまわって、いつか自分が得をする まとめ • 人間は曖昧な情報を処理する能力が高い • ゼロ件ヒット問題は放置すると機会を損失 • 誤りクエリの訂正は検索ログなしでもできる • Apporo は誤りクエリの訂正に気軽に使える ご清聴どうもありがとう ございました。