Solr 辞書とシノニム

Solrのシノニム(同義語)展開は少々癖がある。

シノニム検索は例えば 「めぞん一刻」 という書籍情報があり、ユーザーが間違って「めぞんいっこく」や「メゾン一国」など入力したときにも「めぞん一刻」で検索した結果を得るというものだ。

conf/synonyms.txtに以下のように記述すると期待した結果が得られるはずだ。

めぞん一刻,めぞんいっこく,メゾン一国

ところが、辞書をチューニングしていないと「めぞんいっこく」で検索しても想定通りの結果は得られない。
理由としては「めぞんいっこく」が名詞として辞書に登録されていないと

め ぞ ん いっ こく

と5単語に形態素解析されてしまう。
そのため、synonymの条件にHITしない。

lucene-gosenが利用する辞書に「めぞんいっこく」を単語登録しなければ、「めぞん一刻」「メゾン一国」には展開してくれない。

さて、次にこのようなパターンに備えて

めぞん,メゾン
いっこく,イッコク,一刻,一国

という風に変化しやすい部分を切って展開してみる。
このようにした方が組み合わせで対応できるので効率的である。
だが、この場合は正しく1単語として認識されない文字を一つずつ辞書に登録しなければならない。
「めぞん」は め ぞ ん になってしまうし、「いっこく」は いっ こく であるから、それぞれ辞書に登録しないと他の単語には展開されない。

ここまでは変換ミスなどを想定したカバー方法で、次は勘違いレベルの場合だ。
かなり極端な例だが、どこでどう間違ったか
「デジョン一刻」
と検索されるケースが非常に多いとする。

この場合も取りうるケースとしては2パターンで

めぞん一刻,めぞんいっこく,メゾン一国,デジョン一刻

として、辞書にも「デジョン一刻」で1単語登録する。
もう1パターンは

めぞん,メゾン,デジョン
いっこく,イッコク,一刻,一国

で「デジョン」で1単語登録(naist-chasenでは デ ジョン で解析された)。
※ ちなみに片仮名->平仮名の正規化フィルタを実装している場合は全て平仮名でsynonyms.txtを統一すればよく、いちいち対応する必要はないので楽。

上記2パターンでの検索結果の違いだが、「めぞん一刻」1単語の検索では、INDEX内に展開先の「めぞん一刻」「めぞんいっこく」「メゾン一国」のいずれかがなければ検索結果に出ない。
対して「めぞん」「一刻」の2分割パターンでは、INDEX内に「めぞん」の展開先と「一刻」の展開先が両方存在すれば検索にかかる。
検索としては後者の方が有効な場面が多いと思う。

しかし、この例だと「めぞん」で検索したときも他の「デジョン」を含む結果が返ってしまう。

勘違いの特殊ケースは一方通行展開にして切り分ける。
ただし注意がある。

めぞん,メゾン
いっこく,イッコク,一刻,一国
デジョン一刻=>めぞん一刻

このように設定した場合、「デジョン一刻」で「めぞん一刻」はかからない。
何故なら、シノニム展開後のキーワードはTokenizeされないため、「めぞん一刻」という1単語での検索になる。
上記例でのIndexing時に働くシノニムでは「めぞん一刻」は「めぞん」「一刻」に分割されているはずなので、1単語での検索はHITしなくなってしまうというわけだ。
では「めぞん一刻」を辞書登録しておこうではないか、ということになるが、安易に辞書登録してしまうと、今度はIndexing時に「めぞん一刻」1単語でTokenizerが認識するため、せっかく分割した「めぞん」「一刻」の2単語はシノニム展開されなくなってしまうのだ。

そこで、苦肉の策だが

デジョン一刻=>デジョン,めぞん,一刻

と、query側を展開してやると、3単語検索になって、もともと本来の意味で「デジョン」を持つコンテンツもHITするし、「めぞん一刻」もHITするようになる。

ちなみにsynonym filterにつかうsynonyms.txtはこのような例のときのために、queryとindexで分けた方が良いと思われる。

fieldtypeの設定時にanalyzerをtype=”index”とtype=”query”で分け、
それぞれ

Query側
<filter class=”solr.SynonymFilterFactory” synonyms=”synonyms_query.txt” ignoreCase=”true” expand=”true”/>

Index側
<filter class=”solr.SynonymFilterFactory” synonyms=”synonyms_index.txt” ignoreCase=”true” expand=”true”/>

とすることが可能。

カテゴリー: Solr   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です