検索エンジンの日本語トークナイズメモ
トークナイズ処理
- 「検索クエリ」に対してマッチする「ドキュメント」を高速に検索するためにインデクス(索引)を作成する
- 本の最後の方にある「用語 - ページ」のような感じで、速く目的の用語が書いてあるページを調べられる
- インデクスは、日本語の場合文字が連続しているため、「形態素」や「(文字)N-gram」などが使われる
文1「六本木ヒルズに行った」 文2「青山さんから電話があった」 【形態素でインデクスを作成する場合の例】 文1:「六本木ヒルズ」「に」「行く」「た」 文2:「青山」「さん」「から」「電話」「が」「あっ」「た」 【文字2-gram(bigram)でインデクスを作成する場合】 文1:「六本」「本木」「木ヒ」「ヒル」「ルズ」「ズに」「に行」「行っ」「った」 文2:「青山」「山さ」「さん」「んか」「から」「ら電」「電話」「話が」「があ」「あっ」「った」
- 「転置インデクス」はこれを逆にしたもので、以下のように保持することで、そのインデクスを持つ文を高速に探せる
六本木ヒルズ:文1 青山:文2 た:文1、文2 ...
トークナイズ処理における問題
- 「六本木ヒルズ」というインデクスを作ってしまうと、検索クエリで「ヒルズ」が来た場合、転置インデクス内には完全マッチするものはないので、検索できず検索漏れになる
- なので、できるだけ短めの単位でインデクスが作られている方がよかったりするが、短くすると意味が違ってしまうものまで拾ってしまう可能性がでてくる
- また、検索クエリ側でもインデクスと同じ処理をし単位をそろえる必要があるが、形態素解析などを使うと「クエリの解析結果」と「文章中での解析結果」がちょっと変わってしまったりすることがある
- 高橋,颯々野,「情報検索のための単語分割一貫性の定量的評価」,NLP2016
- http://research-lab.yahoo.co.jp/nlp/20160307_ftakahas.html
- カタカナ、アルファベット、数字、記号などは、日本語の形態素解析ではきちんと解析されない場合、それらを含む検索に失敗する可能性もある
- 字種交じりだと切れ目がおかしくなりやすい
基本処理・工夫
形態素+N-gramでのハイブリットインデクシング
http://www.slideshare.net/techblogyahoo/17lucenesolr-solrjp-apache-lucene-solrnbest
辞書登録による解析単位の調整
同上
- 短い単位に解析されるよう辞書に登録
- 登録するのが大変(保守も大変)
kuromojiのSEARCH MODE
品詞や文字の正規化・除外・ストップワード
http://www.rondhuit.com/solr%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AF%BE%E5%BF%9C.html
トークンの部分一致検索
- (長めの)形態素の部分文字列を高速に検索できるようにしておくことで、検索ヒット数が少ない場合の検索再現率を改善
- 形態素(トークン)に対して、半無限文字列(i文字目から最後の文字までの部分文字列)を前方一致で検索
- suffix array的な感じ。パトレシアトライなどを使っている模様
表記ゆれ、同義語の考慮
同上
- 表記が「サーバー」「サーバ」や「バイオリン」「ヴァイオリン」など揺れる可能性がある
- これらを同一視できるような辞書を用意して統一しておく