Windows版PerlでMeCabを使いたい

前やってダメだったWindowsPerlへのText::MeCabの導入が出来たっぽいのでメモ。
MeCabバージョンは0.98で、PerlライブラリにText::MeCabを使います。
文字コードUTF-8とします。



必要な環境。
MinGW+MSYS
・Strawberry Perl
・Text::Mecab


配布されているバイナリに同根されているライブラリは、VC++でビルドされているため、
StrawberryPerlに同根されているgccでは扱うことが出来ないっぽいので、ビルドしなおします。
mingwのビルドにはパッチを当てる必要があるので、下記を参照して進めます。
http://absolutearea.blogspot.com/2010/11/mecab-mingw-w64-java.html


最新は0.992(現在)ですが、0.99以降はUNICODEバイナリ対応が入ったためか、
0.98のパッチをいじるだけではすぐに対応できなさそうだったので、簡単に0.98のまま使うことにします。
パッチが出たら乗り換えたいと思います。


MSYS上で操作します。
Windows上でのインストール先はC:\mecabとした場合、
MECAB_DEFAULT_RCはC:\mecab\etc\mecabrcになります。

wget http://mecab.googlecode.com/files/mecab-0.98.tar.gz
tar xzvf mecab-0.98.tar.gz
cd mecab-0.98
wget --no-check-certificate "https://docs.google.com/uc?id=0B553vIKAR5LwY2EzNDk5MjAtZGIxMS00MzBkLTg2OTQtZjVhNzAzZmZmZWU1&export=download&hl=ja" -O mecab-0.98.patch
patch -p0 < mecab-0.98.patch
./configure --prefix=C:\\mecab --with-charset=utf-8
make CXXFLAGS+=-UMECAB_DEFAULT_RC CXXFLAGS+=-DMECAB_DEFAULT_RC='\"C:\\mecab\\etc\\mecabrc\"'
make install

(パッチにMECAB_DEFAULT_RCを代入している式をハードコードする差分があった気がするので、その差分は適用しないよう書き換える必要があるかも。)


次に辞書。

wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar xzvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801

PATH=/C/mecab/bin:$PATH \
LD_LIBRARY_PATH=/C/mecab/lib:$LD_LIBRARY_PATH \
./configure --prefix=/C/mecab/mecab --with-charset=utf-8

PATH=/C/mecab/bin:$PATH \
LD_LIBRARY_PATH=/C/mecab/lib:$LD_LIBRARY_PATH \
make 

次はコマンドプロンプトに戻って、cpanからText::MeCabを導入するのですが、
Strawberry Perlに付属しているC++関連のライブラリの内容が不十分なので、
自前にMinGW環境を優先して読み込むようにパスを変えます。
パスは環境によって書き換えてください。
また、テストで失敗したので、強制的にインストールするようにしています。

set PATH=C:\mingw\bin;C:\Strawberry\c\bin;C:\Strawberry\perl\bin
cpan -fi Text::MeCab

Text::MeCabの導入中に入力を要求されるので、以下を応答します。

0.98
 -DWIN32 -IC:\mecab\include -LC:\mecab\lib
 -lC:\mecab\lib\libmecab.a
C:\mecab\include
utf-8


試してみます。単語とその品詞IDを表示します。

use strict;
use warnings;

use Text::MeCab;
use Encode;
use utf8;

my $msg = '久々にワロタ こういうスレが沢山立ってたのが昔のVIPなんだよな 今の新参は昔のVIPを知らないから困る';
my $mecab = Text::MeCab->new({
	node_format =>"%m\t%h\n"
});
for(my $n = $mecab->parse($msg); $n; $n = $n->next){
	print $n->format($mecab);
}
久々	38
に	13
ワロタ	38
こういう	68
スレ	38
が	13
沢山	34
立っ	31
て	33
た	25
の	63
が	13
昔	67
の	24
VIP	38
な	25
ん	63
だ	25
よ	17
な	17
今	67
の	24
新参	38
は	16
昔	67
の	24
VIP	38
を	13
知ら	31
ない	25
から	18
困る	31
EOS