前やってダメだった、Windows版Perlへの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