
茶筌(ChaSen)については数年前に CGI ではない Perl スクリプトで利用した。この際モジュールの使用を前提とすると、作成したスクリプトの使用に制限が生じることを考え(そういう苦情もあったので)やむを得ず system 関数を使って ChaSen を動作させた。
最近になってこのときのスクリプトを CGI 用に改変しようとしたところ、ChaSen を用いた分析部分が機能しないという問題が発生した。system 関数を使った ChaSen の実行は、ターミナル上や Perl スクリプトとしてなら問題なく動作するようなのだが、CGI として実行すると機能しないようである。試しに CGI スクリプト上から(system 関数で ChaSen を実行させる) Perl スクリプトを動かしてみても同様の結果だった。
しかしモジュールを使用すればこの問題は生じないようである。こうした事情から下記にはモジュールを使用した場合のスクリプトを例示した。
MeCab と ChaSen を比較した場合、現時点では前者の方が高性能という評価を得ているようなので、わざわざ後者を使用する意義は薄そうである。ただ、昨年末より ChaSen Legacy として開発が再開されているようでもあるので劇的に性能が向上する可能性も否定できない。
>> 入手先(chasen-legacy.sourceforge.jp)
基本的なインストール方法などについては下記リンク先を参照のこと。
基本的なインストール方法などについては下記リンク先等々を参照のこと。
>> たつをの ChangeLog
>> 人工無能は考える
use Text::ChaSen;
スクリプトの出だしに ChaSenモジュールの使用を宣言しておく。
####### 日本語でChaSenを使う場合
#Text::ChaSen::getopt_argv('cahsen','-j','-F','%M\t%H1-%H2-%H3\n');
Text::ChaSen::getopt_argv('cahsen','-j','-F','%?U/%m/%M/\n');
$result = Text::ChaSen::sparse_tostr($lines);
@words = split(/\n/,$result);
while(@words){
$token = shift(@words);
print "$token\n";
}
$lines には分析対象となる日本語テキストの文字列が読み込まれている。上の例では「原形」化だけを行なっている(未知語の場合には表層形を出力するように設定してある)。%?U/STR1/STR2/ は未知語のときSTR1(ここでは%mつまり表層形)を出力し、未知語ではないときSTR2(%Mつまり原形)を返してくる。
その他、-j は句点あるいは空行を文の区切りとして解析するということ、-F は形態素を format で指定された形式で出力するというものである。先述した %M などがここでいう format での指定ということになる。なお、コメントアウトした行のように%Hを使って品詞情報も付け加えられる。
モジュールを使った部分以下は @words に配列として読み込んだり、そこから要素を抜き出したりする作業を行なっている。結果は単に $result を print するのと変わらない。
Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.