MeCabのコスト計算を理解する。
はじめに
久しぶりにMeCabをいじる必要があったのだが、形態素解析のコスト計算らへんで理解できてなかったところがあったのでまとめる。
ある単語を形態素解析する場合、その候補が複数ある場合にどう考えるか。例えば、
日本テレビ東京
辞書に「日本テレビ東京」という単語が存在しない場合、どのようにこの単語を構成すべきか。候補としては、
が考えられる。(各単語は辞書に存在するとする)
MeCabでは「各候補のコストを計算し、パスの総和が最小コストとなる候補」を選択する。
上記の例の場合にどのように候補を決定するかは下記参照。
日本テレビ東京で学ぶMeCabのコスト計算 | mwSoft
この例では「どのように分かち書きするのが最適か」を考えた。ここでは、「複数の意味を持つ単語が使用された場合、どの意味が最適なのか」について考える。
今回は、「位」という単語について考える。
コトバンクによると、この単語は
- [接尾]助数詞。
- 物事の順位・等級・位階などを表す。「第三位」「従五
- [名]くらい。位階。
- 「一品以下。初位(そゐ)以上を―と曰ふ」
の2つの意味をもつとされる。
どっちの意味が最適化はその文脈によって決定される。
コスト計算について
以下の2通りを考える。
- 「位を継承」
- 「三位」
$ echo 位を継承|mecab 位 名詞,一般,*,*,*,*,位,クライ,クライ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 継承 名詞,サ変接続,*,*,*,*,継承,ケイショウ,ケイショー
一方、2.は
$ echo 三位|mecab 三 名詞,数,*,*,*,*,三,サン,サン 位 名詞,接尾,助数詞,*,*,*,位,イ,イ
それぞれ正しい意味となっている。
では、それぞれの意味はどのように決まったのか。
キーワードは「生起コストと連結コスト」である。
文章中に出現する単語自体のコスト(生起コスト)とその単語の品詞と次の単語の品詞の遷移コスト(連結コスト)の総和が最小となるパスをもつ候補を選択する。
この考えはCRFの分類と同じである(MeCabはCRFにより学習されているため)。
CRFに関しては下記参照
kento1109.hatenablog.com
文脈ID
先ほどは単語自体のコストと述べたが、これは正確ではない。
「位 」の場合、意味が異なるのに全てが同じコストではどっちが最適か判断できない。
辞書に「位」のエントリは合計5つ存在する。
ファイル名 | 表層形 | 左文脈ID | 右文脈ID | コスト | 品詞 | 品詞細分類1 | 品詞細分類2 | 品詞細分類3 | 活用形 | 活用型 | 原形 | 読み | 発音 |
Noun.adverbal.csv | 位 | 1314 | 1314 | 5941 | 名詞 | 副詞可能 | * | * | * | * | 位 | クライ | クライ |
Noun.csv | 位 | 1285 | 1285 | 6572 | 名詞 | 一般 | * | * | * | * | 位 | クライ | クライ |
Noun.csv | 位 | 1285 | 1285 | 7643 | 名詞 | 一般 | * | * | * | * | 位 | イ | イ |
Suffix.csv | 位 | 1300 | 1300 | 9198 | 名詞 | 接尾 | 助数詞 | * | * | * | 位 | イ | イ |
Suffix.csv | 位 | 1298 | 1298 | 8893 | 名詞 | 接尾 | 一般 | * | * | * | 位 | イ | イ |
この「文脈ID」がどの「位」の意味が文脈的に最も自然か(コストが小さいか)を決定するうえで重要になる。
文脈IDは下記ファイルで定義されている。
- left-id.def
- right-id.def
1.「位を継承」のコスト計算
コストは以下のコマンドで確認できる。
$ echo 位を継承|mecab -F"%m,%phl,%phr,%pb,%pw,%pc,%pn\n" -N2 位,1285,1285,*,6572,6289,6289 を,156,156,*,4183,5479,-810 継承,1283,1283,*,4452,8789,3310 EOS
まず、「位」の生起コストは、辞書データファイルより、「6572」と分かる。次に「位」の左文脈ID(先頭なので左文脈は0)、右文脈IDより連結コストを「matrix.def」より確認すると、
左文脈ID | 右文脈ID | コスト |
0 | 1285 | -283 |
というエントリがあることが分かる。
なので、コスト合計は
6572-283=6289
ちなみに、生起コストを見ると先頭のエントリ(Noun.adverbal.csv)の方が低い(5941)ことが分かる。
また、この素性IDの連結コストは
左文脈ID | 右文脈ID | コスト |
0 | 1314 | -316 |
なので、コスト合計は
5941-316=5625
となり、この時点では「名詞(副詞可能)」の意味の方がコストは小さい。絵にするとこんな感じ。
続けてコストを見ていく。次の「を」(文脈ID:156)の生成コストを調べると「4183」とうことが分かる。
文脈ID:1285からの連結コストは、
左文脈ID | 右文脈ID | コスト |
1285 | 156 | -4993 |
である。この時点の総和は
6289 -4993 + 4183 = 5479
一方、ID:1314からの連結コストは
左文脈ID | 右文脈ID | コスト |
1314 | 156 | -3144 |
である。この時点の総和は
5625 -3144 + 4183 =6664
この時点でID:1285のコストの方が小さくなった。
続きを絵にするとこうなる。
この時点で、ID:1285の方がコストが小さいので、「位」に関してはこっちが最適なパスとなる。
2.「三位」のコスト計算
$ echo 三位|mecab -F"%m,%phl,%phr,%pb,%pw,%pc,%pn\n" -N3 三,1295,1295,*,2725,3295,3295 位,1300,1300,*,9198,1762,-1533 EOS 三位,1285,1285, ,7054,6771,6771 EOS 三,1295,1295,*,2725,3295,3295 位,1314,1314, ,5941,8071,4776 EOS
生成コストだけをみると、文脈ID:1314が最も小さい。
しかし、ID:1295からの連結コストは以下の通り。
左文脈ID | 右文脈ID | コスト |
1295 | 1300 | 9198 |
1295 | 1314 | 5941 |
ID:1300の連結コストの方がはるかに小さい。
(数を指す名詞が直前にくる場合、「位」を接尾とする方が自然と考える)
コストの総和は、
文脈ID | 生起コスト | 連結コスト | コスト総和 |
1300 | 9198 | -10731 | -1533 |
1314 | 5941 | -1165 | 4776 |
なので、ID:1300が最適なパスとなる。