機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

MeCabのコスト計算を理解する。

はじめに



久しぶりにMeCabをいじる必要があったのだが、形態素解析のコスト計算らへんで理解できてなかったところがあったのでまとめる。

ある単語を形態素解析する場合、その候補が複数ある場合にどう考えるか。例えば、

日本テレビ東京

辞書に「日本テレビ東京」という単語が存在しない場合、どのようにこの単語を構成すべきか。候補としては、

が考えられる。(各単語は辞書に存在するとする)
MeCabでは「各候補のコストを計算し、パスの総和が最小コストとなる候補」を選択する。
上記の例の場合にどのように候補を決定するかは下記参照。
日本テレビ東京で学ぶMeCabのコスト計算 | mwSoft

この例では「どのように分かち書きするのが最適か」を考えた。ここでは、「複数の意味を持つ単語が使用された場合、どの意味が最適なのか」について考える。

今回は、「」という単語について考える。
コトバンクによると、この単語は

  • [接尾]助数詞。
    • 物事の順位・等級・位階などを表す。「第三位」「従五
  • [名]くらい。位階。
    • 「一品以下。初位(そゐ)以上を―と曰ふ」

の2つの意味をもつとされる。
どっちの意味が最適化はその文脈によって決定される。

コスト計算について



以下の2通りを考える。

  1. 「位を継承」
  2. 「三位」

1.をMeCab分かち書きすると、

$ 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
となり、この時点では「名詞(副詞可能)」の意味の方がコストは小さい。絵にするとこんな感じ。
f:id:kento1109:20180124101028p:plain:w250

続けてコストを見ていく。次の「を」(文脈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のコストの方が小さくなった。
続きを絵にするとこうなる。
f:id:kento1109:20180124101523p:plain
この時点で、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が最適なパスとなる。