Python 3からMeCab (UTF-8モード)を使えるよう環境を整えるという話です。前回はCentOS 7でPython3とMeCabをビルドして実行させたところ「libmecab.so.2が見つからない」というエラーでMeCabモジュールのインポートに失敗したところで終わりましたが、今日やっと環境を整えることができました。
昨日の続き
モジュールのインポートに失敗する原因は、環境変数LD_LIBRARY_PATH
にlibmecab.so.2
が配置されている/usr/local/lib
が指定されていないことでした。この環境変数で共有ライブラリの検索パスを指定するのはLinuxでの決まり事のようですね。現時点ではコマンドラインから叩くことしか考えていないので、ログインユーザの.bashrcにexport LD_LIBRARY_PATH=/usr/local/lib
を追加することで解決しました。なお。この話はmake install
した際に次のようにコンソール表示されていました…ちゃんと読まないとダメですねぇ…反省。
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
さて、これでMeCabモジュールをPythonからインポートできるようになったのですが、それでも明らかに正常実行してくれませんでした。ずいぶん時間をかけて調べたところ、そもそもconfigure
時に--with-charset=utf8
のオプションを付け忘れていただけでした。ということで、MeCab本体および辞書のmake時に同オプションを指定してやり直したところ、すべて正常動作するようになりました。
まとめ
通しの手順
以下、おさらいということで全手順をまとめて掲載します。
1. 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
これで、/usr/local/bin/python3
が使用可能になります。
2. 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 --with-charset=utf8 --enable-utf8-only
$ make
$ sudo make install
これで、/usr/local/bin/mecab
や /usr/local/lib/libmecab.so
が使用可能になります。configureスクリプトに--width-charset=utf8
を与えることを忘れないよう注意してください。ただし辞書がインストールされていないと実質何も出来ないので、次のステップを必ず実行してください。
3. 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 --with-charset=utf8
$ make
$ sudo make install
これで、mecabが形態素解析を行う準備が整います。辞書をビルドする際も、configureスクリプトに--width-charset=utf8
を指定してください。
4. MeCabのPythonバインディングのモジュールを手直し
$ cd ~/mecab-0.996/swig
$ mkdir ./python # これは手動で作る必要があるらしい
$ make python # 内部でswigが呼び出してバインディング用のソースを生成
$
$ 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()に書き換える
MeCabのオフィシャルサイトでは、SWIGというツールを使って生成した各バインディング用ライブラリ(他言語からMeCabを呼び出すためのライブラリ)を公開しています。しかし、MeCabの0.996用に公開されているモノは古いswigを使って生成されたものなので、残念ながらPython 3で使えません。そこで、配布されているファイル一式の中にあるswigで自動生成したファイルを、新しいswigで再作成したものに差し替えます。なおswigはyum install swig
でインストールできるようです(私の環境には最初からswig 2.0.10が入っていました)。
5. 修正したPythonバインディングをビルド&インストール
$ cd ~/mecab-python-0.996
$ python3 setup.py build
$ sudo python3 setup.py install # CentOS標準の環境ではパスの問題が起こるので注意
$ vim ~/.bashrc # LD_LIBRARY_PATH に /usr/local/lib を追加
$ expand test.py > test.py3 # このテストプログラムはタブを使っているので空白に置換
$ 2to3 -w -x next test.py3 # nextプロパティを__next__に変換させないよう-x nextが必要
$ python3 test.py3
実行したテストで例外が飛ばず正常終了すれば、正常にインストールできているはずです。試しにPythonのinteractive interpreterで遊んでみましょう。
>>> import MeCab
>>> text = '選ばれたのは綾鷹でした。'
>>> t = MeCab.Tagger('')
>>> t.parse(text)
'選ば\t動詞,自立,*,*,五段・バ行,未然形,選ぶ,エラバ,エラバ\nれ\t動詞,接尾,*,*,一 段,連用形,れる,レ,レ\nた\t助動詞,*,*,*,特殊・タ,基本形,た,タ,タ\nの\t名詞,非自立,一般,*,*,*,の,ノ,ノ\nは\t助詞,係助詞,*,*,*,*,は,ハ,ワ\n綾\t名詞,一般,*,*,*,*,綾,アヤ,アヤ\n鷹\t名詞,一般,*,*,*,*,鷹,タカ,タカ\nでし\t助動詞,*,*,*,特殊・デス,連用形,です,デシ,デシ\nた\t助動詞,*,*,*,特殊・タ,基本形,た,タ,タ\n。\t記号,句点,*,*,*,*,。,。,。\nEOS\n'
>>>
>>> nodes = t.parseToNode(text)
>>> n = nodes
>>> while n:
... print(n.surface, n.feature, sep='\t')
... n = n.next
...
BOS/EOS,*,*,*,*,*,*,*,*
選ば 動詞,自立,*,*,五段・バ行,未然形,選ぶ,エラバ,エラバ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
の 名詞,非自立,一般,*,*,*,の,ノ,ノ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
綾 名詞,一般,*,*,*,*,綾,アヤ,アヤ
鷹 名詞,一般,*,*,*,*,鷹,タカ,タカ
でし 助動詞,*,*,*,特殊・デス,連用形,です,デシ,デシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
BOS/EOS,*,*,*,*,*,*,*,*
Great! 😀 固有名詞として「綾鷹®」は未登録なので、期待通りの結果です。これで今夜はグッスリ眠れそうです。
後記
MeCabには未解決バグがあるようなので、そちらも修正した方が良いのかもしれません。少なくともIssue 5はPython 3でも再現しました。