ブログ  前の記事  次の記事  2007-07-05 

たけまる / 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ブログ(川崎有亮)/ウェブリブログ

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→