MeCabは各種スクリプト言語(perl、ruby、python、Java)から、各言語バイディングで利用できるようになっている。
しかし、Pythonで用意されているのはPython2系のもので、残念ながらPython3系では使えない。

そこで、ここでは用意されているPython2系バイディングをPython3系に変換して使用する方法をお伝えする。

MeCabのインストール

まずは、MeCabをインストールするため、次のコマンドを実行する。
辞書はIPA(utf-8)を選択した。


sudo apt-get install mecab mecab-ipadic-utf8

インストールが完了したら、MeCabのバージョンを確認しておく。


mecab -v

mecab of 0.996

swigとlibmecab-devのインストール

MeCabが用意している各言語バイディングはSWINGというプログラムで自動的に生成されているようだ。
そこで、新たにPython3系のバイディングを作成するためにswigをインストールする。
また、Python3系のバイディングを作成するためには「mecab-config」というコマンドを使用しないといけないため、併せてlibmecab-devもインストールする。


# swigのインストール
sudo apt-get install swig

# mecab-configコマンドを使用するため
sudo apt-get install libmecab-dev

Python3系バイディングの作成

準備が整ったので、ここからはPython3系バイディングの作成に取り掛かる。
まずは、一時的な作業場を用意して、カレントディレクトリを移動しておく。


# 作業用ディレクトリの作成
mkdir work
cd work

先ほど確認したMeCabのバージョンと同じMeCab本体とmecab-pythonをダウンロードし、解凍する。
MeCab本体をダウンロードする理由は、swigを使う元となるファイルがMeCab本体にしかないためである。
mecab-pythonをダウンロードする理由は、このファイルを用いてPython3系バイディングにするためである。


# mecabのダウンロード
wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar zxvf mecab-0.996.tar.gz

# mecab-pythonのダウンロード
wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
tar zxvf mecab-python-0.996.tar.gz

swigを用いてPython用のバイディングの自動生成を行う。
そして、自動生成されたファイルをPython2系バイディングのmecab-python内のファイルに移動する。


swig -python -shadow -c++ mecab-0.996/swig/MeCab.i
mv mecab-0.996/swig/MeCab.py mecab-python-0.996
mv mecab-0.996/swig/MeCab_wrap.cxx mecab-python-0.996

setup.pyの編集

mecab-python-0.996ディレクトリ内のsetup.pyはPython2系の文法で書かれているため、Python3系の文法に直す必要がある。


# setup.pyを編集
vim mecab-python-0.996/setup.py

次の箇所を変更し、保存、終了する。


# 変更前
#def cmd2(str):
#    return string.split (cmd1(str))

# 変更後
def cmd2(str):
    return cmd1(str).split()

インストール

ようやく全ての準備が整ったので、インストールを行う。


cd mecab-python-0.996
python3 setup.py build
sudo python3 setup.py install

テスト

さて、実際にPython3でMeCabが使えるかテストしてみるためにテストファイルを作成します。


$ vim mecab-test.py

import MeCab

m = MeCab.Tagger("")
print(m.parse("これはテストです。"))

それでは、このファイルを実行してみる。
次のように表示されれば、成功だ。


python3 mecab-test.py

これ	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
テスト	名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。
EOS

注意

MeCabのバージョン0.996で、この方法によりPython3からMeCabのparseToNode関数を使うと、最初のsurface(表層形)が表示されないというバグがある。
実際に確かめてみるために、次のコードを実行する。


import MeCab

t = MeCab.Tagger("")
n = t.parseToNode("これはテストです。")
while n is not None:
    print(n.surface + '\t' + n.feature)
	n = n.next

すると、次のように表示される。最初のsurface(表層形)の「これ」がないのである。


	BOS/EOS,*,*,*,*,*,*,*,*
	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
テスト	名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*

このバグの最も簡単な回避策は、parseToNode関数を呼び出す前に、一度、parse関数を呼び出すことで回避することができる。
実際に見てみよう。

先ほどのPython3のコードに「t.parse(”)」という一文を追加する。


import MeCab

t = MeCab.Tagger("")
t.parse('')
n = t.parseToNode("これはテストです。")
while n is not None:
    print(n.surface + '\t' + n.feature)
	n = n.next

このPython3のコードを実行すると、次のように表示される。


	BOS/EOS,*,*,*,*,*,*,*,*
これ	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
テスト	名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*

これで、全てのsurface(表層形)が表示することができた。

アンインストール

テストが無事に成功したら、swigとlibmecab-devは、もう必要ないので削除する。


# 不要なパッケージのアンインストール
sudo apt-get remove swig libmecab-dev

ちなみに、MeCab本体とIPA辞書をアンインストールする場合は、apt-getでインストールしたので、次のコマンドを実行すればよい。


sudo apt-get remove mecab meacb-ipadic-utf8

また、今回導入したPython3系バイディングをアンインストールする場合は、次の4つのファイルを削除すればよい。


sudo rm /usr/local/lib/python3.4/dist-packages/MeCab.py
sudo rm /usr/local/lib/python3.4/dist-packages/__pycache__/MeCab.cpython-34.pyc
sudo rm /usr/local/lib/python3.4/dist-packages/_MeCab.cpython-34m.so
sudo rm /usr/local/lib/python3.4/dist-packages/mecab_python-0.996.egg-info
Python×Ubuntu14.04 MeCabを使う方法