検索エンジンを作る

第9回検索と論理式その2]

前回はFINDSPOTのAND条件について解説しました。今回は、それ以外の論理式の実現方法と、N-gramのノイズ語の扱いに関する課題について説明します。

NOT条件

前回解説したAND条件は、目的の検索語を複数指定することで検索対象を絞り込むことができました。絞り込み時に特定の文字列を含まないものが指定できると便利です。FINDSPOTではこのような場合にはNOTという演算子を用います。

この検索式は、⁠豊臣秀吉」を含んでいる文書から、⁠織田信長」を含まないものを抜き出す検索を行います。

NOT条件はAND条件とよく似た方法で実現しています。先の例ではAND条件の処理と同様、最初に「豊臣秀吉」を含む文書集合と、⁠織田信長」を含む文書集合を全文検索して求めます。次に、⁠豊臣秀吉」を含む文書集合と、⁠織田信長」を含む文書集合との間での否定の集合演算を行います。ここでの否定演算とは「豊臣秀吉」を含む文書集合から、⁠織田信長」を含む文書集合の要素を省いた文書集合を求める演算となります。このようにすると、AND条件とさほど変わらぬ手順で結果の文書集合を得ることができます。違いは、文書集合同士の論理積(AND)ではなく、否定(NOT)であるという点です。

なお、FINDSPOTでは「NOT "文字列"」のようにNOTの前に前置される文字列を指定せず、いきなりNOTの演算子を用いることはできません。

OR条件

複数の文字列のいずれかが含まれている文書を探したい時があります。このような場合にはFINDSPOTではORという演算子を使用します。

この検索式は、⁠豊臣秀吉」⁠羽柴秀吉」いずれかの文字列が含まれている文書を検索します。

FINDSPOTではOR条件も集合演算の形で実現しています。この例では、最初に「豊臣秀吉」を含む文書集合と「羽柴秀吉」を含む文書集合を全文検索して求めます。次に2つの文書集合に対して論理和(OR)の集合演算を行い、結果の文書集合を得ます。

複数条件と括弧

AND条件, OR条件, NOT条件はFINDSPOTの内部ではすべて文書集合どうしの集合演算に置き換えることで実現しています。このようにすることで、AND条件, OR条件, NOT条件がどのような順序で混在して現れても、演算子の現れた箇所で該当する集合演算を行えば目的の条件による検索が行えます。

複数条件の検索式は論理演算の順序によって結果が異なってきます。FIDSPOTでは暗黙の優先順位は

文字列1 論理記号1 文字列2 論理記号2 文字列3

のように指定された場合には、次のようになります。

文字列1 論理記号1 ( 文字列2 論理記号2 文字列3 )

つまり、⁠文字列2 論理記号2 文字列3」の部分が最初に計算され、得られた文書集合と、文字列1の全文検索結果との間で論理記号1に基づく集合演算が行われ、答えが計算されます。

もしも検索式がこの暗黙の優先順位とは意図が違ってしまう場合には明示的に括弧を補って論理式の演算順位を示すことができます。たとえば検索式を次のように指定したとします。

この検索式は「織田信長」を含む文書もしくは「豊臣秀吉」「戦国時代」の両方を含む文書を検索するという意味になります。()を補うとわかりやすくなります。

もしも「織田信長」もしくは「豊臣秀吉」を含み、かつ「戦国時代」を含む文書を検索したい場合には次のように()を補って検索式を指定します。

NOT条件によるノイズ語の排除

これまでに何度も解説したように、FINDSPOTはN-gramの方式を用いて全文検索を行います。N-gramの方式は、検索時にノイズを拾ってしまうという宿命があります。たとえば、⁠京都」という文字列で検索を行うと「東京都」を含む文書も一緒に検索されてしまいます。これは「東京都」に、⁠京都」という文字列が部分文字列として含まれているためです。このようなノイズ語の例は他にも次のようなものがあります。

検索語ノイズ語
本人日本人
カウントアカウント,ディスカウント
コアココア,スコア
プリンチャップリン,プリンタ
ステラカステラ
タイルスタイル
ラブクラブ,グラブ,シラブ,トラブ,トラブル

この特性はN-gram方式の厳密さをよく表していると言えますが、一方でN-gramの方式が使いにくいという批判につながることがあります。N-gram方式の弱点とも言えるこの問題は、NOT条件の機能を利用してノイズ語を含む文書を検索結果から除くことで回避できます。

この例では、⁠京都」を全文検索して得られた文書集合から「東京都」を全文検索して得られた文書集合を含まない文書集合を求めています。この検索式により「東京都」を含まない「京都」のみの文書集合が得られます。

ノイズ語の自動除去に関する課題

この方法はN-gramのノイズ語の扱いに関する解決案として示されることが多いのですが、実はちょっとした弱点があります。先の例では、⁠京都」を含む文書集合から「東京都」を含む文書集合を削って結果を求めているため、⁠京都」「東京都」の両方を含む文書については、結果の集合から削られてしまい、検索結果には表れてきません。さらに、ノイズ語が検索結果に表れた場合にはNOT条件を手動で補わなければならないというのも面倒です。このような点は、FINDSPOTの改良ポイントであると考えており、現在、ノイズ語の自動除去機能を検討しています。

試しにFreeWnnの辞書を元にノイズ語候補を求めるプログラムを実行してみた所、約2,700例ほどが自動的に抽出できました。しかし、このように自動的に抽出されたものをそのままノイズ語の自動除去対象として扱うと、問題のあることがわかっています。

辞書の見出しデータからノイズ語を探すプログラムを実行すると、たとえば、⁠勝利」に対して「大勝利」がノイズ語候補として得られます。しかし、⁠勝利」という文字列の検索時に、自動的に「大勝利」の検索結果を除去してしまうのは利用者の意図とは異なる可能性が高いと考えられます。つまり、⁠勝利」「大勝利」は意味的に補完の関係にあるためノイズ語候補とするのは問題があるのです。このような例は「幼児」「乳幼児⁠⁠、⁠本人」「張本人」などがあります。また「信任」「不信任」のように反意語についてもノイズ語とすると、検索時に思ったような結果が得られない可能性があります。

このように、ノイズ語の辞書作りは、意味的に同じ言葉、補完的な言葉、反意語などを除く必要があるため、人手の選定作業が必要になってきます。ノイズ語の辞書作りは大変な作業ですが、N-gramの欠点を補える可能性があるので、なんとか実現にこぎ着けたいと思っています。

おすすめ記事

記事・ニュース一覧