ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

WindowsのPythonでMecabを実行する(+Cygwinでも実行する)

環境

Windows10 (64bit)
Microsoft Visual Studio 2015
python3.5(Windows版)
mecab-0.996.exe
mecab-0.996.tar.gz
mecab-python-0.996.tar.gz
cygwin

Visual Studio Community2015
のインストール時
VisualC++ - VisualC++2015用の共通ツール もインストールする事

注意点

以下の手順実行後はコマンドプロンプトからのmecab実行が行えなくなった。
恐らくだが、元々Windows用のMeCabは32ビット用となっており、本作業では32ビットから64ビット用に編集しているコードの関係でコマンドプロンプトからの動作が出来なくなったのではと考える。

各種パス

C:\Program Files (x86)\Microsoft Visual Studio 14.0
C:\MeCab
C:\Python3.5
C:\cygwin

手順

※以下、コマンド「sublime」はcygwinの関数でSublimeText2を起動してる。

mecab-0.996.exe
をクリックしてインストール実行。
辞書の文字コードUTF-8
インストール先は任意、今回は
C:\MeCab

環境変数PATHに
C:\MeCab\bin
を追加
MECABRCに
C:\MeCab\etc\mecabrc
を追加する。

http://taku910.github.io/mecab/#download
のSourceから
mecab-0.996.tar.gzをダウンロードして解凍
cygwinで作業

$ cd /tmp/
$ cp -p /shortcut/desktop/mecab-0.996.tar.gz ./
$ tar zxf mecab-0.996.tar.gz   

MeCabソースを32bit用から64bit用に変更

$ sublime mecab-0.996/src/Makefile.msvc.in
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
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=@DIC_VERSION@ \
 ↓変更↓
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"@VERSION@\"" -DPACKAGE="\"mecab\"" \
 ↓変更↓
-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
-DMECAB_DEFAULT_RC="\"c:\\Program Files\\mecab\\etc\\mecabrc\""
 ↓変更↓
-DMECAB_DEFAULT_RC="\"C:\\MeCab\\etc\\mecabrc:\""
feature_index.cpp
$ sublime mecab-0.996/src/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
$ sublime mecab-0.996/src/writer.cpp
case 'L': *os << lattice->size(); break;
 ↓変更↓
case 'L': *os << (unsigned int)lattice->size(); break;
mecab.h
$ sublime mecab-0.996/src/mecab.h
#ifndef SIWG
 ↓変更↓
#ifndef SWIG
common.h
$ sublime mecab-0.996/src/common.h
#include <sstream>
#include <iterator>
 ↓追記↓
#include <iterator>

コマンドプロンプトは管理者権限で起動。
mecab-0.996\src内でビルド実行

cd C:\cygwin\tmp\mecab-0.996\src

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64

nmake -f Makefile.msvc.in

cygwinに戻る
ビルドで生成されたファイルを移動

$ cp mecab-0.996/src/libmecab.dll /cygdrive/c/MeCab/bin/ 
$ cp mecab-0.996/src/mecab-cost-train.exe /cygdrive/c/MeCab/bin/
$ cp mecab-0.996/src/mecab-dict-gen.exe /cygdrive/c/MeCab/bin/
$ cp mecab-0.996/src/mecab-dict-index.exe /cygdrive/c/MeCab/bin/
$ cp mecab-0.996/src/mecab-system-eval.exe /cygdrive/c/MeCab/bin/
$ cp mecab-0.996/src/mecab-test-gen.exe /cygdrive/c/MeCab/bin/
$ cp mecab-0.996/src/mecab.h /cygdrive/c/MeCab/sdk/ 
$ cp mecab-0.996/src/libmecab.lib /cygdrive/c/MeCab/sdk/

mecab-python-0.996.tar.gzをダウンロード

$ wget https://pypi.python.org/packages/86/e7/bfeba61fb1c5d1ddcd92bc9b9502f99f80bf71a03429a2b31218fc2d4da2/mecab-python-0.996.tar.gz#md5=33b7cf7bffa8706212b40567f2b4a87a

$ tar xzf mecab-python-0.996.tar.gz 

setup.pyを編集

$ sublime mecab-python-0.996/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"])
])

コマンドプロンプトで移動

cd C:\cygwin\tmp\mecab-python-0.996

インストール実行

python setup.py install

 ~~~
コード生成しています。
コード生成が終了しました。
running install_lib
copying build\lib.win-amd64-3.5\_MeCab.cp35-win_amd64.pyd -> C:\Python3.5\Lib\site-packages
running install_egg_info
Removing C:\Python3.5\Lib\site-packages\mecab_python-0.996-py3.5.egg-info
Writing C:\Python3.5\Lib\site-packages\mecab_python-0.996-py3.5.egg-info

cygwinで実行
テスト用にファイル作成
UTF-8で保存する事

$ sublime /cygdrive/c/cygwin/tmp/mecab-python-0.996/test.txt

内容

windows10でpythonからmecab実行をテストしてみる。

コマンドプロンプトでテストしてみる
※python2の場合はファイル読み過去文字列に対してUTF-8でデコードエンコード掛ける必要があるらしい。

python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

import MeCab
import sys
import codecs
m = MeCab.Tagger("-Owakati")
f = open('test.txt','r', encoding='utf-8')
text = f.read()
f.close()
f = open('out.txt','w', encoding='utf-8')
f.write(m.parse(text))
f.close()

実行後のファイル確認
以下のように分かち書きされてる。

windows 10 で python から mecab 実行 を テスト し て みる 。 


続いてcywinから実行できるようにする。

$ sublime ~/.bash_profile

Python for WindowsのPATH追記

export PATH="${PATH}:/cygdrive/c/Python3.5"
export PATH="${PATH}:/cygdrive/c/Python3.5/Scripts"

MECABRCも追記
※MECABRCはMECABの設定ファイル、辞書のパスとかも記述されてる

export MECABRC="/cygdrive/c/MeCab/etc/mecabrc"

反映

$ source ~/.bash_profile 

処理対象テキストファイルtest.txtを同ディレクトリに生成

cygwinからpythonmecab実行試してみる。
pythonインタプリタで起動

$ /cygdrive/c/Python3.5/python.exe -i

エラー発生した・・

>>> import MeCab
>>> import sys
>>> import codecs
>>> m = MeCab.Tagger("-Owakati")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python3.5\lib\site-packages\MeCab.py", line 307, in __init__
    this = _MeCab.new_Tagger(*args)
RuntimeError

http://www.nal.ie.u-ryukyu.ac.jp/note/note_detail/2994/
を参考にした所、ipadicが無いってことらしい。

色々試した結果以下の方法で解決した

まず、cygwinでのMECABRCはWindowsパス表記に変更
※.bash_profileで設定後に反映。

export MECABRC="c:/MeCab/etc/mecabrc"

続いてmecabrcを編集し、Windowsパス表記の絶対パスに変更。

$ sublime /cygdrive/c/MeCab/etc/mecabrc

編集前

dicdir =  $(rcpath)\..\dic\ipadic

編集後

dicdir =  c:/MeCab/dic/ipadic

どうやら、cygwinからmecab実行する場合はパスの解釈が正常に行われるようにWindowsパス表記で記載する必要あるらしい。

再度実行してみる

$ /cygdrive/c/Python3.5/python.exe -i

エラー発生せず実行できた!

import MeCab
import sys
import codecs
m = MeCab.Tagger("-Owakati")
f = open('test.txt','r', encoding='utf-8')
text = f.read()
f.close()
f = open('out2.txt','w', encoding='utf-8')
f.write(m.parse(text))
f.close()

スクリプトに記述して実行可能な事も確認

$ /cygdrive/c/Python3.5/python.exe  mecab_test.py

Python実行パスが長いのでcygwinのaliasに設定

編集

$ sublime ~/.bashrc

追記

alias python-windows='/cygdrive/c/Python3.5/python.exe'

反映

$ source ~/.bashrc

こんな感じで実行

$ python-windows mecab_test.py 

注意点あるみたいなので、下記参考。
http://proger.blog10.fc2.com/blog-entry-123.html

おわりに

めちゃめちゃハマった、合計丸2日位。
WindowsPython開発に向いてないって改めて思った。

MeCabWindowsにおいてはVS(VSはPython 2.xだとVS2008、Python 3.xだとVS2010~)を使ってコンパイルするようにソースコードが作られている為VSのインストールが必要というのと、公式のWindowsMecabが32ビット版しか無い為色々とソースの修正が必要となる所がハマリポイントというか面倒なポイント。

VSインストールやソース改修が不要な「形態素解析エンジン MeCab 0.98pre3 野良ビルド」というものを使えば楽にインストール出来るようだけどPython2系用みたいなので残念。


続いて、デバッグ可能なIDE(pycharm)等でも実行可能か確認する。

※2016年10月9日追記
PyDevでデバッグ可能でした

toriaezu-engineer.hatenablog.com