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

Back to archive index

Taku Kudo taku****@chase*****
2007年 2月 27日 (火) 23:39:19 JST


工藤です

> mecab コマンドを使う場合、その API が扱えるような新たな引数を追加
> するということも考慮されているでしょうか?

可能であれば引数として追加しますが,いかんせん引数の表現能力は
API に比べれば貧弱なので無理な場合はあきらめます.

あと mecab コマンドをそのまま使うのはパフォーマンスが落ちるので
おすすめしません.実際,mecab の処理のうち,約23% ぐらい解析結果
の出力に取られています.(mecab は出力のパフォーマンスを最大限に
あげるために,自前でバッファリングしてるのですが,これ以上速度を
かせぐのは困難かと思われます.) いったんファイルに解析結果を落とし込んで
さらにそこから別のプログラムで読み込むという処理は非常に無駄が多いです.
そのため,別のプログラムから使う場合は API の使用をお勧めします.

> > %ps     開始位置
> > %pe     終了位置
>
> ところで、何となく終了位置が +1 された値のように感じますが、そういう
> ものでしょうか。まぁ、それは仕様として。

位置という言い方だと +1 されたような感じですが,0 から始まる
配列だとかんがえると,終了位置 - 開始位置 = 長さになるので
これで問題ないとおもいます.

> % mecab -F"%ps-%pe " -E "\n"
>
> のように位置情報だけ取り出して加工した方が楽でしょうが、
> それでも、位置情報から後処理するのは簡単ではないように思います。
> できないわけではないけれども、あまり効率的な方法とは思えません。

たとえば perl だとこういうのはどうでしょう
# 殴り書きなのでバグがあるやもしれません.

-- foo.pl
#!/usr/bin/perl

my $prev = 0;
my $out = "";
while (<>) {
    chomp;
    if (/EOS/) {
        print $out if ($out ne "");
        print "\n";
    } else {
        my ($w, $b, $e) = split /\t/, $_;
        if ($w =~ /^[\x00-\x7F]+$/ && $prev == $b) {
            $out .= $w;
        } else {
            print "$out " if ($out ne "");
            $out = $w;
        }
        $prev = $e;
    }
}
-----------------

% echo "http://www.asahi.com/ taku****@foo***** .jp" | \
   mecab -F"%m\t%ps\t%pe\n" -E"EOS\n" | perl foo.pl

http://www.asahi.com/ taku****@foo***** .jp



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