Ubuntu への MeCab のインストール
Ubuntu のパッケージにも MeCab が含まれている.しかし,mecab にチェックを入れると,標準辞書にも自動的にチェックが入る.自分が入れたいのは UTF-8 対応の辞書である(これもパッケージに含まれている).結局,標準辞書が必要かどうか分からず,調べるのが面倒だから手作業でインストールする.
はじめに
MeCab Project の本家はこちら:
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
http://mecab.sourceforge.net/
上記の本家のページに掲載されている手順に従ってインストール作業を進める.
ただし,辞書を UTF-8 対応とするため,configure 時にオプションを付与する.
ダウンロードするもの
http://sourceforge.net/projects/mecab/ から以下のファイルをダウンロードしておく.
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
う〜む,何も問題が生じない.まぁ,いいか.