Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: フレーズ検索のHASH値への変換方法



寺西です。

"Komai @home" wrote:
> 
> Komai @home さんは書きました:
> >>いろいろと調べていると namazu で 文書の総数 * 2 として扱っている
> >>のは、nmz_get_maxhit() * 2 との比較している部分だけでした。
> >>(これは、検索で見つかった文書の数の上限チェックです。)
> >>それ以外の部分、NMZ.p を扱っているところなども含めて
> >>BER圧縮されたデータのバイト数 として扱っていました。
> >
> >ここだけなら、実質上も、何ら問題なさそうですね。
> 
> と自分は書いてしまいましたが、
> 要するに、余計にHITして表示される可能性がある、、ということでしょうか?
> そういう経験、あったようななかったような。。

と、当初思いましたが、namazu の実装はそうはなっておらず、
文書の総数 * 2 として扱っているのは、あくまでも
nmz_get_maxhit() * 2 との比較している部分だけだったということです。

もう少し書くと、BER圧縮されたデータのバイト数 しかファイルには
書き込まれていないので、実際のデータの個数を知るにはデータを
読み込まなければなりません。
しかし、データを読まずに BER圧縮されたデータのバイト数 を
個数として、nmz_get_maxhit() * 2 との比較しています。
# ここが誤植によるバグなのでしょう。

ここで影響するのは、BER圧縮されたデータのバイト数 >= 文書の総数 * 2
のため、実際には nmz_get_maxhit() よりも少ない文章数であっても、
文章数が多すぎて検索結果が表示されないといったことが起こること
ぐらいです。しかし、その場合であっても十分に文章数は多いので、
検索できなくても気づきにくいと思われます。

デフォルトでは 10000 個以上の文書の場合は、文章数が多すぎて
検索結果が表示されないわけですが、BER圧縮されたデータのバイト数/2
が 10000 以上の場合、表示されていないわけです。 

それ以外には、HIT した文章を実際に取り扱う際には、
BER圧縮されたデータのバイト数 として扱っているので、次の単語の
データ領域まで読み込むことはありません。

> つまり、単語ID X番の次の単語IDの(X+1)番の
> 先頭のBER値(本来BERの範囲を表している)までもがHITの
> 文書IDとなって、その次のBER数値のHITしている文書IDがスコア値
> となって、表示される、、と。

という実装にはなっていません。

(私の namazu クライアントプログラムはそうなっているので、修正しなけ
ればなりませんが。)

このため、

> ファイル仕様の誤植と考えて、修正するだけで実質問題ないかもしれません。
...
> 実績のある namazu クライアントでは、BER圧縮されたデータのバイト数
> として取り扱っているものと思われます。
> (ただし、namazu 同様、文書の数の上限チェック の部分は、ファイル
> 仕様の 文書の総数 * 2 を使うといった混在の可能性はありますが。)

であるとは言えると思います。

ところで、誤植を直す必要があるわけですが、
  [単語1を含む文書の総数 * 2][文書ID][スコア][文書ID][スコア]...
は、どう書き換えるとよろしいでしょう。
  [単語1を含む文書IDとスコアの
  バイト数][文書ID][スコア][文書ID][スコア]...
では、わかりづらいですよね。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E