N−gramとは |
|
「N文字インデックス法」「Nグラム法」などともいう。検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(uni-gram)」、2なら「バイグラム(bi-gram)」、3なら「トライグラム(tri-gram)」と呼ばれる。たとえば「全文検索技術」という文字列の場合、「全文」「文検」「検索」「索技」「技術」「術(終端)」と2文字ずつ分割して索引化を行ってやれば、検索漏れが生じず、辞書の必要も無い。しかし形態素解析によるわかち書きに比べると、意図したものとは異なる検索結果(検索ノイズ=「京都」で検索すると「東京都庁」がヒットするなど)が生じることが多く、インデックスのサイズも肥大化しがちであることが欠点とされる。(wikipediaより) |
つまり、どういう事かというと、検索対象となるデータの内容から事前に索引を作ってしまえという事です。もちろんデータは膨大になります。でもどうせgoogleさんのサーバを無料で利用しますからね(笑)
例)
百人一首から、小野小町の「花の色は移りにけりないたづらに わが身世にふるながめせしまに」という一首が検索対象だとすると、索引を以下のように作成します。
トライグラム(3文字)
1件目 :【花の色】
2件目 :【の色は】
3件目 :【色は移】
4件目 :【は移り】
5件目 :【移りに】
:
途中省略
:
最後から2件目:【しまに】
最後から1件目:【まに】
最後 :【に】
そして、この索引のデータとして、対照データのキー(実際のキーでなくとも、ユニークに検索可能ならばOK)を保存し、それを元に検索結果を返すという事をするわけです。
全文検索での、N−Gram とは別に形態素解析というのもあって、辞書を利用して、語・単語(word)単位で分けて索引を作成するというのもあります。そして、この二つを利用して検索するのがBESTだとされています。
しかしこの形態素解析は、日本語向けではありません。というのも、英語は、word の間に通常空白が入りますが、日本語は副詞だとか接尾語だとか、色々と面倒なものが付いていたりします。しかも日本語の辞書が少ないらしく、英語のように簡単に区切るのが難しいようです。
そこで、N−gramだけで作ってしまおうと思ったわけですが、
どうせならば、このNーgramのNを2とか3とか固定にせずに、文章の最後までを索引にしてしまおうと考えたわけです。
そうすれば、後はその検索する内容の頭からの桁数だけ比較していけば、欲しいデータが検索可能となるはずです。
例)
上記の一首から索引は、以下のように作成します。
1件目 :【花の色は移りにけりないたづらに わが身世にふるながめせしまに】
2件目 :【の色は移りにけりないたづらに わが身世にふるながめせしまに】
3件目 :【色は移りにけりないたづらに わが身世にふるながめせしまに】
4件目 :【は移りにけりないたづらに わが身世にふるながめせしまに】
5件目 :【移りにけりないたづらに わが身世にふるながめせしまに】
:
途中省略
:
最後から2件目:【しまに】
最後から1件目:【まに】
最後 :【に】
こうして、先頭から検索文字数分だけ、同じ内容のデータを探し出せば、完璧ではありませんか?
(もちろん、ノイズは防げませんが…)
これが、日本語全文検索の考え方です。
この検索のやり方であれば、複数文字列のAND 条件での検索も、そんなに難しくはありません。
検索する際に、条件を付加するだけです。(おそらく、SQL の IN 条件と同じやり方で上手くいくと思われます)
|