Ubuntu への MeCab のインストール

Ubuntu のパッケージにも MeCab が含まれている.しかし,mecab にチェックを入れると,標準辞書にも自動的にチェックが入る.自分が入れたいのは UTF-8 対応の辞書である(これもパッケージに含まれている).結局,標準辞書が必要かどうか分からず,調べるのが面倒だから手作業でインストールする.

はじめに

MeCab とは日本語形態素解析システムのひとつである.

MeCab Project の本家はこちら:
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
http://mecab.sourceforge.net/

上記の本家のページに掲載されている手順に従ってインストール作業を進める.
ただし,辞書を UTF-8 対応とするため,configure 時にオプションを付与する.

計算機環境

  • Ubuntu 11.04 (natty)
  • カーネル:Linux 2.6.38-11-generic

ダウンロードするもの

http://sourceforge.net/projects/mecab/ から以下のファイルをダウンロードしておく.

(注) 一応,Java バインディングも落としたものの,結局,使わず.

MeCab のインストール

$ tar zxvf mecab-0.98.tar.gz
$ cd mecab-0.98/
$ ./configure
$ make
$ make check
$ sudo make install

(注意) 後述するように make check にてエラーが出たが,気にせずインストール.

MeCab 用辞書のインストール

$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801/
$ ./configure --with-charset=utf8
$ make
$ sudo make install

(注) 辞書は /usr/local/lib/mecab/dic/ipadic/ 下にインストールされる.

ここで MeCab を動かしてみると,とりあえず上手く動いているみたい.

$ /usr/local/bin/mecab
明日の天気を当ててみて!
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
当て 動詞,自立,*,*,一段,連用形,当てる,アテ,アテ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
! 記号,一般,*,*,*,*,!,!,!
EOS

Python バインディングのインストール

(注意) Synaptic パッケージマネージャ等を利用して,事前に python-dev を入おくこと.

$ tar zxvf mecab-python-0.98.tar.gz
$ cd mecab-python-0.98/

$ python setup.py build
$ sudo python setup.py install

(メモ)MeCab.[py|pyc] のインストール先は /sr/local/lib/python2.7/dist-packages/

Python プログラムから MeCab を利用する

$ python
>>> import MeCab
>>> mecab = MeCab.Tagger("-Ochasen")     #出力を Chasen モードにする
>>> print mecab.parse("明日の天気を当ててみて!")
明日 アシタ 明日 名詞-副詞可能
の ノ の 助詞-連体化
天気 テンキ 天気 名詞-一般
を ヲ を 助詞-格助詞-一般
当て アテ 当てる 動詞-自立 一段 連用形
て テ て 助詞-接続助詞
み ミ みる 動詞-非自立 一段 連用形
て テ て 助詞-接続助詞
! ! ! 記号-一般
EOS

>>> sentence = u"明日の天気を当ててみて!".encode('utf-8')
>>> print mecab.parse(sentence)
明日 アシタ 明日 名詞-副詞可能
の ノ の 助詞-連体化
天気 テンキ 天気 名詞-一般
を ヲ を 助詞-格助詞-一般
当て アテ 当てる 動詞-自立 一段 連用形
て テ て 助詞-接続助詞
み ミ みる 動詞-非自立 一段 連用形
て テ て 助詞-接続助詞
! ! ! 記号-一般
EOS

システムの default locale が UTF-8 のためか,以下のように encode('utf-8')がなくても大丈夫.しかし,Windows 上で動作させる場合を考慮すると,こんないい加減な実装は避けるべき.

>>> sentence ="明日の天気を当ててみて!"
>>> print mecab.parse(sentence)
明日 アシタ 明日 名詞-副詞可能
の ノ の 助詞-連体化
天気 テンキ 天気 名詞-一般
を ヲ を 助詞-格助詞-一般
当て アテ 当てる 動詞-自立 一段 連用形
て テ て 助詞-接続助詞
み ミ みる 動詞-非自立 一段 連用形
て テ て 助詞-接続助詞
! ! ! 記号-一般
EOS

さすがに,この書き方は怒られる.

>>> sentence = u"明日の天気を当ててみて!"
>>> print mecab.parse(sentence)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/MeCab.py", line 220, in parse
    def parse(self, *args): return _MeCab.Tagger_parse(self, *args)
TypeError: in method 'Tagger_parse', argument 2 of type 'char const *'

個々の形態素を扱う

変数 sentence の中身は前述どおり:

>>> print mecab.parse(sentence)
明日 アシタ 明日 名詞-副詞可能
の ノ の 助詞-連体化
天気 テンキ 天気 名詞-一般
を ヲ を 助詞-格助詞-一般
当て アテ 当てる 動詞-自立 一段 連用形
て テ て 助詞-接続助詞
み ミ みる 動詞-非自立 一段 連用形
て テ て 助詞-接続助詞
! ! ! 記号-一般
EOS

解析結果を Node 単位に落とし込む.基本形は Node#feature に含まれるようだから,split() で切り出す.

>>> node = mecab.parseToNode(sentence)
>>> node = node.next    # 最初にひとつポインタを進める
>>> print node.surface
明日
>>> for i in range(4):
...     node = node.next
... 
>>> print node.surface
当て
>>> print node.feature
動詞,自立,*,*,一段,連用形,当てる,アテ,アテ        #CSV形式
>>> 
>>> f = node.feature
>>> print f.split(',')[6]      #基本形を取り出す

おわりに

目標であった "Python から MeCab を 呼び出す" を実現できた.
また,形態素の基本形を切り出すのも容易であった.

補足:MeCab 本体の make check にて出たエラー

              precision          recall         F
LEVEL 0:    12.8959(57/442) 11.8998(57/479) 12.3779
LEVEL 1:    12.2172(54/442) 11.2735(54/479) 11.7264
LEVEL 2:    11.7647(52/442) 10.8559(52/479) 11.2921
LEVEL 4:    11.7647(52/442) 10.8559(52/479) 11.2921
1c1
< シリーズ 名詞,一般,*,*,*,*,シリーズ,シリーズ,シリーズ
---
> シリーズ 名詞,一般,*,*,*,*,*
43c43
< ストーリー 名詞,一般,*,*,*,*,ストーリー,ストーリー,ストーリー
---
> ストーリー 名詞,一般,*,*,*,*,*
89c89
< 應 名詞,サ変接続,*,*,*,*,*
---
> 應 名詞,一般,*,*,*,*,*
179c179
< スポーツ 名詞,一般,*,*,*,*,スポーツ,スポーツ,スポーツ
---
> スポーツ 名詞,一般,*,*,*,*,*
195c195
< 應 名詞,サ変接続,*,*,*,*,*
---
> 應 名詞,一般,*,*,*,*,*
201c201
< 昭和 名詞,固有名詞,一般,*,*,*,昭和,ショウワ,ショーワ
---
> 昭和 名詞,固有名詞,人名,名,*,*,昭和,アキカズ,アキカズ
219,220c219,220
< 應援 名詞,サ変接続,*,*,*,*,*
< 團 名詞,固有名詞,人名,姓,*,*,團,ダン,ダン
---
> 應 名詞,一般,*,*,*,*,*
> 援團 名詞,一般,*,*,*,*,*
248c248
< 應 名詞,サ変接続,*,*,*,*,*
---
> 應 名詞,一般,*,*,*,*,*
254,255c254,255
< 應 名詞,サ変接続,*,*,*,*,*
< 援團 名詞,サ変接続,*,*,*,*,*
---
> 應 名詞,一般,*,*,*,*,*
> 援團 名詞,一般,*,*,*,*,*
303c303
< トップクラス 名詞,一般,*,*,*,*,トップクラス,トップクラス,トップクラス
---
> トップクラス 名詞,一般,*,*,*,*,*
337c337
< プロフィール 名詞,一般,*,*,*,*,プロフィール,プロフィール,プロフィール
---
> プロフィール 名詞,一般,*,*,*,*,*
368c368
< コール 名詞,一般,*,*,*,*,コール,コール,コール
---
> コール 名詞,一般,*,*,*,*,*
438c438
< カテゴリ 名詞,一般,*,*,*,*,カテゴリ,カテゴリ,カテゴリ
---
> カテゴリ 名詞,一般,*,*,*,*,*
443c443
< シリーズ 名詞,一般,*,*,*,*,シリーズ,シリーズ,シリーズ
---
> シリーズ 名詞,一般,*,*,*,*,*
runtests faild in 
exit: 52: Illegal number: -1
FAIL: run-cost-train.sh
===================
1 of 3 tests failed
===================
MeCab 本体の make check でエラーが出た語を試す(語:シリーズ)
$ /usr/local/bin/mecab
今年の日本シリーズはどこがとどこの対戦となるか?
今年 名詞,副詞可能,*,*,*,*,今年,コトシ,コトシ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
日本 名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
シリーズ 名詞,一般,*,*,*,*,シリーズ,シリーズ,シリーズ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
どこ 名詞,代名詞,一般,*,*,*,どこ,ドコ,ドコ
と 助詞,格助詞,一般,*,*,*,と,ト,ト
どこ 名詞,代名詞,一般,*,*,*,どこ,ドコ,ドコ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
対戦 名詞,サ変接続,*,*,*,*,対戦,タイセン,タイセン
と 助詞,格助詞,一般,*,*,*,と,ト,ト
なる 動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
? 記号,一般,*,*,*,*,?,?,?
EOS
MeCab 本体の make check でエラーが出た語を試す(語:昭和)
昔,昭和64年という年があった.
昔 名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
, 記号,読点,*,*,*,*,,,,,,
昭和 名詞,固有名詞,一般,*,*,*,昭和,ショウワ,ショーワ
64 名詞,数,*,*,*,*,*
年 名詞,接尾,助数詞,*,*,*,年,ネン,ネン
という 助詞,格助詞,連語,*,*,*,という,トイウ,トユウ
年 名詞,一般,*,*,*,*,年,トシ,トシ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ 動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS

昔,高橋昭和という偉人がいた.
昔 名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
, 記号,読点,*,*,*,*,,,,,,
高橋 名詞,固有名詞,人名,姓,*,*,高橋,タカハシ,タカハシ
昭和 名詞,固有名詞,人名,名,*,*,昭和,アキカズ,アキカズ
という 助詞,格助詞,連語,*,*,*,という,トイウ,トユウ
偉人 名詞,一般,*,*,*,*,偉人,イジン,イジン
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
い 動詞,自立,*,*,一段,連用形,いる,イ,イ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS

う〜む,何も問題が生じない.まぁ,いいか.