BREAKING NEWS

2017/08/15

MeCabをWindows 10 (64-bit)上のPythonで使う

この記事のまとめ:
  • 64-bit版Windows環境上でMeCab用Pythonモジュールをインポートするまでの手順をまとめます。
背景:

日本語解析を少しやってみようと思って、形態素解析ツールのMeCabをWindows (64-bit)上のPythonで使ってみようと思ったのですが、これがなかなかの曲者でした。Windows 64-bit環境でPythonからMeCabを使うのはとてもめんどくさいです。とりあえずMeCab用Pythonモジュールをインストールして、それをインポートするところまではできたので、私のケースの対処法を書いておきます。

MeCabをPythonで使えるようにするための流れ
  • MeCab本体(32-bit)をインストールする
  • MeCab本体を64-bitでコンパイルし直し、関連ファイルを64-bit版に更新する
  • MeCabのPythonモジュールをビルドし、インストールする
  • MeCabの動作確認
実行環境
  • Windows 8.1 64-bit
  • Python 3.4 (64-bit版Anacondaの仮想環境上)
MeCabのインストール

まずはMeCab本体(32-bit)をインストールします。

下記のURLを開き、"Binary package for MS-Windows"にある"mecab-0.996.exx"をダウンロードし、インストールします。 インストール時に文字フォーマットを聞かれますので、UTF-8を選択します。

http://taku910.github.io/mecab/#download

MeCab本体の64-bit化

ここからが少し手間がかかります。

先ほどインストールしたMeCabは32-bit版なので64-bitアプリケーション化します。

Visual Studio 2015のインストール

64-bitアプリケーションにするために、64-bitコンパイラでコンパイルを行います。MeCabはC++で記述されているようなので64-bit版VC++コンパイラを使います。そのVC++コンパイラをインストールするために、Visual Studioをインストールします。

Visual Studio 2017ではうまくMeCabをインストールできませんでしたので、バージョンはVisual Studio 2015にした方が良いです。

Visual Studio 2015は下記URLからダウンロードできます。 https://www.visualstudio.com/vs/older-downloads/

インストール時にVC++のパッケージ類にチェックを入れて、VC++のパッケージ類をインストールします。

Makefile.msvcの作成と修正

再度、下記のMeCabのダウンロードページを開き、"Source"にある"mecab-0.996.tar.gz"をダウンロードし、解凍します。 http://taku910.github.io/mecab/#download

解凍したフォルダーの中にsrcというフォルダーがあります。この中のMakefile.msvc.inをコピーして、Makefile.msvcに名前を変更します。 さらにこのファイルを開き、下記の通りに変更します。

▼ 6行目

LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB

/MACHINE:X86/MACHINE:X64に変更します。

▼ 8-9行目

-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \

-DDIC_VERSION-DVERSIONを使用するバージョンに変更します。

feature_index.cppの修正

次にfeature_index.cppを開き、下記の通りに変更します。

▼ 356行目

case 't':  os_ << (unsigned int)path->rnode->char_type;     break;

size_t型からunsinged int型に変更します。

writer.cppの修正

最後にwriter.cppを開き、下記の通りに変更します。

▼ 260行目

case 'L': *os << (unsigned int)lattice->size(); break;

変数latticeunsigned int型にキャストします。

MeCabを64-bitでコンパイル

Visual Studio 2015をインストールすると、スタートメニューに"VS2015 x64 Native Tools Command Prompt"がインストールされているはずですので、これを実行します。

先ほどのsrcフォルダーまで移動し、Make.batを実行します。

いくつかWarningが出るかもしれませんが、エラー終了しなければ問題ないです。

MeCab本体の関連ファイルの更新

先ほどコンパイルによって生成したいくつかのファイルをMeCab本体にコピーして上書きします。

srcフォルダー内にあるすべての.exeファイルlibmecab.dllC:\Program Files (x86)\MeCab\binにコピーして上書きします。 ※MeCabのインストール時にインストールフォルダーを変更された場合は変更先のフォルダーを対象となります。

また、srcフォルダー内にあるすべての.libファイルC:\Program Files (x86)\MeCab\sdkにコピーして上書きします。

そして、C:\Program Files (x86)\MeCab\binを環境変数のPATHに追加します。 環境変数が有効化されるのはPCの再起動後なのでPCを再起動します。

MeCab本体の64-bit化はこれで終了です。

Python用MeCabモジュールのインストール

3度目になりますが、下記のMeCabのダウンロードページを開き、"perl/ruby/python/java バインディング"の"ダウンロード"を開き、"mecab-python-0.996.tar.gz"をダウンロードし、解凍します。

http://taku910.github.io/mecab/#download

setup.pyの修正

解凍したフォルダーの中にあるsetup.pyを開き、下記の通りに変更します。

▼ 13行目

version = "0.996",

versionを実際の数値を直接代入します。

▼ 18~20行目

include_dirs=[r"C:\Program Files (x86)\MeCab\sdk"],
library_dirs=[r"C:\Program Files (x86)\MeCab\sdk"],
libraries=["libmecab"])

include_dirslibrary_dirsをsdkフォルダーの値に直接代入します。また、librariesにこちらも直接ファイル名を代入します。

これらはすべてWindowsではmecab-configというものが入っていないための対処です。

mecab.hに追記

C:\Program Files (x86)\MeCab\sdk\mecab.hを下記の通りに1行追記をします。

▼ 775行目辺り

/**
 * Lattice class
 */
class MECAB_DLL_CLASS_EXTERN Lattice {
public:
 
  virtual void set_result(const char *str) = 0; //この1行を追加
 
  /**
   * Clear all internal lattice data.
   */
  virtual void clear()              = 0;
Python用MeCabモジュールのビルドとインストール

コマンドプロンプトなどを開き、Anacondaでの仮想環境をアクティベートします。 ※Anacondaを使用していなければこの作業は無視して次に進んでください。

先ほど編集したsetup.pyがあるフォルダーに移動します。

python setup.py buildとその後にpython setup.py installを実行します。その実行例は下記のようになります。

(<virEnv>) $ python setup.py build
running build
running build_py
running build_ext
 
(<virEnv>) $ python setup.py install
running install
running build
running build_py
running build_ext
running install_lib
copying build\lib.win-amd64-3.4\MeCab.py -> C:\Users\<userName>\AppData\Local\conda\conda\envs\<virEnv>\Lib\site-packages
copying build\lib.win-amd64-3.4\_MeCab.pyd -> C:\Users\<userName>\AppData\Local\conda\conda\envs\<virEnv>\Lib\site-packages
byte-compiling C:\Users\<userName>\AppData\Local\conda\conda\envs\<virEnv>\Lib\site-packages\MeCab.py to MeCab.cpython-34.pyc
running install_egg_info
Writing C:\Users\<userName>\AppData\Local\conda\conda\envs\<virEnv>\Lib\site-packages\mecab_python-0.996-py3.4.egg-info
インストール確認

MeCab用Pythonモジュールが問題なくインストールできていれば、下記のPython構文が通るはずです。

$ python
>>> import MeCab

これが通ればインストールは完了です。

ビルド失敗時のトラブルシューティング

いままでVisual Studio 2015以外にインストールしたことがなければおそらく問題なく、ビルドが通るはずですが、他のバージョンなどを以前入れていたりすると余計な環境変数が残っており、失敗する可能性があります(私がVisual Studio 2017ではじめに試したためそうなっていました)。

私の場合は、vcvarsall.batファイルが見つからないというエラーが発生しました。

この原因は、Anacondaの仮想環境の設定ファイルが入っているフォルダ内のLib/distutils/msvc9compiler.pyのファイルもしくは環境変数を追加すれば解決しました。 私の場合は下記のディレクトリーに保存されていました。

C:\Users\<userName>\AppData\Local\conda\conda\envs\<virEnv>\Lib\distutils\msvc9compiler.py

msvc9compiler.pyファイルの231行目辺りにある下記の構文で問題が起こっていました。

toolskey = "VS%0.f0COMNTOOLS" % version

上記は環境変数であるVS140COMNTOOLS(Visual Studio 2015の場合)を読むためにversionという変数には140という値が入っていなければならないのですが、私の場合Visual Studio 2017の値である100という値が入ってしまっており、このversionという変数が正しい値が入らないことが原因となっていました。なお、VS140COMNTOOLSには、Visual C++のインストールフォルダー(デフォルト設定の場合:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC)を示す値が入っており、その配下にvcvarsall.batファイルがあります。そのため、VS100COMNTOOLSという誤った環境変数を読み込んでしまい、正しくvcvarsall.batにたどり着けないということが起こっていました。

このversionという変数がどこでどのように読み込まれているかまでは追っていないので真因まではわかっていないのですが、下記のいずれかの方法で暫定対処が可能です。

  1. 環境変数VS100COMNTOOLSを作り、VS140COMNTOOLSと同じ値を代入する
  2. msvc9compiler.pyの当該構文を下記のように直接VS140COMNTOOLSとする。
toolskey = "VS%140COMNTOOLS"

なお、Visual Studio 2017ではVisual Studio 2015以前とフォルダー構成が大きく変わっているようで正しくファイルを読み込めないエラーが発生していたため、うまくいかないということがわかっています。

MeCabの動作確認

インストール確認に続いて、動作確認をします。

下記を実行して、下記の通りの結果を得られていれば正しく動いています。

$ python
>>> import MeCab
>>> m = MeCab.Tagger()
>>> m.parse("すもももももももものうち")
'すもも\t名詞,一般,*,*,*,*,すもも,スモモ,スモモ\nも\t助詞,係助詞,*,*,*,*,も,モ, モ\nもも\t名詞,一般,*,*,*,*,もも,モモ,モモ\nも\t助詞,係助詞,*,*,*,*,も,モ,モ\nもも\t名詞,一般,*,*,*,*,もも,モモ,モモ\nの\t助詞,連体化,*,*,*,*,の,ノ,ノ\nうち\t名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ\nEOS\n'
MeCab実行時のトラブルシューティング

ただし、環境によっては下記のようなエラーが出る場合があります。 (何の差分によってこのエラーが出たり、出なかったりするのかまでは調べていません。)

$ python
>>> import MeCab
>>> m = MeCab.Tagger()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\<UserName>\AppData\Local\conda\conda\envs\<VirEnv>\lib\site-packages\MeCab.py", line 307, in __init__
    this = _MeCab.new_Tagger(*args)
RuntimeError

この場合には、新しくMECABRCという環境変数を追加します。値は、C:\Program Files (x86)\MeCab\etc\mecabrcとします。

環境変数を有効化させるためにPCを再起動します。

これで正しく動作しているはずです。


参考

この記事を書くために下記のサイトを参考にさせていただきました。




今回は以上です。 最後まで読んでいただき、ありがとうございます。


ブログランキング・にほんブログ村へ  ← 気に入っていただければ応援ポチをお願いします!

Share this:

 
Copyright © 2014 hassiweb. Designed by OddThemes