Namazu-users-ja(旧)


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

Re: [Q] mknmz -H オプションの動作について



寺西です。

# 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