唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

MeCabでN-Best解を出力した時のコストの表示がおかしい?

MeCabでN-best解を出力した時に累積コストを見ると順番に並んでないように見えるんですが何故ですか?」ときかれて答えられなかったのでとりあえずメモ
上の質問自体は、質問者がEOSとの連接コストを計算し忘れていたのではないかと思うんですが……それ以外にも気になることがあったので

MeCabのコスト計算

形態素解析器のMeCabはコストが一番低い解析結果を出力します

コスト計算の詳細は以下の記事がわかりやすいです

単語のコストと連接コスト(前後関係に基づいたコスト)を足していけば計算できます(と理解しています

上記の記事でも書かれているように-Fなどのオプションで%pcというフォーマットを指定すると累積コストが表示できます

mecab -F"%m(%pc) " -E"EOS(%pc)\n"

とコマンドを打って、「すもも」という入力を与えると以下のような出力が得られます

すもも(7263) EOS(6690)

なおMeCab 0.996(IPADic)で試しています

N-Bestの時のコストの表示

また以下のようなコマンドでコストが低い順にn個の解析結果が得られます

mecab -F"%m(%pc) " -E"EOS(%pc)\n" -N n

上位5件を見ると解析結果はそれなりに納得いくような気もするのですが、EOSでの累積コストがすべて6690となっていて怪しい感じがします

すもも(7263) EOS(6690)
す(9963) もも(14085) EOS(6690)
すも(9972) も(14844) EOS(6690)
す(9753) も(10264) も(14844) EOS(6690)
す(9753) もも(14085) EOS(6690)

試してみるとどんな文章を入力に与えても、EOSの時の累積コストの値は1番目とすべて同じになっています
このことから-E(EOS)のときに%pcで累積コストを表示すると、表示されるコストが間違っているような気がします
それとも、そもそもそういう使い方をするものではないのでしょうか?


また以下の2010年の質問などをみると「え、途中のスコアもおかしいかもしれないの?」ってすこし不安になるんですが、MeCabの解析時のコストの計算って単語のコストと連接コストを足すだけでよかったですよね……?

N-Bestで表示した連接コストがmatrix.defと一致しないので困っています。

連接コストが一致しない (mecab-users 428) - MeCab - SourceForge.JP

ちょっと内容の正確性に不安があるので、記述におかしな場所などあったら指摘してください

余談

MeCabソースコードを読んで原因を探ろうとしてあっけなく返り討ちにあいました
他人のC++のコードを読むのってわりと難易度が高い気がするんですが、C++erならあれぐらいは余裕なんですかね……

追記(2013年9月26日)

作者の方に反応していただいていたので、載せておきます(感謝