MeCabを使ってみる

**2011/6/3の過去ブログの転載です。内容的に古い可能性があるのでご注意ください。**

まずはMeCabのインストール。MeCabのサイトからtarballを取ってきてコンパイルしてもいいのですが、今回はFreeBSD上で使うのでportsからインストールしました。インストールしたのは以下のものです。

* ja-mecab-0.98       Yet Another Part-of-Speech and Morphological Analyzer
* ja-mecab-ipadic-2.7.0.20070801 Japanese Morphological Dictionary for MeCab
* ja-p5-MeCab-0.98    MeCab library module for Perl5

今回はPerlから使用するので、そのためのパッケージもインストールしました。

まずはコマンドラインから実験です。実行する前にLANG=ja_JP.eucJPを設定しておきます(標準の辞書がEUC-JPのため)。

```
$ mecab
MeCabは便利だな
MeCab   名詞,固有名詞,組織,*,*,*,*
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
便利    名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
な      助詞,終助詞,*,*,*,*,な,ナ,ナ
EOS
^D
```

うまくいってますね。品詞情報が必要なく、単に分かち書きとしてだけ使用するなら、-Owakatiで出力フォーマットを指定します。

```
$ mecab -Owakati
MeCabは便利だな
MeCab は 便利 だ な
^D
```

出力フォーマットはmecabrcにて自由に設定することが出来ます。

Perlから使用するには以下のようになります。

```perl:test1.pl
#!/usr/bin/perl

use strict;
use warnings;

use MeCab;

my $mecab = new MeCab::Tagger ("");
my $node = $mecab->parseToNode( 'MeCabは便利だな' );
while( $node = $node->{next} ) {
        printf( "%s %s %s\n", $node-&gt;{surface}, $node-&gt;{feature}, $node-&gt;{cost}
);
}
```

```
$ ./test1.pl
MeCab 名詞,固有名詞,組織,*,*,*,* 12857
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 12995
便利 名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ 17535
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 19356
な 助詞,終助詞,*,*,*,*,な,ナ,ナ 19878
 BOS/EOS,*,*,*,*,*,*,*,* 16752
```

分かち書きのみの場合も同様です。

```perl:test2.pl
#!/usr/bin/perl

use strict;
use warnings;

use MeCab;

my $mecab = new MeCab::Tagger ("-Owakati");
print $mecab->parse( 'MeCabは便利だな' );
```

```
$ ./test2.pl
MeCab は 便利 だ な
```

MeCabは辞書にない単語が出現した場合、品詞を推定して形態素解析を行うのですが、--unk-featureオプションを付けることで、品詞推定を抑制することが出来ます。

```perl:test3.pl
#!/usr/bin/perl

use strict;
use warnings;

use MeCab;

my $mecab = new MeCab::Tagger ("--unk-feature unknown");
my $node = $mecab->parseToNode( 'MeCabは便利だな' );
while( $node = $node->{next} ) {
        printf( "%s %s %s\n", $node-&gt;{surface}, $node-&gt;{feature}, $node-&gt;{cost}
);
}
```

```
MeCab unknown 12857
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 12995
便利 名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ 17535
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 19356
な 助詞,終助詞,*,*,*,*,な,ナ,ナ 19878
 BOS/EOS,*,*,*,*,*,*,*,* 16752
```

'MeCab'という単語は辞書に入ってなかったことが分かります。

次に辞書に単語を追加してみます。詳しいことは[単語の追加方法](http://mecab.sourceforge.net/dic.html)に載っていますので、ここでは簡単に書いておきます。辞書ファイルは次のような形式で用意します。

```user.csv
MeCab,1223,1223,6058,名詞,固有名詞,*,*,*,*,MeCab,メカブ,メカブ
```

辞書をコンパイルします。

```
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic/
-u user.dic -f euc-jp -t euc-jp user.csv
reading user.csv ... 1
emitting double-array: 100% |###########################################|

done!
$ ls -l
total 13033036
-rwxr-xr-x  1 aoyagi  aoyagi         256  6月  3 20:45 test1.pl
-rwxr-xr-x  1 aoyagi  aoyagi         142  6月  3 20:45 test2.pl
-rwxr-xr-x  1 aoyagi  aoyagi         277  6月  3 20:45 test3.pl
-rw-r--r--  1 aoyagi  aoyagi          63  6月  3 20:59 user.csv
-rw-r--r--  1 aoyagi  aoyagi        3050  6月  3 20:59 user.dic
```

これでユーザ辞書が出来上がりました。次にMeCabに辞書のありかを教えてあげなければいけません。/usr/local/etc/mecabrcというファイルに以下を追記します。

```
userdic = /home/aoyagi/user.dic
```

test3.plを再度実行してみます。

```
$ ./test3.pl
MeCab 名詞,固有名詞,*,*,*,*,MeCab,メカブ,メカブ 7235
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 11483
便利 名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ 16023
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 17844
な 助詞,終助詞,*,*,*,*,な,ナ,ナ 18366
 BOS/EOS,*,*,*,*,*,*,*,* 15240</pre>
MeCabという単語が登録されていることが確認できました。