修正履歴
2016/2/19 コードの修正・必要なファイルの更新
2016/2/19 トラブルシューティングの追加
はじめに
そもそもWindowsでなぜ?という話があると思いますが、理由は一つ。Windowsには強力なIDEであるVisual Studioがあるからです。
コード補完、スニペット、デバッグ・・・・多くのメリットがあるIDEですが、いかんせんWindowsでの環境構築には難所が多く、Python関係だとビルドの問題で詰まることが多いようです。
理由は様々ですが、Unixのコマンドが通用しなかったり、ファイルパスの書き方が違ったりといったことがあげられます。
今回は、そんなハードルを乗り越え、自然言語処理屋さん御用達、MeCabのPythonライブラリを入れてみようという話です。
MeCabって?
MeCabは、形態素解析ツール。形態素は意味の通る単語の最小ブロックといった感じの意味。たとえば「pythonで分かち書き」を「python で 分かち書き」と言った風に分解できます。しかも品詞の分析をしたり、原型になおしたりと多機能。すごい。
他にも京大のJUMANや、KAKASIなどといった形態素解析ツールがあります。
必要なもの
- 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 64ビットWindows用にMeCabをビルドする (Visual Studio 2010を利用) -iPentec の両記事を参考に進めます。感謝。。。。
- mecab-0.996.exeインストーラでMeCabインストール
- mecab-0.996.tar.gzのソースを一部変更しビルド、ビルドしたものをインストールしたMeCabの中身と入れ替える
- mecab-python-0.996.tar.gzのスクリプトをWindows用に書き換えて、ビルドとセットアップ実行
こう書けば簡単そうなのにな!
1. MeCabインストール
MeCab本体のインストール。インストーラを実行して環境変数を書くだけです。
- mecab-0.996.exeをダウンロードして実行する。辞書の文字コードは、汎用性ありそうだしutf-8にしました。ただ、utf-8はコマンドプロンプト上で文字化けするので、びっくりしないように。
- 環境変数のPATHに
C:\Mecab\bin
を追加する。 - 環境変数MECABRCを新たに作り、
C:\MeCab\etc\mecabrc
を設定する
環境変数は、インストール先によって変わるので、各自で確認をば。
2. MeCabソースの修正、ビルド
ソースファイルの修正とビルドを行います。32bit用になっているので64bit用に直します。あとはちょこちょこミスっぽいのを修正。
- mecab-0.996.tar.gzを展開
-
mecab-0.996\srcフォルダ内のいくつかのファイルを修正。インストールフォルダは自分の環境のものに。(
#
の行を削除し、!>
以降を追加してください)- Makefile.msvc.in 6行目(※更新 amd86 -> X64)
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行目
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行目
Makefile.msvc.in<! -DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \ !>-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
- Makefile.msvc.in 11行目
Makefile.msvc.in<! -DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\"" !>-DMECAB_DEFAULT_RC="\"d:\\Programs\\mecab\\etc\\mecabrc\""
- feature_index.cpp 356行目
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行目
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>
-
ビルド。mecab-0.996\srcフォルダ内で実行する。コマンドプロンプトは管理者権限で起動しておいたほうがいいみたいです。
> call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64 > nmake -f Makefile.msvc.in
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
を上書きコピー。MeCab本体のMeCab\sdkに
mecab.h
、libmecab.lib
を上書きコピー。さらに、同じファイルをmecab-python-0.996フォルダ内にもコピー。(※必要な手順を更新)
MeCabのビルドはこれでおしまい!
人によって言うことが違ってたりするので結構困る。
補足
5. は十分だけど必要最低限ではないかもしれない。後日再検証します(確認しました!上記参照。)
3. mecab for pythonのセットアップ
ようやくPython!Unixでしか動かないスクリプトがあるのでWindows用に書きかえましょう。
- mecab-python-0.996.tar.gzを展開
-
setup.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"]) ])
-
ビルドする。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 を作成中
-
インストール。各種ファイルが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を参考にします。
SET VS90COMNTOOLS=%VS140COMNTOOLS%`
などとやると上手くいくはずです。Visual Studio 2015の場合、VS14。Visual Studio 2014の場合、VS13です、紛らわしいけどお気をつけて。
2. そもそも vcvarsall.bat
ないんだけど・・・・・
Visual studio を修正インストールしましょう。
Visual Studioのインストーラーを起動します。すでにインストール済みの場合、変更
という項目があるはず。
そこで、プログラミング言語->Visual C++
とたどり、チェックを入れましょう。そして、更新を押します。
これで問題ないはずです。
テスト
全部終わったらようやくMeCabが使える!早速試してみましょう
こんにちは。私は、ベイマックス。あなたの健康を守ります。
まず上のようなテストファイルを用意しておきます。
そしてpythonで、
> 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()
こう!
すると先ほどのテストファイルが、
こんにちは 。 私 は 、 ベイ マックス 。 あなた の 健康 を 守り ます 。
じゃじゃーん!ちゃんと分かち書きされてますね!
ただ、MeCabの辞書のせいで、ベイマックスが分割されてますが。。。。。。。
( •ー• ) < 正しく形態素解析されるケアロボットが、ほんとうに必要でしょうか?
できたほうがいいよ!
ということで次回は辞書の追加をしてみましょう。
参考
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
KAKASI - 漢字→かな(ローマ字)変換プログラム
日本語形態素解析システム JUMAN
Windows 64bitで、mecab-python -Python
64ビットWindows用にMeCabをビルドする (Visual Studio 2010を利用) -iPentec
MeCab Python導入で詰まったことAdd Star -データマイニング・機械学習事始め
stack overflow -error: Unable to find vcvarsall.bat