PythonからMeCab

##課題

* Python から [MeCab](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html) の形態素解析の機能を利用可能にする。

##手法

* MeCab の [Python バインディング](http://mecab.googlecode.com/svn/trunk/mecab/doc/bindings.html)をビルド／インストールする。

##前提

* 対象: [mecab-python-0.996.tar.gz](https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz)
* 環境: Windows 8.1 64bit, Python 2.7, MeCab 0.996

##内容

### 1. ビルド環境の構築
* [Visual Studio 2008 Express Edition with Service Pack 1](http://social.msdn.microsoft.com/Forums/ja-JP/15d1306c-6221-487b-b0b9-6d20877c509a/visual-studio-2008-express-edition-) をインストールする。
* [Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1](http://www.microsoft.com/en-us/download/details.aspx?id=3138) をインストールする。

### 2. libmecab.lib と libmecab.dll の作成（MeCab のビルド）
* [mecab-0.996.tar.gz](https://mecab.googlecode.com/files/mecab-0.996.tar.gz)（MeCabのソース）をダウンロードする。
* mecab-0.996\src\feature_index.cpp の 356 行目を修正する。

```:feature_index.cpp.patch
--- mecab-0.996.org/src/feature_index.cpp	Sun Nov 25 14:35:33 2012
+++ mecab-0.996/src/feature_index.cpp	Sat Mar  1 11:19:20 2014
@@ -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) {
```

* mecab-0.996\src\writer.cpp の 260 行目を修正する。

```:writer.cpp.patch
--- mecab-0.996.org/src/writer.cpp	Sun Sep 30 01:44:27 2012
+++ mecab-0.996/src/writer.cpp	Sat Mar  1 11:20:32 2014
@@ -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 *>
```

* mecab-0.996\src\Makefile.msvc.in の 6 行目を修正する。

```:Makefile.msvc.in.patch
--- mecab-0.996.org/src/Makefile.msvc.in	Sun Sep 30 01:44:27 2012
+++ mecab-0.996/src/Makefile.msvc.in	Thu Mar  6 02:36:41 2014
@@ -3,7 +3,7 @@
 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:X86_amd64 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\"" \
```

* mecab-0.996\src で以下を実行する。

```
> call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" X86_amd64
> nmake -f Makefile.msvc.in
```
* mecab-0.996\src に libmecab.lib と libmecab.dll が作成される。

### 3. インストーラの作成（Python バインディングのビルド）

* mecab-0.996\src に作成された libmecab.dll を C:\Program Files (x86)\MeCab\bin に格納する。
* mecab-0.996\src に作成された libmecab.lib を C:\Program Files (x86)\MeCab\sdk に格納する。
* mecab-python-0.996\setup.py を変更する。

```py:setup.py
#!/usr/bin/env python

from distutils.core import setup,Extension

setup(name = "mecab-python",
	version = "0.996",
	py_modules=["MeCab"],
	ext_modules = [
		Extension("_MeCab",
			["MeCab_wrap.cxx",],
			include_dirs=['C:/Program Files (x86)/MeCab/sdk'],
			library_dirs=['C:/Program Files (x86)/MeCab/sdk'],
			libraries=["libmecab"])
			])
```

* mecab-python-0.996 で以下を実行する。

```
> python setup.py bdist_wininst
```
* mecab-python-0.996\dist に mecab-python-0.996.win-amd64-py2.7.exe が作成される。

### 4. インストール（インストーラの実行）

* mecab-python-0.996\dist に作成された mecab-python-0.996.win-amd64-py2.7.exe を実行する。

### 5. 動作確認

* mecab-python-0.996 で以下を実行する。

```
> python test.py
```
* 実行結果

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

　　	BOS/EOS,*,*,*,*,*,*,*,*
太郎 	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は　	助詞,係助詞,*,*,*,*,は,ハ,ワ
この 	連体詞,*,*,*,*,*,この,コノ,コノ
本　	名詞,一般,*,*,*,*,本,ホン,ホン
を　	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二　	名詞,数,*,*,*,*,二,ニ,ニ
郎　	名詞,一般,*,*,*,*,郎,ロウ,ロー
を　	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見　	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た　	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に　	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た　	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。　	記号,句点,*,*,*,*,。,。,。
　　	BOS/EOS,*,*,*,*,*,*,*,*
EOS
EOS
filename: C:\Program Files (x86)\MeCab\etc\..\dic\ipadic\sys.dic
charset: UTF-8
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102
```

## 参考

* [Windows での mecab 0.993 python バインディングモジュール（32/64ビット）の作り方メモ](http://neu101.seesaa.net/article/272153413.html)
* [Windowsにmecab-pythonを導入](http://seesaawiki.jp/spz/d/Windows%A4%CBmecab-python%A4%F2%C6%B3%C6%FE)