たけまる / Perl - Text::MeCab を使ってみた
2007-07-05
_
Perl - Text::MeCab を使ってみた [perl][nlp]



MoSQL をインストールしたついでに,MeCab を Perl から使えるようにしてみました.MeCab は日本語の形態素解析を行うツールで,文章を単語に
区切り,品詞名を推定してくれます.たとえば,文章から固有名詞を抜き
出したり,読み仮名をふるときに使えます.
MeCab と Text::MeCab というふたつのモジュールがありますが,インタ
フェースと速度の面で Text::MeCab が優れているようです.
Text::MeCab を使って,わかち書きと品詞推定をやってみました.品詞情
報をハッシュキーで指定できるように,ちょっと工夫してあります
(ex. $word->{'品詞'} で品詞名,$word->{'読み'} で読み方を得られる).
MeCab のインストールについては "MoSQL を使ってみた" [2007-07-04-1]
を参考にしてください.
■ Text::MeCab
改良型 Perl モジュールです.インタフェースが自然で,動作は速いらし
い.CPAN にあるのでインストールは省略します.
わかち書きするサンプルコード
use Text::MeCab; my $STR = 'すもももももももものうち'; my $mecab = Text::MeCab->new; my @words; for ( my $node = $mecab->parse($STR); $node; $node = $node->next ) { push @words, $node->surface if length $node->surface; } print join ' ', @words;
出力
すもも も もも も もも の うち
品詞名など,詳細な情報を出力するサンプルコード
use Text::MeCab; use List::MoreUtils qw( mesh ); use Data::Dumper; $Data::Dumper::Indent = 1; my $STR = 'すもももももももものうち'; my @FEATURE_NAMES = ( '品詞', '品詞細分類1', '品詞細分類2', '品詞細分類3', '活用形', '活用型', '原形', '読み', '発音' ); sub proc { my ($node) = @_; my @features = split /,/, $node->feature; return { mesh( @FEATURE_NAMES, @features ) }; } my $mecab = Text::MeCab->new; for ( my $node = $mecab->parse($STR); $node; $node = $node->next ) { print Dumper proc($node) if length $node->surface; }
出力
$VAR1 = { '品詞細分類3' => '*', '活用形' => '*', '原形' => 'すもも', '発音' => 'スモモ', '活用型' => '*', '読み' => 'スモモ', '品詞細分類2' => '*', '品詞' => '名詞', '品詞細分類1' => '一般' }; $VAR1 = { '品詞細分類3' => '*', '活用形' => '*', '原形' => 'も', '発音' => 'モ', '活用型' => '*', '読み' => 'モ', '品詞細分類2' => '*', '品詞' => '助詞', '品詞細分類1' => '係助詞' }; ...
■ MeCab
元祖 Perl モジュールです.インタフェースが使いにくく,遅いと言われ
ているようです.
CPAN にないので,MeCab サイトからダウンロード
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
- mecab-perl-0.96.tar.gz
コンパイルとインストール
$ tar zxvf mecab-perl-0.96.tar.gz $ cd mecab-perl-0.96/ $ perl Makefile.PL $ make $ make test $ sudo make install※ MeCab を utf8 コンパイルしても,make test の結果は EUC-JP のようです
サンプルコード
use MeCab; my $str = 'すもももももももものうち'; my $mecab = MeCab::Tagger->new(); my $node = $mecab->parseToNode($str); for( ; $node; $node = $node->{next} ) { next unless defined $node->{surface}; my $midasi = $node->{surface}; my( $hinsi, $yomi ) = (split( /,/, $node->{feature} ))[0,7]; print $midasi, "\t", $yomi, "\t", $hinsi, "\n"; }※ サンプルコードはこちらを参考にしました
[Perl] 形態素解析MeCab(和布蕪)をPerlから使ってみる Kawa.netブログ(川崎有亮)/ウェブリブログ