はじめに
形態素解析ツールは数多く存在するが,それぞれの特徴を理解した上で利用することが重要である.
今回はPythonから利用できる形態素解析ツール3つを比較してみた.
MeCab
- CRF(Conditional Random Fields)を用いたパラメータ推定
- 判別精度,実行速度ともに高く,標準的な使い方をするのであればMeCabを使うのが間違いないと思われる.ただしライブラリはちょっと重い.
In[1]: import MeCab
In[2]: mecab = MeCab.Tagger()
In[3]: %time print mecab.parse("りんごは人間の身体にとって大変良い効果があることが立証されています")
りんご 名詞,一般,*,*,*,*,りんご,リンゴ,リンゴ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
人間 名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
身体 名詞,一般,*,*,*,*,身体,シンタイ,シンタイ
にとって 助詞,格助詞,連語,*,*,*,にとって,ニトッテ,ニトッテ
大変 名詞,形容動詞語幹,*,*,*,*,大変,タイヘン,タイヘン
良い 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
効果 名詞,一般,*,*,*,*,効果,コウカ,コーカ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
ある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
立証 名詞,サ変接続,*,*,*,*,立証,リッショウ,リッショー
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 240 µs
Juman
- ヒューリスティクスによる形態素判別
- 判別精度が高く,さらに各形態素の__代表表記__が表示されるため,Twitterなどの表記揺れの多いものを解析するのに優れている
In[1]: import cJuman
In[2]: cJuman.init(['-B', '-e2'])
In[3]: %time print cJuman.parse_opt(["りんごは人間の身体にとって大変良い効果があることが立証されています"], cJuman.SKIP_NO_RESULT)
りんご りんご りんご 名詞 6 普通名詞 1 * 0 * 0 "代表表記:林檎/りんご カテゴリ:植物;人工物-食べ物 ドメイン:料理・食事"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
人間 にんげん 人間 名詞 6 普通名詞 1 * 0 * 0 "代表表記:人間/にんげん カテゴリ:人"
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL
身体 しんたい 身体 名詞 6 普通名詞 1 * 0 * 0 "代表表記:身体/しんたい カテゴリ:動物"
に に に 助詞 9 格助詞 1 * 0 * 0 NIL
とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:取る/とる 付属動詞候補(基本)"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:執る/とる ドメイン:政治 自他動詞:自:執れる/とれる"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:捕る/とる 自他動詞:自:捕れる/とれる"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:採る/とる 自他動詞:自:採れる/とれる"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:摂る/とる ドメイン:料理・食事 自他動詞:自:摂れる/とれる"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:撮る/とる ドメイン:文化・芸術 自他動詞:自:撮れる/とれる"
@ とって とって とる 動詞 2 * 0 子音動詞ラ行 10 タ系連用テ形 14 "代表表記:盗る/とる"
大変 たいへん 大変 副詞 8 * 0 * 0 * 0 "代表表記:大変/たいへん"
@ 大変 たいへん 大変だ 形容詞 3 * 0 ナ形容詞 21 語幹 1 "代表表記:大変だ/たいへんだ"
良い よい 良い 形容詞 3 * 0 イ形容詞アウオ段 18 基本形 2 "代表表記:良い/よい 反義:形容詞:悪い/わるい"
効果 こうか 効果 名詞 6 普通名詞 1 * 0 * 0 "代表表記:効果/こうか カテゴリ:抽象物"
が が が 助詞 9 格助詞 1 * 0 * 0 NIL
ある ある ある 動詞 2 * 0 子音動詞ラ行 10 基本形 2 "代表表記:有る/ある 補文ト 反義:形容詞:無い/ない"
こと こと こと 名詞 6 形式名詞 8 * 0 * 0 NIL
が が が 助詞 9 格助詞 1 * 0 * 0 NIL
立証 りっしょう 立証 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:立証/りっしょう カテゴリ:抽象物 ドメイン:政治"
さ さ する 動詞 2 * 0 サ変動詞 16 未然形 3 "代表表記:する/する 付属動詞候補(基本) 自他動詞:自:成る/なる"
れて れて れる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 タ系連用テ形 14 "代表表記:れる/れる"
い い いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本連用形 8 "代表表記:いる/いる"
ます ます ます 接尾辞 14 動詞性接尾辞 7 動詞性接尾辞ます型 31 基本形 2 "代表表記:ます/ます"
EOS
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 976 µs
Cabocha
- SVM(Support Vector Machine)を用いて係り受け解析を行う
- マルコフチェーンを用いて文章自動生成する際の学習データとかに用いると,MeCabなどのオーソドックスな形態素解析ツールを用いるより面白いことができそう(適当)
In[1]: import CaboCha
In[2]: cabocha = CaboCha.Parser()
In[3]: %time print cabocha.parseToString("りんごは人間の身体にとって大変良い効果があることが立証されています")
りんごは---------------D
人間の-D |
身体にとって-------D |
大変-D | |
良い-D | |
効果が-D |
ある-D |
ことが-D
立証されています
EOS
CPU times: user 882 µs, sys: 84 µs, total: 966 µs
Wall time: 917 µs
以下の様な出力も可能なので,pythonコード内で係り受け解析を用いた処理がしやすい.ただし遅い.
In[4]: print cabocha.parse("りんごは人間の身体にとって大変良い効果があることが立証されています").toString(CaboCha.FORMAT_LATTICE)
* 0 8D 0/1 -2.111879
りんご 名詞,一般,*,*,*,*,りんご,リンゴ,リンゴ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 2D 0/1 1.635242
人間 名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
* 2 6D 0/1 1.318492
身体 名詞,一般,*,*,*,*,身体,シンタイ,シンタイ
にとって 助詞,格助詞,連語,*,*,*,にとって,ニトッテ,ニトッテ
* 3 4D 0/0 0.781377
大変 名詞,形容動詞語幹,*,*,*,*,大変,タイヘン,タイヘン
* 4 5D 0/0 1.810798
良い 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
* 5 6D 0/1 2.448702
効果 名詞,一般,*,*,*,*,効果,コウカ,コーカ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
* 6 7D 0/0 2.151727
ある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
* 7 8D 0/1 -2.111879
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
* 8 -1D 1/5 0.000000
立証 名詞,サ変接続,*,*,*,*,立証,リッショウ,リッショー
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
CPU times: user 1.29 ms, sys: 101 µs, total: 1.39 ms
Wall time: 1.91 ms
最後に
これ以外にもKyteaやIgo-python,ChaSen,Kakasiなど,多くの形態素解析ツールがPythonにはあるので,それぞれの特徴をよく知り,case by caseで使い分けられるようになれるとよいと思います.