64bit Windows + python 2.7 + MeCab 0.996　な環境をつくる


## 修正履歴
2016/2/19 コードの修正・必要なファイルの更新
2016/2/19 トラブルシューティングの追加

## はじめに
そもそもWindowsでなぜ？という話があると思いますが、理由は一つ。Windowsには強力なIDEであるVisual Studioがあるからです。

コード補完、スニペット、デバッグ・・・・多くのメリットがあるIDEですが、いかんせんWindowsでの環境構築には難所が多く、Python関係だとビルドの問題で詰まることが多いようです。
理由は様々ですが、Unixのコマンドが通用しなかったり、ファイルパスの書き方が違ったりといったことがあげられます。


今回は、そんなハードルを乗り越え、自然言語処理屋さん御用達、MeCabのPythonライブラリを入れてみようという話です。

__MeCabって？__
[MeCab][*0]は、形態素解析ツール。形態素は意味の通る単語の最小ブロックといった感じの意味。たとえば「pythonで分かち書き」を「python　で　分かち書き」と言った風に分解できます。しかも品詞の分析をしたり、原型になおしたりと多機能。すごい。
他にも京大の[JUMAN][*1]や、[KAKASI][*2]などといった形態素解析ツールがあります。

## 必要なもの
* python 2.7.9
* Microsoft Visual Studio 2015(Verは何でもよい)
* mecab-0.996.exe
* mecab-0.996.tar.gz
* mecab-python-0.996.tar.gz

## やること
基本的には、[Windows 64bitで、mecab-python -Python][*3] [64ビットWindows用にMeCabをビルドする (Visual Studio 2010を利用) -iPentec][*4] の両記事を参考に進めます。感謝。。。。

1. mecab-0.996.exeインストーラでMeCabインストール
2. mecab-0.996.tar.gzのソースを一部変更しビルド、ビルドしたものをインストールしたMeCabの中身と入れ替える
3. mecab-python-0.996.tar.gzのスクリプトをWindows用に書き換えて、ビルドとセットアップ実行

こう書けば簡単そうなのにな！

## 1. MeCabインストール
MeCab本体のインストール。インストーラを実行して環境変数を書くだけです。

1. [mecab-0.996.exe](http://taku910.github.io/mecab/#download)をダウンロードして実行する。辞書の文字コードは、汎用性ありそうだしutf-8にしました。ただ、utf-8はコマンドプロンプト上で文字化けするので、びっくりしないように。
2. 環境変数のPATHに`C:\Mecab\bin`を追加する。
3. 環境変数MECABRCを新たに作り、`C:\MeCab\etc\mecabrc`を設定する

環境変数は、インストール先によって変わるので、各自で確認をば。

## 2. MeCabソースの修正、ビルド
ソースファイルの修正とビルドを行います。32bit用になっているので64bit用に直します。あとはちょこちょこミスっぽいのを修正。

1. [mecab-0.996.tar.gz](http://taku910.github.io/mecab/#download)を展開
2. mecab-0.996\srcフォルダ内のいくつかのファイルを修正。インストールフォルダは自分の環境のものに。（ `#` の行を削除し、`!>`以降を追加してください）
	* Makefile.msvc.in 6行目(※更新 amd86 -> X64)

	```text:Makefile.msvc.in
<! 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
	```
   * Makefile.msvc.in 8行目
   
	```text:Makefile.msvc.in
<! -DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=@DIC_VERSION@ \
 !>-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \ 
	```
   * Makefile.msvc.in 9行目
   
	```text:Makefile.msvc.in
 <! -DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \
  !>-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
	```
   	* Makefile.msvc.in 11行目
   
	```text:Makefile.msvc.in
<! -DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
 !>-DMECAB_DEFAULT_RC="\"d:\\Programs\\mecab\\etc\\mecabrc\""
	```
   * feature_index.cpp 356行目
   
	```cpp:feature_index.cpp
<! case 't':  os_ << (size_t)path->rnode->char_type;     break;
 !>case 't':  os_ << (unsigned int)path->rnode->char_type;     break;
	```
   * writer.cpp 260行目
   
	```cpp:writer.cpp
<! case 'L': *os << lattice->size(); break;
 !>case 'L': *os << (unsigned int)lattice->size(); break;
	```
   * mecab.h 1125行目
	   
	```
<! #ifndef SIWG
 !>#ifndef SWIG
	```
   * common.h include部分に追記
   
	```
 !>#include <iterator>
	```

3. ビルド。mecab-0.996\srcフォルダ内で実行する。コマンドプロンプトは管理者権限で起動しておいたほうがいいみたいです。

	```
> call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64
> nmake -f Makefile.msvc.in
	```

4. Mecab本体のMeCab\bin内に`libmecab.dll`、`mecab-cost-train.exe`、`mecab-dict-gen.exe`、`mecab-dict-index.exe`、`mecab-system-eval.exe`、`mecab-test-gen.exe`を上書きコピー。
5. MeCab本体のMeCab\sdkに`mecab.h`、`libmecab.lib`を上書きコピー。さらに、同じファイルをmecab-python-0.996フォルダ内にもコピー。（※必要な手順を更新）

MeCabのビルドはこれでおしまい！
人によって言うことが違ってたりするので結構困る。

__補足__
　~~5. は十分だけど必要最低限ではないかもしれない。後日再検証します~~(確認しました！上記参照。)

## 3. mecab for pythonのセットアップ
ようやくPython！Unixでしか動かないスクリプトがあるのでWindows用に書きかえましょう。

1. [mecab-python-0.996.tar.gz](http://taku910.github.io/mecab/#download)を展開
2. setup.py を以下のように書き換える。インストール先は適宜変更してくださいね

	```py:setup.py
#!/usr/bin/env python
from distutils.core import setup,Extension,os
setup(name = "mecab-python",
version = "0.996",
py_modules=["MeCab"],
ext_modules = [
  Extension("_MeCab",
   ["MeCab_wrap.cxx",],
   include_dirs=[r"C:\MeCab\sdk"],
   library_dirs=[r"C:\MeCab\sdk"],
   libraries=["libmecab"])
   ])
	```

3. ビルドする。buildフォルダができる

	```
> python setup.py build
running build
running build_py
running build_ext
building '_MeCab' extension
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\amd64\cl.exe /c /nolo
go /Ox /MD /W3 /GS- /DNDEBUG -ID:\Programs\MeCab\sdk -IC:\Develop\python27\inclu
de -IC:\Develop\python27\PC /TpMeCab_wrap.cxx /Fobuild\temp.win-amd64-2.7\Releas
e\MeCab_wrap.obj
MeCab_wrap.cxx
MeCab_wrap.cxx(3747) : warning C4530: C++ 例外処理を使っていますが、アンワインド
セマンティクスは有効にはなりません。/EHsc を指定してください。
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\amd64\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:D:\Programs\MeCab\sdk /LIBPATH:C:\Develop\python27\libs /LIBPATH:C:\Develop\python27\PCbuild\amd64 libmecab.lib /EXPORT:init_MeCab build\temp.win-amd64-2.7\Release\MeCab_wrap.obj /OUT:build\lib.win-amd64-2.7\_MeCab.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_MeCab.lib/MANIFESTFILE:build\temp.win-amd64-2.7\Release\_MeCab.pyd.manifest
MeCab_wrap.obj : warning LNK4197: エクスポート 'init_MeCab' が複数回指定されています。一番最初の指定を適用します。
   ライブラリ build\temp.win-amd64-2.7\Release\_MeCab.lib とオブジェクト build\t
emp.win-amd64-2.7\Release\_MeCab.exp を作成中
	```

4. インストール。各種ファイルがpythonインストール先のLib\site-packagesにコピーされる

	```
> python setup.py install
running install
running build
running build_py
running build_ext
running install_lib
copying build\lib.win-amd64-2.7\MeCab.py -> C:\Develop\python27\Lib\site-packages
copying build\lib.win-amd64-2.7\_MeCab.pyd -> C:\Develop\python27\Lib\site-packages
byte-compiling C:\Develop\python27\Lib\site-packages\MeCab.py to MeCab.pyc
running install_egg_info
Writing C:\Develop\python27\Lib\site-packages\mecab_python-0.996-py2.7.egg-info
	```

pythonのセットアップもこれで終了！
前の手順でもそうでしたが、Unixのターミナルとコマンドプロンプトの仕様の違いで、バージョンとかインストール先などは直接指定する必要があります。

## トラブルシューティング
__1.  `python setup.py build`で、`error: Unable to find vcvarsall.bat`ってなる__
Visual Studioのファイルを読み込めてないみたい。[stack overflow][*5]を参考にします。

```
SET VS90COMNTOOLS=%VS140COMNTOOLS%`
```

などとやると上手くいくはずです。Visual Studio 2015の場合、VS14。Visual Studio 2014の場合、VS13です、紛らわしいけどお気をつけて。

__2.  そもそも `vcvarsall.bat` ないんだけど・・・・・__
Visual studio を修正インストールしましょう。
Visual Studioのインストーラーを起動します。すでにインストール済みの場合、`変更` という項目があるはず。
そこで、`プログラミング言語->Visual C++` とたどり、チェックを入れましょう。そして、更新を押します。

![2016-02-19.png](https://qiita-image-store.s3.amazonaws.com/0/25149/76f548c7-8571-7ff4-fa37-de0f859db040.png)

これで問題ないはずです。


## テスト
全部終わったらようやくMeCabが使える！早速試してみましょう

```text:test.txt
こんにちは。私は、ベイマックス。あなたの健康を守ります。
```
まず上のようなテストファイルを用意しておきます。
そしてpythonで、

```py
> python
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> import sys
>>> m = MeCab.Tagger("-Owakati")
>>> f = open('test.txt','r')
>>> text = f.read().decode('utf-8')
>>> f.close()
>>> f = open('test.txt','w')
>>> f.write(m.parse(text.encode('utf-8')))
>>> f.close()
```

こう！

すると先ほどのテストファイルが、

```text
こんにちは 。 私 は 、 ベイ マックス 。 あなた の 健康 を 守り ます 。 
```

じゃじゃーん！ちゃんと分かち書きされてますね！
ただ、MeCabの辞書のせいで、ベイマックスが分割されてますが。。。。。。。

__( •ー• ) < 正しく形態素解析されるケアロボットが、ほんとうに必要でしょうか？__

できたほうがいいよ！
ということで次回は辞書の追加をしてみましょう。

## 参考
[MeCab: Yet Another Part-of-Speech and Morphological Analyzer][*0]
[KAKASI - 漢字→かな(ローマ字)変換プログラム][*1]
[日本語形態素解析システム JUMAN][*2]
[Windows 64bitで、mecab-python -Python][*3] 
[64ビットWindows用にMeCabをビルドする (Visual Studio 2010を利用) -iPentec][*4] 
[MeCab Python導入で詰まったことAdd Star -データマイニング・機械学習事始め](http://d.hatena.ne.jp/mahan/20120618/1340040589)
[stack overflow -error: Unable to find vcvarsall.bat][*5]

<!--文献リスト-->

[*0]:http://taku910.github.io/mecab/

[*1]:http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN

[*2]:http://kakasi.namazu.org

[*3]:http://pop365.cocolog-nifty.com/blog/2015/03/windows-64bit-m.html

[*4]:http://www.ipentec.com/document/document.aspx?page=mecab-compile-for-x64-windows-use-x64-windows

[*5]:http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat