しかし、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
ピンバック:MecabをUbuntu14.0.4にインストールして実行してみる | 学生コーダーの備忘録
ピンバック:MecabをUbuntu14.0.4にインストールして実行してみる – 学生コーダーの備忘録
ピンバック:形態素解析等 – 一日一感 / Something that caught me
ピンバック:Ubuntu14.04・Python3.4にMeCabをインストール | #cr_nb_memo
ピンバック:MecabをUbuntu14.0.4にインストールして実行してみる – ひきこもコーダー備忘日記
ピンバック:MecabをUbuntu14.0.4にインストールして実行してみる | Foolean
ピンバック:Python3でMeCab使ったらエラーが出たお話 | kitayama lab
ピンバック:MecabをUbuntu14.0.4にインストールして実行してみる | Foolean – 備忘録風雑記ブログ
ピンバック:Pythonでテキストマイニング ①形態素解析(再:Linux版) - TECHBIRD | TECHBIRD - プログラミングを楽しく学ぼう