「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日)
作者の方に反応していただいていたので、載せておきます(感謝
URL N-best解でコストが変更されないのは、今のところ仕様でTODOになっています。修正は厄介で、前方からの最適コストはA*探索で使うため、書き換えられないのです。URL
2013-09-26 16:12:39 via web