Namazu-devel-ja(旧)


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

Re: BER圧縮のデータの読み込みについて



寺西です。

Hideyuki Takahashi wrote:
> 
> こちらのバグに気づき、藤原さんが書かれた最新版(13pre7)の
> ソースを拝見したのですが、まだうまくいってないと思います。
> 参考のため、関数を載せさせていただきます。
> 
> まず、nmz_get_unpckw()で、NMZ.iの対象語の一つ目のデータ
> (表記について問題になったもの)をnに代入していますが、
> この時点のnは、データ長、つまりバイトですよね。
> それをmaxhit * 2と比較するのはおかしいかと思います。

厳密にはそうなんですが、文章数を数えるためのバッファサイズ
を決めるために、使っているに過ぎません。

nmz_get_unpackw() でデコードしていかないことには、文章数が
計算できません。そのために、多少大きめのバッファを確保して
います。その際、BER データバイト数個か maxhit * 2 個の
少ない方の数を最大データ数とみなしています。

# 多少、無駄にバッファは確保しています。

> 具体的に、駄目な例ですが、文書IDが128、スコアが128の場合、
> これ一つだけだと、nは4(byte)が入りますね。
> これが500個あるとすると、
> (差分を考慮すると、文書IDは2個目だったら実IDは256、という意味です)
> n = 4(byte) * 500 = 2000(byte) になります。
> しかし、実際のデータの数は500ですので、
> hit = (bersize < maxhit * 2 ? bersize : maxhit * 2);
> の式は、hitに maxhit * 2 がはいってしまします。
> (maxhit ってデフォルトで1000ですよね?)

そうなるかな。読み出すデータは最大でも maxhit * 2 個で良いわけ
ですから、常に maxhit * 2 個確保しても良かったのですが、
bersize が十分に小さい場合、少しでも確保する個数を減らすように
したわけです。(bersize バイトから個数を正確には求めることは
できませんが、最大 bersize 個のデータであることは明らかです。)

# 可読性悪くてすみません。
 
> よって、この式を評価する前に、nに文書数を入れておく必要があります。

いえ。後で数えるために多めに取っているだけです。
後で数えるための文章数を先には使えません。

> というか、nが場所によって、バイト数になったり、ヒット文書数*2になったり
> ヒット文書数になったりしているので、別な変数を用意したほうが
> よいのではないかと思います。

可読性が悪いのは申し訳ないですが、あくまでもデータの個数を
扱っています。
最初の nmz_get_unpackw(Nmz.i, &n); の部分は確かに個数でもない
のですが、これは元ソースの名残です。

> これが1点。
> 
> もうひとつが、
>  idf = log((double)document_number / (n/2)) / log(2);
>         nmz_debug_printf("idf: %f (N:%d, n:%d)\n", idf, document_number, n/2);
> ここでのnは、やはりバイト数が入っているままなのですが、これだと
> やはりいけないと思います。
> ここで用いたい「n」は「ヒット文書数 * 2」なので。

idf はすっかり忘れていました。正しい文章数が求まった後に
この計算を行うべきですね。
この部分は元ソースのままなので、後ろに持ってこないといけないですね。
(すぐそのまま後ろに持ってこれるかどうかはわかりません。確認して
みます。)

# ただ、ここを変えてしまうと今までと結果ががらっと変わるかも
# しれません。まぁ理論通りになるわけだが...。
 
> それで、上記の解決策ですが、nmz_get_unpackw()で
> バイト数を求めた後、直後に、buf = malloc(n * sizeof(int));
> をすれば大丈夫だと思います。
> しかし!!余分にメモリを確保する(可能性がある)のはいなめないのですが。。。

という前に多めにメモリを確保して、数を数えていたのでした。

> P.S.
> 
> 「BER圧縮」ってベル圧縮と読んでいいのでしょうか?

そっちはわかんないです。
-- 
=====================================================================
寺西 忠勝(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