[Senna-dev 622] Re: tritonnの近傍・関連文書検索について

Back to archive index

morit****@razil***** morit****@razil*****
2007年 6月 27日 (水) 22:04:51 JST


はじめまして。森と申します。

>>> yukio ishi さんは書きました:
> はじめまして、石野と申します。
> Senna+mysql+tritonnで、近傍・関連文書検索を試させていただいているのですが、
> 私の環境の問題でしょうか、正しく動作していないような気がします。
> この検索結果で正しい動作なのか、またどういった仕組みでマッチしているのか、
> ご存知の方いらっしゃいましたらご教授願えませんでしょうか。どうぞよろしくお願い致します。

ちょっと違和感を感じられるかも知れませんが、いずれも正しく動作しています。

それぞれの動作の仕組みについて説明します。

> mysql> CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE
> = MyISAM DEFAULT CHARSET utf8;
> 
> mysql> INSERT INTO t1 VALUES ("明日は晴れです。");
> mysql> INSERT INTO t1 VALUES ("今日は雨です。");

■関連文書検索演算子(*S)について

*S条件は、
「指定された文字列から特徴的な語を抜き出し、そのいずれかを含む文書を検索する」
ことを指示します。引数の数値は、抜き出す特徴語の数を示します。
各語の特徴量はインデックスに格納されている文書中での出現回数によって決まります。
(出現回数が少ないほど特徴的な語だとみなされます。)

今回の例はNグラムインデックスですから、

  '今日は晴れです。'

というクエリ文字列は、

  今日 / 日は / は晴 / 晴れ / れで / です / す。

という7つの語に分解できます。それぞれの語の総文書中での出現回数は

  今日: 1回
  日は: 2回
  は晴: 1回
  晴れ: 1回
  れで: 1回
  です: 2回
  す。: 2回

となります。(「日は」「です」「す。」の3つは両方のレコードに含まれるので)

特徴語の候補は、

  今日: 1
  は晴: 1
  晴れ: 1
  れで: 1

の4つにしぼられ、最終的に「は晴」「晴れ」「れで」の3つが選ばれています。
(特徴量が同一だったら、エンジンの都合で適当に選ばれます)

「は晴」「晴れ」「れで」 の3語でor検索を実行すると、

> +------------------+
> | c1               |
> +------------------+
> | 明日は晴れです。 |
> +------------------+
> 1 row in set (0.00 sec)

この一件のみがヒットします。

次に、

 '明日は雨です。'

の場合は、

  明日: 1回
  日は: 2回
  は雨: 1回
  雨で: 1回
  です: 2回
  す。: 2回

となり、「明日」「は雨」「雨で」の3語が選ばれます。
これらでor検索を行うと、

> +------------------+
> | c1               |
> +------------------+
> | 明日は晴れです。 |
> | 今日は雨です。   |
> +------------------+
> 2 rows in set (0.00 sec)

のように両方がヒットすることになります。


‥というわけなのですが、実際のところ、関連文書検索機能は、
小規模な文書セットではあまり有用な結果が得られません。

インデックスに格納される文書規模が大きくなるに従って、
各語の特徴量が統計的に意味を持つようになり、
より関連度の高い文書がヒットするようになります。


■近傍検索演算子(*N)について

*N条件は、
「指定された文字列に含まれる各語が近傍に現れる文書を検索する」
ことを指示します。引数の数値は、近傍とみなす距離の範囲を示します。

 '*N3今日は晴れです。'

という条件は、この文字列を分解して得られるそれぞれの語が、
3文字以内の範囲の近傍に現れる文書を検索します。

しかし各語を全て含む文書は存在しないので1件もヒットしません。

他の例で、

  '*N3"今日 です"'

のように指定すると、

 「今日は雨です。」

のレコードがヒットします。

この文字列では、「今日」と「です」は2文字分離れていますので、

  '*N2"今日 です"'

でもヒットします。しかし、

  '*N1"今日 です"'

ではヒットしません。


以上のような動作になっています。


--
森大二郎




Senna-dev メーリングリストの案内
Back to archive index