Namazu-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Q] mknmz -H オプションの動作について
- From: Tadamasa Teranishi <yw3t-trns@xxxxxxxxxxxxxxx>
- Date: Tue, 18 Mar 2003 04:02:27 +0900
- X-ml-name: namazu-users-ja
- X-mail-count: 03103
- References: <3E71C2A1.AB947580@asahi-net.or.jp>
寺西です。
# namazu-devel-ja にも CC: しておきます。
Tadamasa Teranishi wrote:
>
> mknmz -H オプションの動作について教えてください。
>
> -H オプションは、「平仮名のみの単語は登録しない」機能ですが、
> このオプションをつけて作成しても、NMZ.w に平仮名のみの単語(という
> か文字列)は登録されています。
> 確かにいくつかの平仮名のみの単語は登録されないのですが、登録される
> ものと登録されないものの区別がよく分かりません。
pl/wakati.pl を調べたところ、
if ($var::Opt{'hiragana'}) {
$tmp[$ndx] =~ s/ (\xa4[\xa1-\xf3])+ //g;
}
という箇所で平仮名のみの単語を削除しているようでした。
しかし、これでは次のケースの平仮名のみの単語は削除できません。
連続して平仮名のみの単語が現れ、そのセパレータがスペース1つ
の場合です。
例えば、" ここ ここ " という文字列を処理した場合、2つめの「ここ」
が残ります。
これは仕様ではなく、間違いではないかと思います。
# もし、私の考え自体が間違いであればご指摘ください。
上記の箇所を次のように修正すると、平仮名のみの単語を削除できます。
(もっと綺麗に記述できるのだとは思いますが。)
if ($var::Opt{'hiragana'}) {
$tmp[$ndx] = ' ' . $tmp[$ndx] . ' ';
1 while $tmp[$ndx] =~ s/ (\xa4[\xa1-\xf3])+ / /g;
$tmp[$ndx] =~ s/ +/ /;
$tmp[$ndx] =~ s/^ //;
$tmp[$ndx] =~ s/ $//;
}
ただ、これだけではまだ完全ではありませんでした。スコア計算の
ために埋め込まれたキーワード(\x7f数字\x7f文字列\x7f/数字\x7f)に
も対応していませんでした。
結局、次のようにすることで平仮名のみの単語を全て削除することが
できました。
if ($var::Opt{'hiragana'}) {
$tmp[$ndx] = ' ' . $tmp[$ndx] . ' ';
$tmp[$ndx] =~ s!\x7f *(\d+) *\x7f([^\x7f]*)\x7f */ *\d+
*\x7f!\x7f$1\x7f $2 \x7f/$1\x7f!g;
1 while $tmp[$ndx] =~ s/ (\xa4[\xa1-\xf3])+ / /g;
$tmp[$ndx] =~ s/ +/ /;
$tmp[$ndx] =~ s/^ //;
$tmp[$ndx] =~ s/ $//;
}
さて、-H オプションの平仮名のみの単語の削除とは、この修正したもの
の動作で正しいのでしょうか?
--
=====================================================================
寺西 忠勝(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