形態素分析エンジンMeCabをMatlab (64bit)で使う
形態素分析エンジンMeCabをMatlabから使ってテキストをササッと解析できるようにしたい!、ということでやってみました。ちょっと手間だったので書き残しておきます。
下のページにまさにこれを実現するためのツールがあるのですが、「現在配布されている MeCab の dll は 32bit version であるため、64bit 版のMATLABと一緒に使うためには、dll のビルドが必要となります」という不穏な忠告が。自分の場合は64 bit版Matlabなので、まさにこれにあたります…。
Simple Text Miner for Japanese - File Exchange - MATLAB Central
仕方がないので、dllをビルドするという自分には難易度の高い旅に出ました。
上のブログ記事の中盤以降にある "What about Japanese Text?" という項目を探して、そのとおりにおこないます。
- Matlab 64 bit版を持っている
- Matlab に適合した (たぶんC++) コンパイラを持っている → 自分の場合は、無料のVisual studio 2013 Communityがインストールしてあったので、これを使いました。
- Takuya's instructionに従いなさい
という3ステップで、あら簡単、と思いきやTakuya's instructionがヘビーでした。以下、インストラクションのPDFを見つつ読んでください。
- MeCab 0.966のバイナリパッケージをインストール → インストール時に、文字のエンコーディングを聞いてきますが、デフォルトのSHIFT-JISで自分はうまくいきました。
- MeCab 0.966のソースファイルをダウンロード&解凍 → Windows環境では.tar.gzファイルを解凍するにはソフトウェアが必要です。自分はLhaplusを使いました。
- 解凍されたなかの"src"というフォルダを見つけます。
- このフォルダのなかにあるいろんなファイルの内容を、インストラクションの通りに修正します。
- Visual studioのコマンドプロンプト (いろいろあるが、自分はVS2013 x64 Native Tools Command Promptでうまくいきました) を起動します。
- フォルダをさきほどの"src"にもっていきます。フォルダを変更するコマンドはcd。
- "Make"とタイプ。
- すると、ずらずらっとビルドが始まり、"libmecab.dll"が生成されます。
- このdllファイルと、"mecab.h"ファイルを、Matlabのスクリプトを置くフォルダにコピー。これで、MatlabでMecabを使う準備完了です。ふぅ。
では、Matlabを起動してサンプルコードをコピペしてみます。まずは下のコードでDLLを読み込み。僕の環境では"警告: データ型 'mecab_node_tPtr' (構造体 mecab_node_t で使用) は存在しません…"というエラーが出ましたが、これは無視して良いらしい。
%% Loading DLL fname_lib = 'libmecab.dll'; fname_header = 'mecab.h'; [notfound, warnings] = loadlibrary(fname_lib, fname_header);
下のコードで「ライブラリlibmecabdeの関数」がたくさん表示されればDLLを読み込めているということのようです。
%% (optional) view available functions of the DLL libfunctionsview('libmecab')
あと、下のように2,3行おまじないを書いてから、
%% Calling MeCab morphological analyzer argv = libpointer('stringPtrPtr', {'MeCab'}); argc = 1; mecab = calllib('libmecab', 'mecab_new', argc, argv);
日本語のテキストを与えると形態素分析の結果が返ってきます。すばらしい。
%% test MeCab functionality input = '太郎は次郎が持っている本を花子に渡した。'; result = calllib('libmecab', 'mecab_sparse_tostr', mecab,input);
result =
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
次郎 名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
持っ 動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
花 名詞,一般,*,*,*,*,花,ハナ,ハナ
子 名詞,接尾,一般,*,*,*,子,コ,コ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
最後にDLLを開放します。
%% Release DLL from the memory clear unloadlibrary('libmecab')