MeCabの導入方法

MeCabはC++で記述されていますが、SWIGにより他の言語からも利用できる形態で提供されています。ここではそのなかからPerl版を、Windowsで利用することを想定して解説します。

MeCab 0.98の導入方法

MeCab 0.996はWindowsではmakeに失敗するため、手間を惜しむならばMeCab 0.98を使用するのが簡単です。基本的なインストールの手順は、公式ドキュメントにあるように次の通りです。

wget https://mecab.googlecode.com/files/mecab-X.X.tar.gz
tar zxfv mecab-X.X.tar.gz
cd mecab-X.X
./configure
make
make check
make install

まずMeCab本体 (mecab-X.X.tar.gz) をダウンロードします。MeCab 0.98は、mecab-0.98.tar.gz - mecab - mecab - Japanese morphological analyzer - Google Project Hostingにあります。

configure

次にCygwinを起動して、次のようにconfigureを実行します。* Cygwin - 形態素解析 MeCab をインストール! - mk-mode BLOG

$ ./configure CPPFLAGS=-DNOMINMAX LIBS=-liconv

文字エンコーディングをutf-8にするならば、--with-charset=utf-8も追加します。もし実行時に、

configure: error: no acceptable C compiler found in $PATH

のように出力される場合には、Cコンパイラのパスが設定されていません。もしくはインストールされていません。

configure: error: Your compiler is not powerful enough to compile MeCab.

のように出力される場合には、C++コンパイラ (gccではなくg++) がインストールされていません。または期待とは異なる名前でインストールされているだけかもしれません。後者の場合には、

$ ln -s /bin/g++-3.exe /bin/g++.exe

のように、シンボリックリンクを作成して対応します。

Makefileが作成されると、次のように表示されます。

configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/Makefile.msvc
config.status: creating man/Makefile
config.status: creating doc/Makefile
config.status: creating tests/Makefile
config.status: creating swig/version.h
config.status: creating mecab.iss
config.status: creating mecab-config
config.status: creating mecabrc
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing default commands

make

makeします。

$ make

なお、このとき0.98より後のバージョンでは、次のようにエラーとなります。

Makefile:373: recipe for target `libmecab.la' failed

make install

makeに成功したならば、インストールをして完了です。

$ make install

辞書のインストール

辞書をインストールします。これがインストールされていないと、実行時に次のようなエラーが返されます。

$ mecab
tagger.cpp(151) [load_dictionary_resource(param)] param.cpp(71)
[ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc

mecab-ipadic-2.7.0-20070801.tar.gz - mecab - mecab-ipadic - Japanese morphological analyzer - Google Project Hosting

既定でIPA辞書を使用するようになっているため、その辞書をインストールします。手順は次の通りです。

$ tar zxfv mecab-ipadic-2.7.0-X.tar.gz
$ cd mecab-ipadic-2.7.0-X/
$ ./configure
$ make
$ make install

文字エンコーディングをutf-8にするならば、このconfigureでも--with-charset=utf-8を指定します。これで/usr/local/lib/mecab/dic/ipadic/dicrcに辞書がインストールされます。

mecab

インストールに成功すると、次のように解析できます。

$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

Perl向けのライブラリの作成

PerlからMeCabを利用できるようにします。ここでもMeCab 0.98を想定しています。

まずDownloads - mecab - Google Project Hostingから、mecab-perlをダウンロードします。そして、そこに含まれるREADMEにあるように、

% perl Makefile.PL
% make
% su
# make install

の手順でインストールします。

perl Makefile.PL

Makefileを作成します。

$ perl Makefile.PL
Checking if your kit is complete...
Looks good
Note (probably harmless): No library found for -lstdc++
Writing Makefile for MeCab
Writing MYMETA.yml

make

makeしたときに、

cc1plus: error: unrecognized command line option "-fstack-protector"

のようにエラーとなるときには、gcc4にアップグレードします。また、

/usr/local/lib/libmecab.a(iconv_utils.o):iconv_utils.cpp:(.text+0x4c): `libiconv_close'
に対する定義されていない参照です

のようにエラーとなるときには、iconvへのリンクが正しく指定されていません。Makefile.PLで参照するmecab-configを確認し、

$ mecab-config --libs
-L/usr/local/lib -lmecab -lstdc++

のように-liconvが指定されていないならば、このファイル/usr/local/bin/mecab-configの当該部分を

    --libs)
       echo -L${exec_prefix}/lib -lmecab -lstdc++ -liconv
       ;;

のように修正します。

make install

make installで「Do not have write permissions ...」となるときには、Cygwinを管理者権限で実行しなおします。

$ make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ERROR: Can't create '/usr/lib/perl5/site_perl/5.14/i686-cygwin-threads-64int'
Do not have write permissions on '/usr/lib/perl5/site_perl/5.14/i686-cygwin-threads-64int'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 at -e line 1
Makefile:738: recipe for target `pure_site_install' failed
make: *** [pure_site_install] Error 2

perl test.pl

make installまで成功したならば、mecab-perlに含まれるtest.plで、次のように実行を確認できます。

$ perl test.pl
0.98
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS
        BOS/EOS,*,*,*,*,*,*,*,*
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
        BOS/EOS,*,*,*,*,*,*,*,*
B[0] 太郎       名詞,固有名詞,地域,一般,*,*,太郎,タロウ,タロー
B[0] 太郎       名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
B[0] 太 動詞,自立,*,*,五段・ラ行,体言接続特殊2,太る,フト,フト
B[0] 太 名詞,固有名詞,地域,一般,*,*,太,タイ,タイ
B[0] 太 名詞,固有名詞,人名,名,*,*,太,フトシ,フトシ
B[0] 太 形容詞,自立,*,*,形容詞・アウオ段,ガル接続,太い,フト,フト
E[0]    BOS/EOS,*,*,*,*,*,*,*,*
B[3] 郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
E[3] 太 形容詞,自立,*,*,形容詞・アウオ段,ガル接続,太い,フト,フト
E[3] 太 名詞,固有名詞,人名,名,*,*,太,フトシ,フトシ
E[3] 太 名詞,固有名詞,地域,一般,*,*,太,タイ,タイ
E[3] 太 動詞,自立,*,*,五段・ラ行,体言接続特殊2,太る,フト,フト
B[6] はこ       動詞,自立,*,*,五段・カ行イ音便,未然ウ接続,はく,ハコ,ハコ
B[6] は 動詞,非自立,*,*,五段・ラ行,体言接続特殊2,はる,ハ,ハ
B[6] は 動詞,自立,*,*,五段・ラ行,体言接続特殊2,はる,ハ,ハ
B[6] は 助詞,係助詞,*,*,*,*,は,ハ,ワ
E[6] 郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
E[6] 太郎       名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
E[6] 太郎       名詞,固有名詞,地域,一般,*,*,太郎,タロウ,タロー
B[9] この       連体詞,*,*,*,*,*,この,コノ,コノ
B[9] こ 動詞,非自立,*,*,カ変・クル,未然形,くる,コ,コ
B[9] こ 動詞,自立,*,*,カ変・クル,未然形,くる,コ,コ
B[9] こ 動詞,自立,*,*,五段・ラ行,体言接続特殊2,こる,コ,コ
B[9] こ 動詞,非自立,*,*,五段・カ行促音便,未然ウ接続,く,コ,コ
B[9] こ 名詞,一般,*,*,*,*,こ,コ,コ
B[9] こ 形容詞,自立,*,*,形容詞・アウオ段,ガル接続,こい,コ,コ
E[9] は 助詞,係助詞,*,*,*,*,は,ハ,ワ
E[9] は 動詞,自立,*,*,五段・ラ行,体言接続特殊2,はる,ハ,ハ
E[9] は 動詞,非自立,*,*,五段・ラ行,体言接続特殊2,はる,ハ,ハ
B[12] の        動詞,自立,*,*,五段・ラ行,体言接続特殊2,のる,ノ,ノ
B[12] の        助詞,終助詞,*,*,*,*,の,ノ,ノ
B[12] の        助詞,連体化,*,*,*,*,の,ノ,ノ
B[12] の        助詞,格助詞,一般,*,*,*,の,ノ,ノ
B[12] の        名詞,非自立,一般,*,*,*,の,ノ,ノ
E[12] こ        形容詞,自立,*,*,形容詞・アウオ段,ガル接続,こい,コ,コ
E[12] こ        名詞,一般,*,*,*,*,こ,コ,コ
E[12] こ        動詞,非自立,*,*,五段・カ行促音便,未然ウ接続,く,コ,コ
E[12] こ        動詞,自立,*,*,五段・ラ行,体言接続特殊2,こる,コ,コ
E[12] こ        動詞,自立,*,*,カ変・クル,未然形,くる,コ,コ
E[12] こ        動詞,非自立,*,*,カ変・クル,未然形,くる,コ,コ
E[12] はこ      動詞,自立,*,*,五段・カ行イ音便,未然ウ接続,はく,ハコ,ハコ
B[15] 本        名詞,接尾,助数詞,*,*,*,本,ホン,ホン
B[15] 本        接頭詞,名詞接続,*,*,*,*,本,ホン,ホン
B[15] 本        名詞,固有名詞,地域,一般,*,*,本,ホン,ホン
B[15] 本        名詞,固有名詞,地域,一般,*,*,本,モト,モト
B[15] 本        名詞,固有名詞,人名,姓,*,*,本,モト,モト
B[15] 本        名詞,一般,*,*,*,*,本,モト,モト
B[15] 本        名詞,一般,*,*,*,*,本,ホン,ホン
E[15] の        名詞,非自立,一般,*,*,*,の,ノ,ノ
E[15] の        助詞,格助詞,一般,*,*,*,の,ノ,ノ
E[15] の        助詞,連体化,*,*,*,*,の,ノ,ノ
E[15] の        助詞,終助詞,*,*,*,*,の,ノ,ノ
E[15] の        動詞,自立,*,*,五段・ラ行,体言接続特殊2,のる,ノ,ノ
E[15] この      連体詞,*,*,*,*,*,この,コノ,コノ
B[18] を        助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
E[18] 本        名詞,一般,*,*,*,*,本,ホン,ホン
E[18] 本        名詞,一般,*,*,*,*,本,モト,モト
E[18] 本        名詞,固有名詞,人名,姓,*,*,本,モト,モト
E[18] 本        名詞,固有名詞,地域,一般,*,*,本,モト,モト
E[18] 本        名詞,固有名詞,地域,一般,*,*,本,ホン,ホン
E[18] 本        接頭詞,名詞接続,*,*,*,*,本,ホン,ホン
E[18] 本        名詞,接尾,助数詞,*,*,*,本,ホン,ホン
B[21] 二郎      名詞,数,*,*,*,*,*
B[21] 二郎      名詞,固有名詞,一般,*,*,*,二郎,ニロウ,ニロー
B[21] 二郎      名詞,固有名詞,人名,名,*,*,二郎,ニロウ,ニロー
B[21] 二郎      名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
B[21] 二        名詞,固有名詞,地域,一般,*,*,二,フタ,フタ
B[21] 二        名詞,数,*,*,*,*,二,ニ,ニ
E[21] を        助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
B[24] 郎        名詞,一般,*,*,*,*,郎,ロウ,ロー
E[24] 二        名詞,数,*,*,*,*,二,ニ,ニ
E[24] 二        名詞,固有名詞,地域,一般,*,*,二,フタ,フタ
B[27] を        助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
E[27] 郎        名詞,一般,*,*,*,*,郎,ロウ,ロー
E[27] 二郎      名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
E[27] 二郎      名詞,固有名詞,人名,名,*,*,二郎,ニロウ,ニロー
E[27] 二郎      名詞,固有名詞,一般,*,*,*,二郎,ニロウ,ニロー
E[27] 二郎      名詞,数,*,*,*,*,*
B[30] 見        動詞,自立,*,*,一段,連用形,見る,ミ,ミ
B[30] 見        動詞,自立,*,*,一段,未然形,見る,ミ,ミ
B[30] 見        名詞,固有名詞,地域,一般,*,*,見,ミル,ミル
E[30] を        助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
B[33] た        動詞,非自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
B[33] た        動詞,自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
B[33] た        助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
B[33] た        助動詞,*,*,*,特殊・タイ,ガル接続,たい,タ,タ
E[33] 見        名詞,固有名詞,地域,一般,*,*,見,ミル,ミル
E[33] 見        動詞,自立,*,*,一段,未然形,見る,ミ,ミ
E[33] 見        動詞,自立,*,*,一段,連用形,見る,ミ,ミ
B[36] 女性      名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
B[36] 女        名詞,接尾,助数詞,*,*,*,女,ジョ,ジョ
B[36] 女        接頭詞,名詞接続,*,*,*,*,女,ジョ,ジョ
B[36] 女        名詞,一般,*,*,*,*,女,ジョ,ジョ
B[36] 女        名詞,一般,*,*,*,*,女,オンナ,オンナ
E[36] た        助動詞,*,*,*,特殊・タイ,ガル接続,たい,タ,タ
E[36] た        助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
E[36] た        動詞,自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
E[36] た        動詞,非自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
B[39] 性        名詞,接尾,一般,*,*,*,性,セイ,セイ
B[39] 性        名詞,一般,*,*,*,*,性,サガ,サガ
B[39] 性        名詞,一般,*,*,*,*,性,セイ,セイ
B[39] 性        名詞,一般,*,*,*,*,性,ショウ,ショー
E[39] 女        名詞,一般,*,*,*,*,女,オンナ,オンナ
E[39] 女        名詞,一般,*,*,*,*,女,ジョ,ジョ
E[39] 女        接頭詞,名詞接続,*,*,*,*,女,ジョ,ジョ
E[39] 女        名詞,接尾,助数詞,*,*,*,女,ジョ,ジョ
B[42] に        動詞,自立,*,*,一段,連用形,にる,ニ,ニ
B[42] に        動詞,自立,*,*,一段,未然形,にる,ニ,ニ
B[42] に        助詞,副詞化,*,*,*,*,に,ニ,ニ
B[42] に        助詞,特殊,*,*,*,*,に,ニ,ニ
B[42] に        助詞,格助詞,一般,*,*,*,に,ニ,ニ
E[42] 性        名詞,一般,*,*,*,*,性,ショウ,ショー
E[42] 性        名詞,一般,*,*,*,*,性,セイ,セイ
E[42] 性        名詞,一般,*,*,*,*,性,サガ,サガ
E[42] 性        名詞,接尾,一般,*,*,*,性,セイ,セイ
E[42] 女性      名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
B[45] 渡し      動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
B[45] 渡し      名詞,一般,*,*,*,*,渡し,ワタシ,ワタシ
B[45] 渡        動詞,自立,*,*,五段・ラ行,体言接続特殊2,渡る,ワタ,ワタ
B[45] 渡        名詞,固有名詞,地域,一般,*,*,渡,ワタシ,ワタシ
B[45] 渡        名詞,固有名詞,地域,一般,*,*,渡,ド,ド
B[45] 渡        名詞,固有名詞,地域,一般,*,*,渡,ワタリ,ワタリ
B[45] 渡        名詞,固有名詞,人名,姓,*,*,渡,ワタリ,ワタリ
B[45] 渡        名詞,固有名詞,人名,名,*,*,渡,ワタル,ワタル
E[45] に        助詞,格助詞,一般,*,*,*,に,ニ,ニ
E[45] に        助詞,特殊,*,*,*,*,に,ニ,ニ
E[45] に        助詞,副詞化,*,*,*,*,に,ニ,ニ
E[45] に        動詞,自立,*,*,一段,未然形,にる,ニ,ニ
E[45] に        動詞,自立,*,*,一段,連用形,にる,ニ,ニ
B[48] した      名詞,一般,*,*,*,*,した,シタ,シタ
B[48] し        動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
B[48] し        動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
B[48] し        動詞,自立,*,*,五段・ラ行,体言接続特殊2,しる,シ,シ
B[48] し        動詞,接尾,*,*,五段・サ行,連用形,す,シ,シ
B[48] し        助詞,接続助詞,*,*,*,*,し,シ,シ
B[48] し        助動詞,*,*,*,文語・キ,体言接続,き,シ,シ
E[48] 渡        名詞,固有名詞,人名,名,*,*,渡,ワタル,ワタル
E[48] 渡        名詞,固有名詞,人名,姓,*,*,渡,ワタリ,ワタリ
E[48] 渡        名詞,固有名詞,地域,一般,*,*,渡,ワタリ,ワタリ
E[48] 渡        名詞,固有名詞,地域,一般,*,*,渡,ド,ド
E[48] 渡        名詞,固有名詞,地域,一般,*,*,渡,ワタシ,ワタシ
E[48] 渡        動詞,自立,*,*,五段・ラ行,体言接続特殊2,渡る,ワタ,ワタ
B[51] た        動詞,非自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
B[51] た        動詞,自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
B[51] た        助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
B[51] た        助動詞,*,*,*,特殊・タイ,ガル接続,たい,タ,タ
E[51] し        助動詞,*,*,*,文語・キ,体言接続,き,シ,シ
E[51] し        助詞,接続助詞,*,*,*,*,し,シ,シ
E[51] し        動詞,接尾,*,*,五段・サ行,連用形,す,シ,シ
E[51] し        動詞,自立,*,*,五段・ラ行,体言接続特殊2,しる,シ,シ
E[51] し        動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
E[51] し        動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
E[51] 渡し      名詞,一般,*,*,*,*,渡し,ワタシ,ワタシ
E[51] 渡し      動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
B[54] 。        名詞,サ変接続,*,*,*,*,*
B[54] 。        記号,句点,*,*,*,*,。,。,。
E[54] た        助動詞,*,*,*,特殊・タイ,ガル接続,たい,タ,タ
E[54] た        助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
E[54] た        動詞,自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
E[54] た        動詞,非自立,*,*,五段・ラ行,体言接続特殊2,たる,タ,タ
E[54] した      名詞,一般,*,*,*,*,した,シタ,シタ
B[57]   BOS/EOS,*,*,*,*,*,*,*,*
E[57]   BOS/EOS,*,*,*,*,*,*,*,*
E[57] 。        記号,句点,*,*,*,*,。,。,。
E[57] 。        名詞,サ変接続,*,*,*,*,*
filename: /usr/local/lib/mecab/dic/ipadic/sys.dic
charset: utf-8
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102

MeCab 0.996の導入方法

Windows版はインストーラによって辞書も同時にインストールされますので、簡単に導入することができます。

mecab-0.996.exe - mecab - mecab-win - Japanese morphological analyzer - Google Project Hosting

インストール時に辞書の文字エンコーディングを問われます。既定でShift_JISとなっていますが、必要ならば他のエンコーディングに変更します。ただ、これは後からでも変更できます。

またインストール時に、MeCabの設定ファイル (mecabrc) のパスがレジストリに書き込まれます。それは[HKEY_LOCAL_MACHINE\Software\MeCab]または[HKEY_CURRENT_USER\Software\MeCab]のいずれかの場所です。

MeCabをPHPから利用するならば、ここでインストールされた実行ファイルをそのまま呼び出す方法もあります。

Perl向けのライブラリの作成

インストーラによる方法では必要なファイルがそろわないため、Perlから利用するには改めてコンパイルから行う必要があります。しかしこのような手間をかけなくとも、Perl向けに用意されたText::MeCabを選択する方が賢明かも知れません。

Perl向けのラッパーの作成

SWIGを利用して、Perl向けのラッパーを作成します。

C:\swigwin>swig.exe -perl5 -c++ C:\mecab-0.996\swig\MeCab.i

いくつか警告が出力されますが、これらは問題となりません。

C:\mecab-0.996\swig\..\src\mecab.h(56) : Warning 314: 'next' is a perl keyword
C:\mecab-0.996\swig\..\src\mecab.h(107) : Warning 314: 'next' is a perl keyword
C:\mecab-0.996\swig\..\src\mecab.h(136) : Warning 302: Identifier 'surface' redefined by %extend (ignored),
C:\mecab-0.996\swig\MeCab.i(74) : Warning 302: %extend definition of 'surface'.
C:\mecab-0.996\swig\..\src\mecab.h(895) : Warning 314: 'next' is a perl keyword
C:\mecab-0.996\swig\..\src\mecab.h(848) : Warning 302: Identifier 'set_sentence' redefined by %extend (ignored),
C:\mecab-0.996\swig\MeCab.i(95) : Warning 302: %extend definition of 'set_sentence'.
C:\mecab-0.996\swig\..\src\mecab.h(1238) : Warning 314: 'next' is a perl keyword

この結果、MeCab.iと同一のフォルダに、

  • MeCab.pm
  • MeCab_wrap.cxx

の2つのファイルが作成されます。このうちモジュール ファイルMeCab.pmを、Perlのライブラリ フォルダ (C:\Perl64\site\lib) にコピーします。

Visual C++でのMake

Visual C++でMakeするには、コードの修正が必要です。ここでは64bit環境で、コンパイラにはVisual C++ 9.0 (2008) を想定しています。まずCygwinなどで

$ ./configure LIBS=-liconv

とし、

  • src\Makefile.msvc
  • config.h

などのファイルを生成します。そしてこのMakefile.msvcを修正します。

必要となるのはMeCab.dllを作成するコマンドと、そのターゲットが呼び出されるようにする記述。そして64bit環境向けにMakeするならば「X86」から「X64」への書き換えと、MeCabのインストールフォルダのパスの修正です。

修正箇所の差分を次に示します。なお、この差分はdiffによるものです。

$ diff -ur mecab-0.996-original/src/Makefile.msvc mecab-0.996/src/Makefile.msvc
--- mecab-0.996-original/src/Makefile.msvc
+++ mecab-0.996/src/Makefile.msvc
@@ -3,12 +3,12 @@
 LINK=link.exe

 CFLAGS = /EHsc /O2 /GL /GA /Ob2 /nologo /W3 /MT /Zi /wd4800 /wd4305 /wd4244
-LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X86 ADVAPI32.LIB
+LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
 DEFS =  -D_CRT_SECURE_NO_DEPRECATE -DMECAB_USE_THREAD \
         -DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
         -DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
         -DUNICODE -D_UNICODE \
-        -DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
+        -DMECAB_DEFAULT_RC="\"c:\\Program Files (x86)\\mecab\\etc\\mecabrc\""
 INC = -I. -I..
 DEL = del

@@ -26,7 +26,10 @@
 .cpp.obj:
        $(CC) $(CFLAGS) $(INC) $(DEFS) -c  $<

-all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen
+all: libmecab mecab mecab-dict-index mecab-dict-gen mecab-cost-train mecab-system-eval mecab-test-gen mecabdll
+
+mecabdll: $(OBJ) libmecab.obj
+       $(CC) $(CFLAGS) $(INC) /LD /FeMeCab.dll /IC:/Perl64/lib/CORE/ /D "WIN32" ../swig/MeCab_wrap.cxx $(OBJ) libmecab.obj advapi32.lib C:/Perl64/lib/CORE/perl514.lib

 mecab: $(OBJ) mecab.obj
        $(LINK) $(LDFLAGS) /out:$@.exe mecab.obj libmecab.lib

「C:/Perl64」や「perl514.lib」の記述は、環境に合わせて適宜修正が必要です。

コードの修正

続けてエラーとなるコードを修正していきます。対象となるのは、

  • src/feature_index.cpp
  • src/writer.cpp
  • config.h
  • src/utils.cpp
  • src/make.bat

の5つのファイルです。まずはキャストに失敗する部分を修正します。

diff -ur mecab-0.996-original/src/feature_index.cpp mecab-0.996/src/feature_index.cpp
--- mecab-0.996-original/src/feature_index.cpp
+++ mecab-0.996/src/feature_index.cpp
@@ -353,7 +353,7 @@
               if (!r) goto NEXT;
               os_ << r;
             } break;
-            case 't':  os_ << (size_t)path->rnode->char_type;     break;
+            case 't':  os_ << (unsigned int)path->rnode->char_type;     break;
             case 'u':  os_ << ufeature; break;
             case 'w':
               if (path->rnode->stat == MECAB_NOR_NODE) {

size_tのままでは「feature_index.cpp(356) : error C2593: 'operator <<' があいまいです。」となります。次の部分も「writer.cpp(260) : error C2593: 'operator <<' があいまいです。」となります。これらはコンパイラの指示に従って修正します。

diff -ur mecab-0.996-original/src/writer.cpp mecab-0.996/src/writer.cpp
--- mecab-0.996-original/src/writer.cpp
+++ mecab-0.996/src/writer.cpp
@@ -257,7 +257,7 @@
             // input sentence
           case 'S': os->write(lattice->sentence(), lattice->size()); break;
             // sentence length
-          case 'L': *os << lattice->size(); break;
+          case 'L': *os << (unsigned int)lattice->size(); break;
             // morph
           case 'm': os->write(node->surface, node->length); break;
           case 'M': os->write(reinterpret_cast<const char *>

VC++ 10.0 (VC++ 2010) より前にはstdint.hがありません。よってその環境に該当するならば、ヘッダでそれを指示します。

diff -ur mecab-0.996-original/config.h mecab-0.996/config.h
--- mecab-0.996-original/config.h
+++ mecab-0.996/config.h
@@ -53,7 +53,7 @@
 #define HAVE_PTHREAD_H 1

 /* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
+#define HAVE_STDINT_H 0

 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1

このマクロを書き換えたならば、それへの対応が1か所欠けているため、それも修正します。この問題は「fatal error C1083: include ファイルを開けません。'stdint.h': No such file or directory」のように報告されます。

diff -ur mecab-0.996-original/src/utils.cpp mecab-0.996/src/utils.cpp
--- mecab-0.996-original/src/utils.cpp
+++ mecab-0.996/src/utils.cpp
@@ -25,7 +25,9 @@
 #include <stdlib.h>
 #endif

+#ifdef HAVE_STDINT_H
 #include <stdint.h>
+#endif

 #if defined(_WIN32) && !defined(__CYGWIN__)
 extern HINSTANCE DllInstance;

既定ではVC++ 8.0を使用する前提となっているため、必要ならばここも修正します。環境に合わせたパスの設定は、ここで示すようにvcvarsall.batバッチファイルを呼び出すのが簡単です。

diff -ur mecab-0.996-original/src/make.bat mecab-0.996/src/make.bat
--- mecab-0.996-original/src/make.bat
+++ mecab-0.996/src/make.bat
@@ -1,8 +1,5 @@
-Set PATH=c:\Program Files\Microsoft Visual Studio 8\VC\bin;%PATH%
-Set INCLUDE=c:\Program Files\Microsoft Visual Studio 8\VC\include;c:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%
-Set LIB=c:\Program Files\Microsoft Visual Studio 8\VC\lib;c:\Program Files\Microsoft Platform SDK\Lib;%LIB%
-Set COMSPEC=cmd.exe
+call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64
 rem nmake -f Makefile.msvc clean
 nmake -f Makefile.msvc

修正が完了したら、このmake.batを実行します。そしてsrcフォルダに生成されたmecab.exeを呼び出し、適当な文で分かち書きができたら成功です。またDオプションを指定することで辞書の情報を、PオプションでMeCabの設定を確認できます。それらのオプションのすべては、次の通りです。

C:\mecab-0.996\src>mecab.exe -h
MeCab: Yet Another Part-of-Speech and Morphological Analyzer

Copyright(C) 2001-2012 Taku Kudo
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation

Usage: mecab.exe [options] files
 -r, --rcfile=FILE              use FILE as resource file
 -d, --dicdir=DIR               set DIR  as a system dicdir
 -u, --userdic=FILE             use FILE as a user dictionary
 -l, --lattice-level=INT        lattice information level (DEPRECATED)
 -D, --dictionary-info          show dictionary information and exit
 -O, --output-format-type=TYPE  set output format type (wakati,none,...)
 -a, --all-morphs               output all morphs(default false)  (ソフトわかち書き)
 -N, --nbest=INT                output N best results (default 1)
 -p, --partial                  partial parsing mode (default false)
 -m, --marginal                 output marginal probability (default false)
 -M, --max-grouping-size=INT    maximum grouping size for unknown words (default 24)
 -F, --node-format=STR          use STR as the user-defined node format
 -U, --unk-format=STR           use STR as the user-defined unknown node format
 -B, --bos-format=STR           use STR as the user-defined beginning-of-sentence format
 -E, --eos-format=STR           use STR as the user-defined end-of-sentence format
 -S, --eon-format=STR           use STR as the user-defined end-of-NBest format
 -x, --unk-feature=STR          use STR as the feature for unknown word
 -b, --input-buffer-size=INT    set input buffer size (default 8192)
 -P, --dump-config              dump MeCab parameters
 -C, --allocate-sentence        allocate new memory for input sentence
 -t, --theta=FLOAT              set temparature parameter theta (default 0.75)
 -c, --cost-factor=INT          set cost factor (default 700)
 -o, --output=FILE              set the output file name
 -v, --version                  show the version and exit.
 -h, --help                     show this help and exit.

最後に同じフォルダに生成されたMeCab.dllを、MeCab.pmと同じくPerlのライブラリ フォルダ (C:\Perl64\site\lib) へコピーすることで、MeCabをPerlから利用できるようになります。

実行確認

次のようにファイルに記述し、

#!/usr/bin/perl
use strict;
use warnings;

use MeCab;

my $model = new MeCab::Model( '' );
my $c = $model->createTagger();

print $MeCab::VERSION, "\n";
print $c->parse( 'すもももももももものうち' );

# 辞書の情報を出力
for( my $d = $c->dictionary_info(); $d; $d = $d->{next} )
{
    printf( "filename: %s\n", $d->{filename} );
    printf( "charset: %s\n", $d->{charset} );
    printf( "size: %d\n", $d->{size} );
    printf( "type: %d\n", $d->{type} );
    printf( "lsize: %d\n", $d->{lsize} );
    printf( "rsize: %d\n", $d->{rsize} );
    printf( "version: %d\n", $d->{version} );
}

これを、perl test.plのように実行します。

$ perl test.pl
0.996
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
filename: C:\Program Files (x86)\MeCab\etc\..\dic\ipadic\sys.dic
charset: SHIFT-JIS
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102

もし「Can't locate MeCab.pm in @INC」としてエラーとなるならば、MeCab.pmをパスの通っている場所に配置しなおします。「Can't locate loadable object for module MeCab in @INC」のエラーならば、MeCab.dllについて同様に確認します。

RuntimeError param.cpp(69) [ifs] no such file or directory: C:\Program Files (x86)\MeCab\etc\mecabrc」となるならば、エラーで指摘されたファイル、この場合はmecabrcのパスを確認します。指摘のファイルが「…dic\ipadic\dicrc」ならば、辞書のインストールを確認します。

Can't load './MeCab.dll' for module MeCab: load_file:%1 は有効な Win32 アプリケーションではありません。」となるときは、環境に適合するようにコンパイルできていません。

PHPからの利用方法

$text = 'すもももももももものうち';

$exe_path = 'C:/"Program Files (x86)"/MeCab/bin/mecab.exe';
$descriptorspec = array( 0=>array( 'pipe', 'r' ), 1=>array( 'pipe', 'w' ) );

$process = proc_open( $exe_path, $descriptorspec, $pipes );
if( is_resource( $process ) )
{
    fwrite( $pipes[ 0 ], $text );
    fclose( $pipes[ 0 ] );

    $result = stream_get_contents( $pipes[ 1 ] );
    fclose( $pipes[ 1 ] );

    proc_close( $process );

    header( 'Content-Type: text/plain; charset=shift-jis' );
    print_r( $result );
}
else
{
    echo 'Error';
}

これは次のように出力されます。

すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

単独での実行

単独で実行するのに必要となるのは、次のファイルのみです。

C:.
|   libmecab.dll
|   mecab.exe
|   mecabrc
|
\---dic
        dicrc      // 辞書の動作を指定するファイル
        sys.dic    // システム辞書のファイル
        unk.dic    // 未知語用の辞書
        char.bin   // プロパティ ファイル
        matrix.bin //
設定ファイルの準備 - MeCab: オリジナル辞書/コーパスからのパラメータ推定

Text::MeCab

Text::MeCabは、MeCab用のPerlモジュールです。前述の方法ではSWIGで機械的に生成しているだけなのですが、これをよりPerlから使いやすいようにしているようです。

辞書

MeCab用として想定されている辞書には、

があります。これらの辞書による解析結果の違いは、IPA、NAIST、UniDic、JUMANの辞書実演比較(Mecab)で比較することができます。ただしこのページは2009年頃から更新されていないようで、いくつかの辞書はすでに古くなっています。

ところでMeCabでは辞書のcsvファイルはShift_JISを既定としていますが、これらの辞書ではEUC-JPが用いられていることがあります。

不正な辞書によるエラー

辞書を変更や修正したとき、そのデータが不正な状態であると解析に失敗します。たとえばPerlでは、

my $model = new MeCab::Model( '' );
my $c = $model->createTagger();

print $c->parse( 'すもももももももものうち' );

とするとparse()が未定義値を返し、「Use of uninitialized value in print」となります。

使用する辞書の変更

たとえば辞書をUniDicに変更するには、ダウンロードファイル一覧 - UniDic - OSDNから必要なファイルをダウンロードします。そこにはいくつかのファイルが用意されていますが、[unidic-mecab-x.x.x_bin.zip]の名前のバイナリを用いると導入が簡単です。

ダウンロードしたファイルを展開すると、sys.dicやchar.binが含まれるフォルダが現れます。それが必要なファイルの一式ですので、辞書としてそのフォルダが参照されるように、リソース ファイル内のdicdirでそのフォルダのパスを指定します。

ソースからのインストール

ソースで入手した辞書は、

./configure
make
make install

の手順でインストールできます。ただしそれには、あらかじめ環境にMeCabがインストールされている必要があります。しかしもしそのインストールが手間ならば、MeCabがインストールされている他の環境に辞書をインストールし、その辞書を流用する方法もあります。

辞書の情報

使用されている辞書の情報は、Dオプションで確認できます。

C:\mecab.exe -D
filename:       C:\Program Files (x86)\MeCab\etc\..\dic\ipadic\sys.dic
version:        102
charset:        SHIFT-JIS
type:   0
size:   392126
left size:      1316
right size:     1316
辞書のパス

読み込まれる辞書は、以下の場所で指定されたリソース ファイルを参照して決定されます。このリストの並びで設定が優先され、有効な設定がない場合に次の項目が参照されます。MeCab 0.90 における mecabrc ファイルの優先順位: ナマズのブログ

  1. コマンドラインのrオプション
  2. ホーム ディレクトリの.mecabrcファイル
  3. 環境変数MECABRC
  4. レジストリの[HKEY_LOCAL_MACHINE\Software\MeCab\mecabrc]
  5. レジストリの[HKEY_CURRENT_USER\Software\MeCab\mecabrc]
  6. dllのディレクトリにあるmecabrcファイル
  7. コンパイル時のMECAB_DEFAULT_RCマクロ

これらはリソース ファイルのパスです。辞書のパスは、そのリソース ファイル内に記述します。

この処理過程は、utils.cppのload_dictionary_resource()で確認できます。たとえばコマンドライン パラメータで指定する場合は、

C:\>mecab -rmecabrc

のように、Perlで環境変数に指定するならば、

$ENV{ 'MECABRC' } = 'MeCab/mecabrc';

のようにします。

リソース ファイル (mecabrc)

リソース ファイルは次のような内容です。

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  $(rcpath)\..\dic\ipadic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

このとき、それぞれ

  • dicdir … システム辞書
  • userdic … ユーザー辞書

で辞書のパスを指定します。

辞書データの構成

辞書用のcsvファイルではEUC-JPが用いられていることがあり、この文字エンコーディングに対応したツールでなければ正常に開けないことがあります。

Seed辞書

Seed辞書とは、語を定義する辞書です。たとえばIPAdic (mecab-ipadic) ならば、拡張子が.csvとなっているファイルがそれです。このファイルでは最初の4項目までが必須とされており、

  1. 表層形 (単語そのもの)
  2. 左連接状態番号 (左文脈ID)
  3. 右連接状態番号 (右文脈ID)
  4. コスト

が定義されている必要があります。残りの項目は任意で、たとえばIPAdicではそれらに次の意味を与えています。rewrite.def

  1. 品詞1
  2. 品詞2
  3. 品詞3
  4. 品詞4
  5. 活用形
  6. 活用型
  7. 原形
  8. 読み
  9. 発音

IPAdicでは動詞の語をVerb.csvで定義しており、その最初の2行は、

引き込む,762,762,7122,動詞,自立,*,*,五段・マ行,基本形,引き込む,ヒキコム,ヒキコム
引き込ま,764,764,7118,動詞,自立,*,*,五段・マ行,未然形,引き込む,ヒキコマ,ヒキコマ

のように記述されています。これを前述の項目の意味と合わせて考えると、下表の意味であることがわかります。

表層形 左連接状態番号 右連接状態番号 コスト 品詞1 品詞2 品詞3 品詞4 活用形 活用型 原形 読み 発音
引き込む 762 762 7122 動詞 自立 * * 五段・マ行 基本形 引き込む ヒキコム ヒキコム
引き込ま 764 764 7118 動詞 自立 * * 五段・マ行 未然形 引き込む ヒキコマ ヒキコマ
Seed辞書の準備 - MeCab: オリジナル辞書/コーパスからのパラメータ推定

設定ファイル

  • dicrc … 辞書の設定
  • char.def … 未知語処理の定義
  • unk.def … 未知語用の辞書
  • rewrite.def … 素性列から、内部状態素性列に変換するマッピングの定義
  • feature.def … 内部状態の素性列から、CRFの素性列を抽出するためのテンプレートの定義
設定ファイルの準備 - MeCab: オリジナル辞書/コーパスからのパラメータ推定

コスト (cost)

  • 単語生起コスト

文字エンコーディングの変更

mecab-dict-index.exeで、文字エンコーディングを変更して辞書を再構築できます。たとえばインストーラ版によってインストールされたIPAdicの文字エンコーディングをUTF-8にするならば、カレントディレクトリを辞書のディレクトリとして、

C:\Program Files (x86)\MeCab\dic\ipadic>..\..\bin\mecab-dict-index -f SHIFT-JIS -t UTF-8
文字コード変更 - MeCab: Yet Another Part-of-Speech and Morphological Analyzer

とします。

このプログラムは、辞書ファイルへの書き込み権限を持ったユーザーで実行します。もし権限がなくファイルの更新に失敗しても、それが通知されないため注意が必要です。

オプションの意味は、次の通りです。

Usage: mecab-dict-index.exe [options] files
 -d, --dicdir=DIR                    set DIR as dic dir (default ".")
 -o, --outdir=DIR                    set DIR as output dir (default ".")
 -m, --model=FILE                    use FILE as model file
 -u, --userdic=FILE                  build user dictionary
 -a, --assign-user-dictionary-costs  only assign costs/ids to user dictionary
 -U, --build-unknown                 build parameters for unknown words
 -M, --build-model                   build model file
 -C, --build-charcategory            build character category maps
 -s, --build-sysdic                  build system dictionary
 -m, --build-matrix                  build connection matrix
 -c, --charset=ENC                   make charset of binary dictionary ENC (default SHIFT-JIS)
 -t, --charset=ENC                   alias of -c
 -f, --dictionary-charset=ENC        assume charset of input CSVs as ENC (default SHIFT-JIS)
 -w, --wakati                        build wakati-gaki only dictionary
 -p, --posid                         assign Part-of-speech id
 -F, --node-format=STR               use STR as the user defined node format
 -v, --version                       show the version and exit.
 -h, --help                          show this help and exit.
mecab-dict-index.exe --help

よって辞書のパスも指定して変換するならば、

C:\>Program Files (x86)\MeCab\bin\mecab-dict-index -d C:\ipadic -o C:\ -f euc-jp -t utf-8

のようにします。実行時に「permission denied」としてエラーとなる場合があります。これは出力先のディレクトリが存在しない場合にも同様のメッセージとなるため、注意が必要です。

文字エンコーディングの変更が成功すると、

  • sys.dic
  • unk.dic

の2つのファイルが更新されます。

単語の追加

 

未知語の処理方法

未知語、つまり辞書に載っていない単語の処理方法を、独自に定義できます。

連続する数字を1つにまとめる

既定ではIPAdicは、数字から構成される未知語はすべて1文字ずつに分解します。たとえば「123人」は、

1	名詞,数,*,*,*,*,1,イチ,イチ
2	名詞,数,*,*,*,*,2,ニ,ニ
3	名詞,数,*,*,*,*,3,サン,サン
人	名詞,接尾,助数詞,*,*,*,人,ニン,ニン

となります。これの数字部分を1語とするには、未知語用の辞書であるunk.defの数字の定義において、その4番目にあるコストの項目を小さな値に設定します。

NUMERIC,1295,1295,0,名詞,数,*,*,*,*,*

さらに1文字の数字が未知語となるように、それらが定義されているNoun.number.csvから、その定義を削除します。

...
数,1295,1295,6512,名詞,数,*,*,*,*,数,スウ,スー
5,1295,1295,3370,名詞,数,*,*,*,*,5,ゴ,ゴ
八,1295,1295,3615,名詞,数,*,*,*,*,八,ハチ,ハチ
...

修正が終わったらmecab-dict-indexを実行し、辞書を生成し直します。そうすると解析の結果は次のように変化します。

123	名詞,数,*,*,*,*,*
人	名詞,接尾,助数詞,*,*,*,人,ニン,ニン

この方法の詳細は、MeCab: 未知語処理で解説されています。

解析方法

解析結果

出力フォーマット

出力フォーマットは辞書のフォルダ、たとえばIPAdicならばMeCab\dic\ipadicdicrcファイルで定義されています。その内容は次のようなものです。

cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 8
unk-eval-size = 4
config-charset = EUC-JP

; simple
node-format-simple = %m\t%F-[0,1,2,3]\n
eos-format-simple  = EOS\n

; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n

これはmecabの-Oオプションで、定義にある「simple」や「chasen」を指定することで出力フォーマットを変更できます。このとき存在しないフォーマットを指定すると、「unkown format type [ *** ]」としてエラーとなります。

ここで定義されている以外にも、

  • wakati … 分かち書きのみを出力
  • dump … すべての情報を出力

の2つが既定で用意されています。

たとえばこの出力フォーマットをPerlで指定するならば、

my $model = new MeCab::Model( '-Ochasen' );

のようにします。

出力例
; simple
node-format-simple = %m\t%F-[0,1,2,3]\n
eos-format-simple  = EOS\n
すもも	名詞-一般
も	助詞-係助詞
もも	名詞-一般
も	助詞-係助詞
もも	名詞-一般
の	助詞-連体化
うち	名詞-非自立-副詞可能
EOS
; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n
すもも	スモモ	すもも	名詞-一般
も	モ	も	助詞-係助詞
もも	モモ	もも	名詞-一般
も	モ	も	助詞-係助詞
もも	モモ	もも	名詞-一般
の	ノ	の	助詞-連体化
うち	ウチ	うち	名詞-非自立-副詞可能
EOS

独自のフォーマットの定義

新たなフォーマットを追加するには前述のdicrcか、リソース ファイルのmecabrcに追記します。

  説明 既定値
node 1つの形態素を出力 空文字
unk 1つの未知語形態素を出力 nodeと同一フォーマット ※1
bos 形態素解析の結果に先だって出力 (header的役割) 空文字
eos 形態素解析の結果の後に出力 (footer的役割) EOS\n
eon N-best出力で、N-Bestの出力が終了したときに出力 空文字列
※1 ただし未知語のフォーマットが指定されていないと、未知語は出力されません。

これらは次のように指定します。

; yomi
node-format-yomi = %pS%f[7]
unk-format-yomi = %M
eos-format-yomi  = \n
書式指定文字列
文字列 意味
%s 形態素種類 (0: 通常、1: 未知語、2:文頭、3:文末)
%S 入力文
%L 入力文の長さ
%m 形態素の表層文字列
%M 形態素の表層文字列。ただし空白文字も含めて出力 (%pSを参照のこと)
%h 素性の内部ID (辞書のpos-id.defファイルに定義がある)
MeCab: 品詞 ID
%% %そのもの
%c 単語生起コスト
%H 素性 (品詞、活用、読み) 等をCSVで表現したもの
%t 文字種ID
%P 周辺確率 (-l2オプションを指定したときのみ有効)
%pi 形態素に付与されるユニークなID
%pS もし形態素が空白文字列で始まる場合は、その空白文字列を表示。%pS%mと%Mは同一
%ps 開始位置
%pe 終了位置
%pC 1つ前の形態素との連接コスト
%pw %cと同じ
%pc 連接コスト+単語生起コスト (文頭から累積)
%pn 連接コスト+単語生起コスト (その形態素単独。%pw+%pC)
%pb 最適パスの場合*、それ以外は' '
%pP 周辺確率 (-l2オプションを指定したときのみ有効)
%pA blpha、forward log確率 (-l2オプションを指定したときのみ有効)
%pB beta、backward log確率 (-l2オプションを指定したときのみ有効)
%pl 形態素の表層文字列としての長さ、strlen(%m) と同一
%pL 形態素の表層文字列としての長さ。ただし空白文字列も含む。strlen(%M) と同一
%phl 左文脈ID
%phr 右文脈ID
%f[N] csvで表記された素性のN番目の要素
%f[N1,N2,N3…] N1、N2、N3番目の素性を","をデリミタとして表示
%FC[N1,N2,N3…] N1、N2、N3番目の素性をCをデリミタとして表示。ただし、要素が空の場合は以降表示が省略される。 (例) F-[0,1,2]
\0 \a \b \t \n \v \f \r \\ 通常のエスケープ文字列
\s ' ' (半角スペース) 設定ファイルに記述するときに使用

個別のデータの取得

名前 説明
struct mecab_node_t* prev pointer to the previous node.
struct mecab_node_t* next pointer to the next node.
struct mecab_node_t* bnext pointer to the node which starts at the same position.
struct mecab_node_t* enext pointer to the node which ends at the same position.
struct mecab_path_t* rpath pointer to the right path. this value is NULL if MECAB_ONE_BEST mode.
struct mecab_path_t* lpath pointer to the left path. this value is NULL if MECAB_ONE_BEST mode.
名前 説明
const char* surface surface string (表層形). this value is not 0 terminated. You can get the length with length/rlength members.
const char* feature feature string
unsigned int id unique node ID
unsigned short length length of the surface form.
unsigned short rlength length of the surface form including white space before the morph.
unsigned short rcAttr right attribute ID (右文脈ID、つまり単語を右から見たときの文脈ID)
unsigned short lcAttr left attribute ID (左文脈ID、つまり単語を左から見たときの文脈ID)
unsigned short posid unique part of speech ID (品詞ID). This value is defined in "pos.def" "pos-id.def" file. ※1
unsigned char char_type character type
unsigned char stat status of this model. This value is one of the following.
  • MECAB_NOR_NODE … 0
  • MECAB_UNK_NODE … 1
  • MECAB_BOS_NODE … 2
  • MECAB_EOS_NODE … 3
  • MECAB_EON_NODE …
unsigned char isbest set 1 if this node is best node.
float alpha forward accumulative log summation.
(This value is only available when MECAB_MARGINAL_PROB is passed.)
float beta backward accumulative log summation.
(This value is only available when MECAB_MARGINAL_PROB is passed.)
float prob marginal probability.
(This value is only available when MECAB_MARGINAL_PROB is passed.)
short wcost word cost (単語コスト).
long cost best accumulative cost from bos node to this node.
mecab_node_t構造体 - mecab.h
MeCab: mecab_node_t Struct Reference
※1 辞書でpos-id.defが定義されていないと、posidはすべて1を返します。その場合は代替としてlcAttrが使えます。たとえばUniDicでは、left-id.defにその定義があります。
複数の技術系サイトから、まとめて検索