[mecab-users 230] Re: 分かち書きで、半角英数字部分を分かち書きしないようにしたい

Back to archive index

Tadamasa Teranishi yw3t-****@asahi*****
2007年 2月 27日 (火) 19:33:10 JST


寺西です。

# 便乗ですが...。

Taku Kudo wrote:
> 
> char.def をいじれば,お望みのように半角英数をひとつにまとめることができます.

char.def を書き換えて辞書を作成すれば良いわけですが、分かち書きのため
だけに別の辞書を用意するのは敷居が高いのです。

ChaSen の場合は、テキストファイルの chasenrc を書き換えるだけで同等の
ことができますが、それでも敷居が高かったぐらいですから。

> MeCab は辞書とシステムを極力分離し,言語依存なものはすべて辞書に書くという
> スタイルをとっています.そのため,オプションで言語依存の振る舞いを
> 変更することはポリシーに反します.

「分かち書き」オプションがおまけのような機能ですから仕方ないと思います
が、分かち書き処理として考えた場合に、半角文字の処理は必ずしも適切
ではありません。

そのために別に辞書を用意しないといけないということであれば、
分かち書き用の辞書も標準で用意してもらって、分かち書きモードの
場合はそれを使うといったような辞書の切り替えが容易にできる仕組み
が欲しいところです。
 
> 問題が半角英数だけでしたら,単純に後処理ではだめでしょうか?

標準の -Owakati だと元の空白が削除され、分かち書きによって追加された
空白が追加されるため、元々分かれていたのかどうかが判断つきません。

例) 「filename.jpg 1024バイト」 -> 「filename . jpg 1024 バイト」
    つまり、「jpg」と「1024」が分かれていたかどうかが判断できません。

分かち書き前のテキストと比較して判断することもできますが、あまり
効率的ではありません。
そのため、例えば次のような前処理を含めて処理を行う必要があります。

$ echo -e "filename.jpg 1024バイト" | expand -4 | 
mecab -F "%M\t" -U "%M\t" -E "\n" | perl -e 'my $text = <>; 
while($text =~ s/([\x00-\x7f])\t([\x00-\x7f])/\1\2/sg){} 
$text =~ s/\t/ /sg; print $text;'

「filename.jpg 1024バイト」 -> 「filename.jpg    1024 バイト」

ただし、テキストに含まれるタグは空白と同じものとして扱って良い場合
に限ります。(タグを区別する場合はより複雑な前処理と後処理が必要)

ちなみに Namazu では面倒なので全角文字列だけを mecab に渡して分かち
書きを行っています。(すごい手抜き)
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-****@asahi*****
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




mecab-users メーリングリストの案内
Back to archive index