LoginSignup
13
9

More than 3 years have passed since last update.

MeCabのコスト計算について

Posted at

はじめに

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 はどのように形態素解析しているか

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9