Namazu-users-ja(旧)


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

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



小舞です。

#namazu.c等等のCのソースをIndex化して頭整理中。

Tadamasa Teranishi さんは書きました:
>と、当初思いましたが、namazu の実装はそうはなっておらず、
>文書の総数 * 2 として扱っているのは、あくまでも
>nmz_get_maxhit() * 2 との比較している部分だけだったということです。
>
>もう少し書くと、BER圧縮されたデータのバイト数 しかファイルには
>書き込まれていないので、実際のデータの個数を知るにはデータを
>読み込まなければなりません。
>しかし、データを読まずに BER圧縮されたデータのバイト数 を
>個数として、nmz_get_maxhit() * 2 との比較しています。
># ここが誤植によるバグなのでしょう。

なるほど。それはわかりました。
自分も、この部分は、どういう実装したら良いのか、よくわからなかったのです。
というのも先頭のBER値だけでは、HITしている(削除されてNMZ.tで-1となったファイルも含む)
文書IDとかの総数がわからないので、どれだけmallocしたらよいのかわからないので、
(もちろん、そのまま読み進めば良いのですが、なんか非効率というか、卵が先か
にわとりが先が、のようになって、??と思っていました)
いっそのことと思って、自分の場合、NMZ.tのファイルサイズ/4として、(削除されたファイル数を含む)
mallocしました。
つまり、そういう、部分だったということですね。


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

なるほど。通常、ひらがなの「の」等の多く含まれる単語は
AND計算等からも除かれていますよね。それですね。


>それ以外には、HIT した文章を実際に取り扱う際には、
>BER圧縮されたデータのバイト数 として扱っているので、次の単語の
>データ領域まで読み込むことはありません。
>
>> つまり、単語ID X番の次の単語IDの(X+1)番の
>> 先頭のBER値(本来BERの範囲を表している)までもがHITの
>> 文書IDとなって、その次のBER数値のHITしている文書IDがスコア値
>> となって、表示される、、と。
>
>という実装にはなっていません。

これで安心しました。

さらに、自分は、電子メール(2万通程度)で簡単に実験してみました。
たしかに、そんな変なことはおきていないですね。

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

つまり、メモリーを確保する上での話しで、通常使っている範囲では
メモリーの確保の違いしかないということですね。
kを
k=BER圧縮されたデータのバイト数-(文書の総数 * 2)
とすると、kは、それほど大きくはならない?(対象規模数万個程度を想定)
例えば、簡単な説明として1万2千700百個のファイルがあって、127の等間隔で
まばらにHITしている単語が
あったとして、だいたい100バイト程度の差しかない。。ということでしょうか。

>ところで、誤植を直す必要があるわけですが、
>  [単語1を含む文書の総数 * 2][文書ID][スコア][文書ID][スコア]...
>は、どう書き換えるとよろしいでしょう。
>  [単語1を含む文書IDとスコアの
>  バイト数][文書ID][スコア][文書ID][スコア]...
>では、わかりづらいですよね。

直接的で分かりやすい表現だとは思います。

他にあえて、議論のたたき台として、ひねりだすなら
「単語1でHITのデータ領域のBER範囲」[文書ID][スコア][文書ID][スコア]...
う。これじゃ。なんのことか、わからなくなりそうな。。

やはり寺西さんの案の方がすっきりしていますね。