Linux (Cent OS 7)な環境で、Python 3からMeCabを使うプログラムを試作しようとしたところ、MeCabが標準(?)で配布しているPythonバインディングが古く2系のPythonでしか使えません。ということで少し使えるように試行錯誤した内容を備忘録的にメモします。
作業手順
Python 3をビルド&インストール
$ cd
$ wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tar.xz
$ xz -d Python-3.4.1.tar.xz
$ tar xvf Python-3.4.1.tar
$ cd Python3.4.1
$ ./configure
$ make
$ sudo make install
MeCabをビルド&インストール
$ cd
$ wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
$ tar xvfz mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure -enable-utf8-only
$ make
$ sudo make install
MeCab用の辞書をコンパイル&インストール(IPA辞書です)
$ cd
$ wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ sudo make install
MeCabのPythonバインディングのプログラムを再生成
$ cd ~/mecab-0.996/swig
$ mkdir ./python # これは手動で作る必要があるようだ
$ make python # 内部でswigが呼ばれるのでswigが無い環境では動かない
配布されているMeCabのPythonバインディングのパッケージを修正
$ cd
$ wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ tar xvfz mecab-python-0.996.tar.gz
$ cd mecab-python-0.996
$ cp ~/mecab-0.996/python/*.py . # 再生成したPythonバインディングのソースに差し替え
$ (vim等で setup.py 中の string.split(X) を X.split() に書き換える)
$ 2to3 -w test.py # 必須ではないがついでに
修正したPythonバインディングをビルド&インストール
$ cd ~/mecab-python-0.996
$ python3 setup.py build
$ sudo python3 setup.py install # CentOS標準の環境ではパスの問題が起こるので注意
$ python3 test.py
これで最後のテストが通ることを期待したのですが、困ったことに通りません。次のようなエラーが出るので、どうやらMeCabモジュールをインポートする時点でエラーになっているようでした。
Traceback (most recent call last):
File "/home/suguru/mecab-python-0.996/MeCab.py", line 16, in swig_import_helper
fp, pathname, description = imp.find_module('_MeCab', [dirname(__file__)])
File "/usr/local/lib/python3.4/imp.py", line 297, in find_module
raise ImportError(_ERR_MSG.format(name), name=name)
ImportError: No module named '_MeCab'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 4, in <module>
import MeCab
File "/home/suguru/mecab-python-0.996/MeCab.py", line 26, in <module>
_MeCab = swig_import_helper()
File "/home/suguru/mecab-python-0.996/MeCab.py", line 18, in swig_import_helper
import _MeCab
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
最終行からすると「libmecab.soが見つからない」らしいですが、/usr/local/lib/libmecab.so.2
は存在していました。うーん、ということはPythonビルド時に動的ロードオブジェクトを検索すべきパスとしてココを指定する必要があるとか、そんなところでしょうか。
さてはて…今日はここまで。