2012年05月28日

Windows での mecab 0.993 python バインディングモジュール(32/64ビット)の作り方メモ

MeCab サイトでは、pythonバインディングのファイルを配布していますが、setup.py は Windows 環境向けには書かれていません。そこで、修正してVC++でコンパイルしたときのメモを書いておきます。以前も同じようなことを書きましたが、それはビルド環境が VC2003 でなければならない5年ほど前でした。

今回ビルドした環境は、Windows7で、32ビット版python2.7 と VC2008 がインストールされています。まず、python2.7 は http://www.python.org/ からダウンロードした通常の32bit版です。VC++はpython2.7では2008版が必要になります。

まず、Windows 向けの MeCab をインストールします。現在の最新版は0.993で、ファイル名は、mecab-0.993.exe です。下記のMeCabのダウンロードサイトからダウンロードし、インストールします。

http://code.google.com/p/mecab/downloads/list

インストール中、辞書の文字コードを聞いてきますが、文字コードは特に理由が無い限り WindowsではSHIFT-JISを選んだほうがいいでしょう。インストールが終わったら、mecab.dll があるフォルダまでPATHを通しておきます。

次に、同じダウンロードサイトから、python バインディングのソースファイルもダウンロードし展開します。最新版のファイル名は、mecab-python-0.993.tar.gz です。ダウンロードし、展開しておきます。

展開したファイルの中にあるsetup.py を次の内容に書き換えます。linux などでは、プログラム中でコマンドの実行結果を値にするのですが、Windows ではそのコマンドがないため、直接その結果を与えています。将来バージョンや配置先が変わった場合は、それに合わせて修正することになります。

#!/usr/bin/env python
from distutils.core import setup,Extension
if platform.machine() == 'AMD64':
    dir = 'C:/Program Files (x86)/MeCab/sdk'
else:
    dir = 'C:/Program Files/MeCab/sdk'
setup(name = 'mecab-python',
	version = '0.993',
	py_modules=['MeCab'],
	ext_modules = [
		Extension('_MeCab',
			['MeCab_wrap.cxx',],
			include_dirs=[dir],
			library_dirs=[dir],
			libraries=['libmecab'])])

次に、setup.pyがある場所に次の内容のバッチファイルを作って実行します。python のインストール場所などが違う場合は適宜書き換えます。

set MACHINE=x86
set PROGRAMFILESx86_PATH=%PROGRAMFILES%
if not "%PROCESSOR_ARCHITECTURE%" == "x86" set PROGRAMFILESx86_PATH=%PROGRAMFILES(x86)%
call "%PROGRAMFILESx86_PATH%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" %MACHINE%
c:\python27\python setup.py bdist_wininst
echo %PROGRAMFILESx86_PATH%

うまくいけば、distフォルダの中に、mecab-python-0.993.win32-py2.7.exe というファイルができているはずです。mecab.dll までパスが通っていないときは、このままでは実行できません。パスを通すか、python インストールフォルダの Lib\site-packages にmecab.dll をコピーします。

動作テストは、mecab-python-0.993.tar.gz 内にある test.py を使います。ただし、mecab の辞書の文字コードとtest.pyが保存されている文字コードが同じでないといけません。またSHIFT-JIS以外のときはコマンドプロンプト画面では文字化けします。

こんな結果が出ます:

0.993
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二	名詞,数,*,*,*,*,二,ニ,ニ
郎	名詞,一般,*,*,*,*,郎,ロウ,ロー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

 	BOS/EOS,*,*,*,*,*,*,*,*
太郎 	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 	助詞,係助詞,*,*,*,*,は,ハ,ワ
この 	連体詞,*,*,*,*,*,この,コノ,コノ
本 	名詞,一般,*,*,*,*,本,ホン,ホン
を 	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 	名詞,数,*,*,*,*,二,ニ,ニ
郎 	名詞,一般,*,*,*,*,郎,ロウ,ロー
を 	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 	記号,句点,*,*,*,*,。,。,。
 	BOS/EOS,*,*,*,*,*,*,*,*
EOS
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

 

これだけだと面白くないので、64ビット版も作ってみました。

64ビット版のpython2.7を入れ直します。http://www.python.org/ から。最新版は、python-2.7.3.amd64.msi です。MeCab の方は、32ビット版の設定をそのまま流用したほうが楽なので、そのままインストールされているものとします。

モジュールをビルドするには、64ビット版の libmecab.lib が必要になるので、ソースからmecabをビルドします。ソースは上記のMeCabのダウンロードサイトからダウンロードしてきます。最新版 mecab-0.993.tar.gz です。

以前指摘したように、MeCab をWindowsの64ビットアプリケーションとしてコンパイルすると、型があいまいなせいでとエラーになるので、修正します。参考にしたのは以前も紹介したこのページです。今回のバージョン 0.993 での修正箇所は下のpatchに書いてある二カ所です。

diff -ru mecab-0.993.orginal/src/feature_index.cpp mecab-0.993/src/feature_index.cpp
--- mecab-0.993.orginal/src/feature_index.cpp	2012-02-11 00:35:10 +0900
+++ mecab-0.993/src/feature_index.cpp	2012-05-27 14:52:56 +0900
@@ -308,7 +308,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;
             default:
               CHECK_DIE(false) << "unknown meta char: " <<  *p;
diff -ru mecab-0.993.orginal/src/writer.cpp mecab-0.993/src/writer.cpp
--- mecab-0.993.orginal/src/writer.cpp	2012-02-11 00:35:10 +0900
+++ mecab-0.993/src/writer.cpp	2012-05-27 14:51:41 +0900
@@ -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<>

そのあと、Makefile.msvc を MinGW か CYGWIN を使って./configure を実行して Makefile.msvc を作り、さらに X64向けにほんの少し書き換えます。 Makefile.msvc.in と修正結果の差分は以下の通りです。

--- mecab-0.993.original/src/Makefile.msvc.in	Wed Nov 02 23:40:30 2011
+++ mecab-0.993/src/Makefile.msvc	Sun May 27 03:15:57 2012
@@ -3,10 +3,10 @@
 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=@DIC_VERSION@ \
-        -DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \
+        -DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
+        -DVERSION="\"0.993\"" -DPACKAGE="\"mecab\"" \
         -DUNICODE -D_UNICODE \
         -DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
 INC = -I. -I..

修正がすんだら、make.bat の内容を次のようにして実行します。64ビットOSだと分かっているのでシンプルです。

call "%PROGRAMFILES(x86)%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" X64
nmake -f Makefile.msvc

できあがった libmecab.lib を setup.py と同じディレクトリに置き、setup.py のライブラリを指定する箇所を library_dirs=['.'] とし、上記の setup.py を実行するバッチファイルの一行目を set MACHINE=X64 と書き換えて、このバッチファイルを実行します。これでdistに mecab-python-0.993.win-amd64-py2.7.exe が作成されます。

しかし、mecab-python-0.993.win-amd64-py2.7.exe を実行し、インストールしただけでは使えません。このままだと、32ビット版の libmecab.dll をロードしようとして、「%1 は有効な Win32 アプリケーションではありません。」なんて言われてしまいます。これを回避するために 64ビット版 MeCab のビルドでできた libmecab.dll を python インストールフォルダの Lib\site-packages にコピーします。これで完了です。

うまくいくかどうかは、32ビットのときと同じように、test.py を実行して確認します。

なお今回の方法では標準の辞書は mecabrc のdicdir = 行に指定されている辞書になります。mecabrc は Makefile.mvsc で指定されている C:\Program Files (x86)\MeCab\etc もしくは C:\Program Files\MeCab\etc にあって、その記述をもとに C:\Program Files (x86)\MeCab\dic\ipadic もしくは C:\Program Files\MeCab\dic\ipadic になっています。

せっかくなので、今回作ったファイルを置いておきます。
mecab-python-0.993.win32-py2.7.exe
mecab-python-0.993.win-amd64-py2.7.exe
の二つの他、64ビット版の libmecab.dll とそのインポートライブラリなども入れておきます。

ダウンロード:mecab-python-0.993.win-build.zip
(MD5:88b64ac95c08181d84398ac9f2f9a36a)



posted by takayan at 01:00 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック