<HTML>
<HEAD>
<TITLE>只今、namazu のテスト中</TITLE>
</HEAD>
<BODY BGCOLOR="WHITE">
<H2>只今、namazu のテスト中</H2>

<HR>

<H3>辞書を作ると、、、</H3>
で辞書作ってやってみた。そしたら、
<UL>
<LI>複数の辞書を指定する
<LI>どの辞書にも検索文字列は含まれない
</UL>
とき「せぐめんてぇしょん例外」だと。なんかわかんないんで、ヤマカンで
configure に
<P>
<UL>
<LI>--enable-shared=no
</UL>
つけた。そしたらできた。何がいけない?
<P>
それから、mknmz で辞書作るとき、特定のファイルにぶちあたってこける。
メッセージは同じく「せぐめんてぇしょん例外」。
<P>
どこが悪いんだかわかんないんで、素人的に mknmz にあちこち、
printいれてみてみたら、Chasen.pm を呼んだ後、こけてるみたい。
わかんねぇよな、これじゃ。
<P>
で、動かないことにはどぉしよぉもないので、
 kakashi-2.3.4 と Text-kakasi-1.0.5 だっけ、いれた。
そしたら通った。ChaSen.pm の何が悪いのかね、、、Chasen 自体は
そのファイル、通せるのに。

<HR>

<H3>namazu のソースを追いかけたら、、、</H3>
でぇ、まず、namazu と namazu.cgi の方からやっつけようとソース見ながら、、、
<BR>
そしたら、namazu は、
<UL>
<LI>ヒット数だかスコアだかの再計算(search.c の nmz_recompute_score)の後
</UL>
こけてることがわかった。どぉも、nmz_recompute_score で使っている
hlist という構造体に変な値が入っているようで。
<P>
さらに追いかけると、
<UL>
<LI>hlist.c の nmz_merge_hlist
</UL>
の戻り値が怪しいらしく、
<UL>
<LI>hlist.c の nmz_merge_hlist で宣言している構造体 NmzResult value;
</UL>
を「初期化」していないことが原因だと決め付けて、宣言直後に
<UL>
<LI> value.num=0;
</UL>
入れて解消した。(勿論、このあとは、 configure のオプションに --enable-shared=no はつけない)
<P>
ところが、namazu.cgi の方は、これだけれはないらしく、「せぐめんてーしょん例外」
は出なくなったが、今度は HTML で「エラー」と表示された。
<BR>
同じくおっかけたら、ERR_FATAL だかが hlist.stat(だったかな)にセット
されちゃったみたいで、、、
<BR>
同じ nmz_merge_hlist の NmzResult value; と宣言されてるやつの
 stat というメンバーに変な値が設定がセットされちゃうことが原因だと
わかった。
<BR>
# 要するに、この構造体を初期化していないことが原因なんだと。
<P>
だから、 namazu のときと同様で構造体を宣言した後に、
<UL>
<LI> value.stat=0;
</UL>
を入れて解消した。
<P>
というわけで、こんどは、mknmz だ、、、chasen だね。

<HR>

<H3>mknmz で呼んでいる ChaSen.pm がロードする libchasen.so(かな?)</H3>
でぇ、
よくわからんけど、ChaSen、データがでかいとこけるみたい。どぉしよう、、、
<P>
どぉやら、ChaSen は改行の入っていない、
長いデータを処理するのが苦手らしい。
<P>
?、まてよ、、、mknmz はこけるけど、chasen って、コマンドラインからやるときは
OKなんだよな、、、ってぇことはぁ、、、何だ?
<BR>
あぁ、そっか、mknmz で 前処理やってんだよな、、、
mknmz に手をいれて、データを少しづつ渡すようにすればいいのかな、、、
<BR>
でも、データの切れ目なんかわかんないしな、、、適当に空白入れる?
<P>
ChaSen(.pm) って、一度に渡すデータが、8kb を越えるとだめみたいね、、、
標準入力渡すようにして ChaSen.pm 使ってみたら、
そぉだった。(ソースにも 8192 って数字がポツポツ)
<BR>
これ、単純に大きくすればいいって問題でもないしね、、、確かにそうすれば、
当座の問題はしのげるけど、本質的には解決してないもんね、、、
<P>
と www.namazu.org みてみたら、結構有名な話のようで、
<BR>
みなさんはまってるみたいね、、、なんだ、私だけじゃないんだ(^ ^;
<BR>
みんな、kakasi で回避してるのね、、、一緒、一緒。
<P>
# ChaSen の FAQ に書いてあった。(^ ^;

<HR>

<H3>「お知らせ」問題 part.1</H3>
分かち書きに「ChaSen」を使ったときの話。
<P>
どぉも「キーワード」には「お知らせ」という単語があるのに、namazu や
namazu.cgi では「お」「知らせ」とか、ひどいと「お」「知ら」「せ」とかに
なってうまく検索できない。なんでだ、、、、
<BR>
で、ソースみてみた。そしたら、 nmz_wakati で検索文字列、分割(?)してんな、、、
<BR>
# なんでや? そうそう、キーワード自体は、辞書ディレクトリの NMZ.w でわかる。
<P>
で、「直接、分かち書きする前にnmz_binsearch 呼んだら、、、」ってやったらできた。
<BR>
# 当たり前だよな。
<P>
ついでに ML のアーカイブみてた。そしたら、同じことやってる
(? いや、やってはいないか)人はいてぇ、、、やっぱり、
<UL>
<LI>namazu は「検索式(にある文字列)を検索前にわかち書きする」
</UL>
ためで、仕様なんだそうだ。仕方ないか、、
<P>
でもさぁ、長い文字列(分かち書きする前)と同じものがキーワードに
あるかどぉかくらいは、やはり見た方がいいように思うのだが、、、
で、それがなければ nmz_wakati を呼び出してってね、、、言うは易し?
<BR>
# 経緯のページ、リンク辿れない、、、(; ;)
<BR>
# マニュアルにも「グチャグチャに分かち書きされちゃうときはあきらめろ」って。
<P>
どぉしようかね、、、「お知らせ」なんか、結構使うしなぁ、、、
ChaSen を呼び出すときのオプションで「お」「知らせ」にできない
もんかね、、、「おしらせ」なら「お」「しらせ」になるんだけどな、、、

<HR>

<H3>「お知らせ」問題 part.2</H3>
じゃ、「kakasiで」ってぇのは思い付くんで、 kakasi でやってみた。
<BR>
そしたら、
<UL>
<LI>kakasi の標準辞書には「お知らせ」って言葉はない
</UL>
から、分かち書きのとき(辞書作るとき)は「お」「知らせ」になる。
<P>
ここまではいい。ところがだぁ、、、、分かち書きする前が
<UL>
<LI>何処其処からのお知らせ
</UL>
ってなってたりすると、「お知らせ」、即ち「お」「知らせ」で検索できない。
<P>
「どぉなってんだ?」とやってみたら、kakasi -w での分かち書きのとき、
<UL>
<LI>「何処其処」「からのお」「知らせ」
</UL>
になってた。頭痛ぇなぁ、、、kakasi の辞書に「からの」っていれる?
<BR>
と思ったら、mkkanwa は先頭が平仮名の単語は無視(?)するそうだ。むぎゅぅ、、、
<BR>
というか、そもそも kakasi 自体は「ひらがなの分かち書き」ができないらしい。
フゲ!
<BR>
# そりゃそぉだ。kakasi 本来の役目じゃないよな。
<P>
そしたら ChaSen だな、、、

<HR>

<H3>「ChaSenの8kb」 &amp; 「お知らせ」、どぉする?</H3>
本質的な解決方法は、、、ないねぇ、、、
<BR>
ChaSenをいじれば別だけどね、、、
<BR>
こぉすりゃいいか、、、暇になったらやってみよう。
<P>
mknmz は、ソースいじって、、、
<UL>
<LI>予めChaSen と kakasi の両方を用意しておいて、
<LI>分かち書きには、原則として ChaSen を使う
<LI>ChaSen に渡すデータが 8kb を越えていたら、そのときに限って
強引にkakasi をよびだす。
</UL>
辞書の違いによっておかしなことになるかもしれないけど仕方ないかな。
<P>
で、namazu は、
<UL>
<LI>ソースいじって、nmz_wakati の前に、強引に nmz_binsearch する。
</UL>
なんか大変そう。特に mknmz をいじるのが。
<P>
やめて、namazu だけいじろう。
<P>
とかいいつつ
<UL>
<LI>kakasi で前処理したデータをそのままChaSen に渡したら
こちらが(現在)意図するような分かち書きできるか?
</UL>
ってやってみた。そしたら、欲しい結果がでた。ChaSen って凄いねぇ、、、
<BR>
# 逆の方がいいかな、、、
<BR>
いつもうまくいくとは限らないだろうけどね。一考の価値あり?
<P>
で、とりあえず、nmz/search.c で nmz_wakati を呼ぶ前に、 do_word_search で
強制的に一端検索を行ない、ヒットしなかった場合にのみ、nmz_wakati を
呼ぶようにソースをいじった。mknmz で呼ぶのは chasen 。chasen でこける
文書のみ、あとで kakasi で辞書に追加する、、、とね。
<BR>
まぁ、kakasi で分かち書きした結果は chasen のそれとは異なっちゃうけど、
これくらいはね。(^ ^;
<BR>
mknmz のオプションは以下を追加すればいいのかね。
	<UL>
	<LI>--no-delete --exclude=.... --outputdir=....
	</UL>
<P>
、、、とかいいつつ、ChaSen 8kb の件、データに改行とかあれば
いいみたいね、、、どぉにかできるかな、、、mknmz の前処理を工夫すれば。
<P>
おぉ、それより、
	<UL>
	<LI>mknmz で kakasi を呼ぶ。その際は「ひらがなのみの単語は出力しない」
	<LI>namazu で nmz_wakati のかわりに kakasi を呼ぶ。こちらでも
	ひらがなのみの単語は除外するように。
	</UL>
でどぉだろう、、、
<BR>
「おにぎり」とかを検索式に指定するやつはいないよな、、、
<BR>
# 将来の可能性のおもしろさを考えると、ChaSen にしたいんだけどね。
<BR>
# いつになるかわからない将来のこと、考えても仕方ないか、、、
<P>
まぁ、いっかな、いまのままでってぇか、
なんもしないで。
<HR>
<H3>よそ様はどぉやってんの?</H3>
下関市で namazu  を使っているらしいので、さっそく「お知らせ」
を検索してみた。そしたら「お」「知らせ」だった。まぁ、当然というか、、、、
<BR>
で、結果一覧の中に「＊＊＊からのお知らせ」ってあった。
さっそく「＊＊＊からのお知らせ」って入れてみた。
<BR>
そしたら、「お」「知らせ」でひっかかった文書が「＊＊＊」「からのお」「知らせ」
でもでてきた、、、
<BR>
検索は、該当文書が1つなのでおそらく and だよね、、、、
なんで同じ文書がでてくるんだ?
<BR>
あぁ、そっか、「＊＊＊からのお知らせ」と「お知らせ」、両方あればいいもんな。
<BR>
#リンクをたどれないので確かめようがない。
<P>
で、こんどはビクターエンターテイメントへ。
<BR>
そしたら「お知らせ」では該当無し。で「知らせ」にしたら「お知らせ」ってある
文書がでてきた。これはきっと「ひらがらのみの単語は登録しない」んでしょう。
<BR>
# 関西大学も同じ方法かな、、、
<P>
そういや、どこも kakasi みたいだな、、、

<HR>

<H3>「お知らせ」って、、、</H3>
ちょっと横道、、、、
<P>
ChaSen(ipadic 2.4.4) だと 
	<UL>
	<LI>「お知らせ」・・・「名詞-サ変接続」
	<LI>「おしらせ」・・・「お」「しらせ」・・・
	「接頭詞-名詞接続」「名詞-一般」
	<LI>「知らせ」・・・「動詞-自立」
	</UL>
ってなる。kakasi -w (2.3.4) だと、
	<UL>
	<LI>「お知らせ」・・・「お」「知らせ」
	<LI>「おしらせ」・・・「おしらせ」
	</UL>
になる。ふと思った。「辞書次第なんだけどぉ、、、juman(3.61 標準辞書) は?」と。
そしたら、
	<UL>
	<LI>「お知らせ」・・・「お」「知らせ」・・・
	「名詞接続辞」「普通名詞」
	<LI>「おしらせ」・・・「お」「しらせ」・・・
	「名詞接続辞」「動詞」
	<LI>「知らせ」・・・「動詞」
	</UL>
だそうだ。
<P>
どうでもいい話というか当たり前の話だが、 
ChaSen(ipadic) の「知らせ」のコストを小さくしたら、
	<UL>
	<LI>「お知らせ」・・・「お」「知らせ」・・・
	「接頭詞-名詞接続」「名詞-一般」
	</UL>
ってなった。まぁ、ChaSen と juman は前後の文脈(?)によるけどね。
<P>
日本語の文法って難しいねぇ、、、

<HR>
<H3>で、結局、、、</H3>
あれこれ考えたけどさぁ、結局ChaSenをかなりいじらないとだめだよな、、、
<BR>
どぉやったところで、万人が満足いく結果がでるようにはならないし、、、
<BR>
だから 
	<UL>
	<LI>ソースはいじらない
	<LI>namazu の辞書は、kakasi を使う
	<LI>検索方法の注意書きをいいものに
	</UL>
ってした方がいいかね。
<BR>
# (kakasi)辞書の更新が簡単ってぇのはかなり魅力的というか、大事だもんね。
<HR>
<ADDRESS>
miuraj@isc.meiji.ac.jp
</ADDRESS>
</BODY>
</HTML>
