StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

形態素解析エンジンMeCabをPython3でも使えるようにする(Macの場合)

MeCabのPythonバインディングはPython3で使えない?

 日本語の文章を解析する際には欠かせない、形態素解析エンジン"MeCab"の導入に関するエントリを以前書きました(過去エントリ)。
 MeCabの公式サイトにいくとPythonバインディングというのが配布されていて、Python上でMeCabを使うことができるのですが、これだとPython2系でしか使えません。
 もともとこのPythonバインディングは、MeCabのプログラムからSWIGというツールを用いて自動生成したものらしく、この生成をやり直せばPython3系でも使うことができるようになります。


 [追記]じつは、コメント欄で指摘を頂き、pipでmecab-python3というのが配布されていることが分かったので、公式サイトに置いてあるやつを使わずに、後述のとおりpipからインストールすれば全て解決しますw[/追記]
 ここでは一応、SWIGを(中途半端に)使う方法を試してみたので、以下その手順をメモしておきます。また、MeCab本体と辞書のインストールについてもメモしておくので、このエントリをみるだけでMeCabの導入ができるようにもなっています


 MeCabそのもののインストールができている場合は、↓この辺のページを参考にすれば、SWIGを使った方法が実行できると思います。


 SWIGのインストール方法の参考
 Install Swig for Mac OS X | Professional Programmer
 Python3バインディングの生成方法の参考
 Ubuntu14.04とPython3でMeCabを使う方法 | トライフィールズ



 後者はUbuntu用の説明なんですが、詳しく説明してあって、これを少し改変することでMacでもできました。


 以下では一応、MeCabのインストールから全部順番にやっていくことにします。
 なお私はMacで使っていて、OSはEl Capitan、Pythonのバージョンは3.4.3です。
 
 
 MeCab本体、解析に使うIPA辞書とUniDic辞書、SWIGを使うのに必要なPCRE、そしてSWIGをインストールし、MeCabが公式に配布しているPython(2)バインディングをダウンロードしてきて、MeCab本体とSWIGで新たに生成するプログラムを挿入することで、Python3バインディングを作成するという手順です。
 辞書は、公式にはIPA辞書が推奨されているらしいですが、いま友人と読書会をやっている『言語研究のためのプログラミング入門』という教科書ではUniDicが使われていたので、一応UniDicも試しています。


言語研究のためのプログラミング入門: Pythonを活用したテキスト処理

言語研究のためのプログラミング入門: Pythonを活用したテキスト処理


 今回の本題と直接は関係ないですが、この教科書は、初歩中の初歩しかやらないものの、プログラミング自体まったくやったことがないという人(まぁ私もそれに近いですが)が、テキストデータの処理を通じてPythonに入門するというのにはいい内容だと思います。章末問題の回答が載ってないのが、ホントに初めてPythonを触るという人にとってはきついと思いますが。
 
 

MeCab本体と辞書の導入

 さて、今回は基本的に、全てターミナルからコマンドラインで操作していきます。
 ファイルをダウンロードしてきて解凍するところ(curlコマンドとtar、unzipコマンドのところ)は、ブラウザでアクセスしてダウンロードしてきて、マウスで適切な場所に移動し、ダブルクリックで解凍してももちろん良いです。その方が早いかもしれんw


 まず、MeCab用のディレクトリを作ってそこにカレントディレクトリを移動しておきます。
 私は全てDropbox同期フォルダ内でやるという、危険なことをやってますが、今のところ特に問題はおきてないです。複数台のMacから使っているので、何か不整合とか起きてもおかしくなさそうですがw

$ cd ~/Dropbox/Python/  # Pythonフォルダに移動
$ mkdir MeCab           # MeCabというフォルダを作成
$ cd MeCab              # そこに入る


 MeCab本体を、ダウンロードしてインストールします。MeCab本体についてもUTF-8の設定をしている記事をみたので、念のため私もそうしています。

$ curl -O https://mecab.googlecode.com/files/mecab-0.996.tar.gz
$ tar zxfv mecab-0.996.tar.gz       # 解凍
$ cd mecab-0.996                    # できたディレクトリに入る
$ ./configure --with-charset=utf8   # UTF-8前提で設定
$ make               # コンパイル
$ sudo make install  # インストール
$ cd ..         # 元のディレクトリに移動


 IPA辞書をダウンロードしてインストールします。

$ curl -O https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8   # UTF-8前提で設定
$ make
$ sudo make install
$ cd ..


 ついでにUniDicもインストールします。前述のとおり、勉強会で使っている教科書はこの辞書でやってたので。
 ちなみにUniDicはファイルのサイズがけっこうデカいので注意。(解凍前140MBくらいで解凍すると500MB以上になったw)

$ curl -O http://iij.dl.osdn.jp/unidic/58338/unidic-mecab-2.1.2_src.zip
$ unzip unidic-mecab-2.1.2_src.zip
$ cd unidic-mecab-2.1.2_src
$ ./configure  # UniDicはもともとUTF-8なので指定不要
$ make
$ sudo make install
$ cd ..


 ちなみにもうこの時点で、MeCabそのものは使えるようになっています。
 ターミナル上で試してみます。

$ mecab
剣道は剣の理法の修練による人間形成の道である
剣道	名詞,一般,*,*,*,*,剣道,ケンドウ,ケンドー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
剣	名詞,一般,*,*,*,*,剣,ケン,ケン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
理法	名詞,一般,*,*,*,*,理法,リホウ,リホー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
修練	名詞,サ変接続,*,*,*,*,修練,シュウレン,シューレン
による	助詞,格助詞,連語,*,*,*,による,ニヨル,ニヨル
人間	名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン
形成	名詞,サ変接続,*,*,*,*,形成,ケイセイ,ケイセイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
道	名詞,一般,*,*,*,*,道,ミチ,ミチ
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある	助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
EOS


 きちんと分解出来ましたね。
 辞書にUniDicを使うなら、たとえば以下のようにします。

$ mecab -d 辞書を置いてあるディレクトリ/unidic-mecab-2.1.2_src
剣道は剣の理法の修練による人間形成の道である
剣道	ケンドー	ケンドウ	剣道	名詞-普通名詞-一般		
は	ワ	ハ	は	助詞-係助詞		
剣	ケン	ケン	剣	名詞-普通名詞-一般		
の	ノ	ノ	の	助詞-格助詞		
理法	リホー	リホウ	理法	名詞-普通名詞-一般		
の	ノ	ノ	の	助詞-格助詞		
修練	シューレン	シュウレン	修練	名詞-普通名詞-サ変可能		
に	ニ	ニ	に	助詞-格助詞		
よる	ヨル	ヨル	因る	動詞-一般	五段-ラ行	連体形-一般
人間	ニンゲン	ニンゲン	人間	名詞-普通名詞-一般		
形成	ケーセー	ケイセイ	形成	名詞-普通名詞-サ変可能		
の	ノ	ノ	の	助詞-格助詞		
道	ミチ	ミチ	道	名詞-普通名詞-一般		
で	デ	ダ	だ	助動詞	助動詞-ダ	連用形-一般
ある	アル	アル	有る	動詞-非自立可能	五段-ラ行	終止形-一般
EOS


 UniDicを上記のようにオプションで指定して使う方法以外に、デフォルトの辞書をIPAからUniDicに変更してしまうことも可能です。
 デフォルトを変更するには、"/usr/local/etc/"というディレクトリに入っている"mecabrc"というファイルの中の、

dicdir =  /usr/local/lib/mecab/dic/ipadic


 となっている箇所が辞書の在り処を参照しているので、これを

dicdir =  /usr/local/lib/mecab/dic/unidic


 に書き換えればOKなのですが、特権が必要なのでここではvimで編集します。

$ sudo vi /usr/local/etc/mecabrc 


 と打ってvimからこのファイルを開き、あとはvimの操作方法なのでググると色々でてきますが、たとえばaキーで入力モードに切り替えて、ターミナル上で該当箇所を書き換え、escキーでコマンドモードに戻ってZZで保存終了すればいいです。
 
 

Python3バインディングの生成

 さて、Pythonバインディングの生成をやっていきます。
 SWIGをインストールするためには前提としてPCREというツールが必要らしいので、PCREをインストールした後にSWIGをインストールします。
 (なお、PCREを入れるためのさらなる前提としてXcodeとCommand Line Toolsが必要なので、入れてなかった場合は、Apple のAppStoreからXcodeを無料インストールした後、Command Line Toolsをインストールしておきます。)


 まずPCREのダウンロード、コンパイル、インストール。

$ curl -O http://jaist.dl.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.bz2
$ tar zxfv pcre-8.38.tar.bz2
$ cd pcre-8.38
$ ./configure
$ make
$ sudo make install
$ cd ..


 次にSWIGのダウンロード、コンパイル、インストール。

$ curl -O http://jaist.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz
$ tar zxfv swig-3.0.8.tar.gz
$ cd swig-3.0.8
$ ./configure
$ make
$ sudo make install
$ cd ..


 これでSWIGが導入できたので、いよいよPythonバインディングの生成を行います。
 まずmecab-pythonをダウンロードしてきて解凍します。

$ curl -O https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ tar zxfv mecab-python-0.996.tar.gz


 SWIGを動かします。以下のようにwarningが一杯出ましたが、無視しても大丈夫でした。

$ swig -python -shadow -c++ mecab-0.996/swig/MeCab.i
mecab-0.996/swig/../src/mecab.h:136: Warning 302: Identifier 'surface' redefined by %extend (ignored),
mecab-0.996/swig/MeCab.i:74: Warning 302: %extend definition of 'surface'.
mecab-0.996/swig/../src/mecab.h:848: Warning 302: Identifier 'set_sentence' redefined by %extend (ignored),
mecab-0.996/swig/MeCab.i:95: Warning 302: %extend definition of 'set_sentence'.


 上の処理によって"mecab-0.996/swig/"というディレクトリにできたファイルがあるので、これを"mecab-python-0.996"ディレクトリ内に移動して(同じ名前のファイルがあるので)上書きします。要は、落としてきたmecab-python-0.996は中身が古いので、必要なところを、MeCab本体とSWIGによって今回生成したファイルに置き換えるってことでしょう。

$ mv mecab-0.996/swig/MeCab.py mecab-python-0.996
$ mv mecab-0.996/swig/MeCab_wrap.cxx mecab-python-0.996


 次に、"mecab-python-0.996"ディレクトリ内の"setup.py"というPythonスクリプトを、一箇所だけ修正します。
 具体的には、

def cmd2(str):
    return string.split (cmd1(str))


 という箇所を、

def cmd2(str):
    return cmd1(str).split()


 に書き換えます。
 スクリプトをテキストエディタで開いてもいいし、さっきみたいにvimから編集しても、どっちでもいいと思います。


 この編集が終わったら、Pythonバインディングのインストールを行います。

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


 自分の環境で、pythonと打ったときにPython2ではなくPython3が起動するように既になっているのであれば、上記のpython3のところはpythonでも良いはずです。
 
 

使ってみる

 これでPython3バインディングの導入は完了したので、試しに分析してみます。ターミナルからPythonを立ち上げて、PythonからMeCabを使ってみます。

python
>>> import MeCab
>>> m = MeCab.Tagger('')
>>> text = '有効打突は、充実した気勢、適正な姿勢をもって、竹刀の打突部で打突部位を刃筋正しく打突し、残心あるものとする。'
>>> text_parsed = m.parse(text)
>>> print(text_parsed)
有効	名詞,形容動詞語幹,*,*,*,*,有効,ユウコウ,ユーコー
打	名詞,接尾,一般,*,*,*,打,ダ,ダ
突	名詞,一般,*,*,*,*,*
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
充実	名詞,サ変接続,*,*,*,*,充実,ジュウジツ,ジュージツ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
気勢	名詞,一般,*,*,*,*,気勢,キセイ,キセイ
、	記号,読点,*,*,*,*,、,、,、
適正	名詞,形容動詞語幹,*,*,*,*,適正,テキセイ,テキセイ
な	助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
姿勢	名詞,一般,*,*,*,*,姿勢,シセイ,シセイ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
もっ	動詞,自立,*,*,五段・タ行,連用タ接続,もつ,モッ,モッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
竹刀	名詞,一般,*,*,*,*,竹刀,シナイ,シナイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
打	接頭詞,名詞接続,*,*,*,*,打,ダ,ダ
突部	名詞,一般,*,*,*,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
打	接頭詞,名詞接続,*,*,*,*,打,ダ,ダ
突部	名詞,一般,*,*,*,*,*
位	名詞,接尾,一般,*,*,*,位,イ,イ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
刃	名詞,一般,*,*,*,*,刃,ハ,ハ
筋	名詞,接尾,一般,*,*,*,筋,スジ,スジ
正しく	形容詞,自立,*,*,形容詞・イ段,連用テ接続,正しい,タダシク,タダシク
打	接頭詞,名詞接続,*,*,*,*,打,ダ,ダ
突	名詞,一般,*,*,*,*,*
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
、	記号,読点,*,*,*,*,、,、,、
残	名詞,一般,*,*,*,*,残,ザン,ザン
心	名詞,接尾,一般,*,*,*,心,シン,シン
ある	動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
もの	名詞,非自立,一般,*,*,*,もの,モノ,モノ
と	助詞,格助詞,一般,*,*,*,と,ト,ト
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
。	記号,句点,*,*,*,*,。,。,。
EOS


 「打突」「刃筋」「残心」といった剣道用語が学習されていないようで、少し変になっていますね。
 mという変数名で、MeCab.Taggerクラスのインスタンスを生成し、.parseメソッドの引数に解析したい日本語文を与えています。
 上のような表形式の解析結果が欲しいというよりも、日本語の文章を単純に分かち書きして単語の登場頻度などを分析したいということも多いと思うので、その場合は以下のようにします。(長文を与えるならファイルで与えたほうがいいと思うけど。)

>>> m = MeCab.Tagger('-Owakati')
>>> text = '「剣道修錬の心構え」剣道を正しく真剣に学び、心身を錬磨して旺盛なる気力を養い、剣道の特性を通じて礼節をとうとび、信義を重んじ誠を尽して、常に自己の修養に努め、以って国家社会を愛して、広く人類の平和繁栄に、寄与せんとするものである。'
>>> text_parsed = m.parse(text)
>>> print(text_parsed)
「 剣道 修錬 の 心構え 」 剣道 を 正しく 真剣 に 学び 、 心身 を 錬磨 し て 旺盛 なる 気力 を 養い 、 剣道 の 特性 を通じて 礼節 を とうとび 、 信義 を 重んじ 誠 を 尽し て 、 常に 自己 の 修養 に 努め 、 以 って 国家 社会 を 愛し て 、 広く 人類 の 平和 繁栄 に 、 寄与 せ ん と する もの で ある 。 


 よし、これで無事、Python3でMeCabが使えるようになりました。
 認識されない単語があった場合は、これなどを参考に自分でユーザ辞書に登録したほうがいいかもですね。 
 

メモ

冒頭で紹介したUbuntu向けの解説記事がとても親切ですが、そのやり方との違いは以下のような点です。

  • インストールのコマンドが違う。
  • libmecab-devは別個にインストールする必要はなかった。
  • 一時的な作業フォルダを設ける必要はとくにない。
  • mecab-pythonのアンインストール時に削除するファイルの場所が、私の場合は(Anacondaを使ってPythonをインストールしてるので)anaconda配下にあって、以下のようなコマンドになる
$ sudo rm ~/anaconda/lib/python3.4/site-packages/MeCab.py 
$ sudo rm ~/anaconda/lib/python3.4/site-packages/_MeCab.so
$ sudo rm ~/anaconda/lib/python3.4/site-packages/mecab_python-0.996-py3.4.egg-info
$ sudo rm /Users/yk/anaconda/lib/python3.4/site-packages/__pycache__/MeCab.cpython-34.pyc 

 
 

追記:pipにmecab-python3ってあるやん!

 コメント欄で指摘を頂いて知ったのですが、pipにmecab-python3ってのがあったらしいです……。
 なので、これをインストールすれば、上述のようなややこしいことはせずにすみます。

$ pip install mecab-python3


 これでPythonバインディングのインストールは終了ですw