Namazu-users-ja(旧)


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

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



寺西です。

Tadamasa Teranishi wrote:
> 
> きちんと調べきれていないので誤解があるかもしれませんが、なんだか
> mknmz と namazu で処理が違うような気がしてきました。
> 
> nmz/hlist.c の nmz_get_hlist() では、明確に 2 で割った値を使って
> います。そして、
>  文書ID の総数 + スコアの総数 = 文書の総数 * 2
> という前提で処理が書かれています。

と書きましたが、実は 文書ID の総数 + スコアの総数 = 文書の総数 * 2
として扱っている部分と、BER圧縮されたデータのバイト数 として扱って
いる部分が混在していました。

nmz_read_unpackw() の第3引数には、文書の総数 * 2 を渡しているにも
関わらず、これをバイト数だと解釈して、変換後の個数を戻値に
返します。
第3引数 に BER圧縮されたデータのバイト数 を渡せば、個数が変えるの
ですが、nmz_read_unpackw() の第2引数に渡すバッファのサイズは
個数 * sizeof(int) としています。仮に第3引数に BER圧縮されたデータの
バイト数を渡すのであれば、第2引数に渡すバッファのサイズは戻値の
個数 * sizeof(int) でないと、無駄にメモリを確保することになり、
nmz_read_unpackw() の仕様はかなり不自然な気がします。
やはり nmz_read_unpackw() にバグがあるだけで、第3引数には、
文書の総数 * 2 を渡すという仕様と考える方が自然です。

このバグのおかげで、namazu 自体は 文書の総数 * 2 として、プログラム
が書かれているのに関わらず、mknmz と同じ BER圧縮されたデータのバイト数
として処理されており、結局つじつまがあっていて問題が表面化
しなかったのではないかと思われます。

nmz_read_unpackw() 以外のところでは、文書の総数 * 2 として扱って
いますので、nmz_read_unpackw() を修正しようかとも思うのですが、
これを修正してしまうと、mknmz 側と矛盾が生じるかもしれません。

結構、やっかいな問題かもしれません。
-- 
=====================================================================
寺西 忠勝(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