#はじめに
MeCabのコスト計算について勉強したのでまとめてみました。
どこか間違っていたらご指摘ください。
#MeCabの形態素解析の概要
MeCabは登録された辞書を使って形態素解析を行います。もし辞書に登録されていない単語(未知語)が出た場合、各単語のコストに基づいて分割します。そのなかで総コストが最小のものを結果として出力します。
#実際にやってみる
今回はipadic-neologd辞書を用いて、架空の単語「アメリカドイツ村」がどのように形態素解析されるか確認します。
echo アメリカドイツ村|mecab -d C:\neologd -N2
アメリカ 名詞,固有名詞,地域,国,*,*,アメリカ,アメリカ,アメリカ
ドイツ 名詞,固有名詞,地域,国,*,*,ドイツ,ドイツ,ドイツ
村 名詞,接尾,地域,*,*,*,村,ムラ,ムラ
EOS
アメリカ 名詞,固有名詞,地域,国,*,*,アメリカ,アメリカ,アメリカ
ドイツ村 名詞,固有名詞,一般,*,*,*,ドイツ村,ドイツムラ,ドイツムラ
EOS
-dで辞書を指定し、NUMオプションで指定した数だけ候補を挙げます。
このように未知語に対して2種類の分け方が候補に挙がりました。この分け方は私たちにとっても、かなり納得のいくものではないでしょうか。
#MeCabの辞書
コストの計算に入る前に、MeCab辞書の登録方法について説明します。
辞書は、
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
という形でcsvファイルとして保存してから辞書をビルドします。これをみると、
・ 左文脈ID
・ 右文脈ID
・ コスト
という見慣れない言葉が含まれています。これらがMeCabの形態素解析に用いられる情報になります。
生起コスト
生起コストとは、ある単語自体の現れにくさです。値が高いほどその単語は現れにくくなります。生起コストは先ほど登録した辞書のコストの値です。それでは「アメリカドイツ村」はどのような生起コストになったのでしょうか?
echo アメリカドイツ村|mecab -F "%m,%c,\n" -d C:\neologd -N2
アメリカ, 4698,
ドイツ, 2543,
村, 8707,
EOS
アメリカ, 4698,
ドイツ村, 611,
EOS
%mで表層形、%cで生起コストを表示させます。
ここで一つの疑問が生まれます。総コストは明らかに2つ目の方が小さいはずなのに、出力第一候補は1つ目の結果になっています。その理由は新たなコスト、連接コストの存在にあります。
#連接コスト
連接コストとは、2つの単語の文脈IDの連続しにくさです。値が小さいほど連続する可能性が高くなります。文脈IDは辞書の左文脈IDと右文脈IDに当たります。基本的にこのIDは登録時には同じ値になっていると思われます。例えば「前後」という単語を考えます。
「前」の文脈IDは1314,「後」の文脈IDは1313です。連接コストは左文脈IDと右文脈IDの組み合わせで決められます。
組み合わせの一覧はMeCab\dic\ipadicにあるmatrix.def(またはmatrix.bin)にあります。これを見ると、
1314 1313 -316
1313 1314 716
前→後は連接コストが低い(-316)ため連続しやすく、後→前だと連接コストが高く(716)連続しにくいという結果が得られました。これも割と納得できるかと思います。
それでは「アメリカドイツ村」についても見てみましょう.
echo アメリカドイツ村|mecab -F"%m,%phl,%phr,%c,%pc,%pn\n" -d C:\neologd -N2
アメリカ,1294,1294,4698,3746,3746
ドイツ,1294,1294,2543,-141,-3887
村,1303,1303,8707,881,1022
EOS
アメリカ,1294,1294,4698,3746,3746
ドイツ村,1288,1288,611,2614,-1132
EOS
MeCabコマンドをまとめると以下のようになります。
コマンド | 説明 |
---|---|
%m | 表層形 |
%phl | 左文脈ID |
%phr | 右文脈ID |
%c(または%pw) | 生起コスト |
%pc | 連接コスト+単語生起コスト(文頭から累積) |
%pn | 連接コスト+単語生起コスト(その形態素単独, %pw+%pC) |
全てのコマンドはこちらに記載されています。 | |
出力がわかりにくいのでこれも表にしてみます。 |
表層形 | 左文脈ID | 右文脈ID | 生起コスト | 連接+生起(累積) | 連接+生起(単独) |
---|---|---|---|---|---|
アメリカ | 1294 | 1294 | 4698 | 3746 | 3746 |
ドイツ | 1294 | 1294 | 2543 | -141 | -3887 |
村 | 1303 | 1303 | 8707 | 881 | 1022 |
アメリカ | 1294 | 1294 | 4698 | 3746 | 3746 |
ドイツ村 | 1288 | 1288 | 611 | 2614 | -1132 |
ここで注意していただきたいのは、BOSとEOSにも文脈IDが付与されているということです。なので、1つ目の「アメリカ」の連接コストはmatrix.defより |
0 1294 -952
となります。そのため、累積コストは4698-952=3746となります。
次に「ドイツ」を見てみましょう。左右の文脈IDが1294で連接コストは-6430とかなり小さくなります。(確かに国名が連続して続くのは珍しい...)
累積コストは(3746+2543)-6430=-141で、単独の場合は2543-6430=-3887で、計算と一致しました。
また、出力はされていませんが、EOSにも文脈IDがあるため最終チェックを行います。
文脈ID1303→0の連接コストは5、文脈ID1288→0は-919で累積コストを比べると、886と1695で1つ目の方が最小コストなので、先ほどの謎が解明できました。
#参考
MeCabのコスト計算を理解する。
日本テレビ東京で学ぶMeCabのコスト計算
日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているか