朝倉 輝
akira_asaku****@fujim*****
2010年 7月 23日 (金) 14:14:56 JST
工藤様 朝倉です。 一通り、CRFによるトレーニングとビタビアルゴリズムでの解析まで追い終わり ました。 単純な疑問ですが、matrix.binファイルの保存と読み込み時に左右が入れ替わっ ており、 iConnector::is_valid関数でlid(左ID?)をrsize_(右サイズ?)で範囲確認 をしているところがあるので、 どのタイミングで左右を入れ替えているのか、その意味を確認する予定です。 ただ、大きい辞書では左右のサイズは同じですので、影響はないのかもしれません。 追加での報告です。 ・eval.cppのrun関数でEOSが2行続くと、2行目のEOSがその次の行とつなが り、行の先頭にEOSがついてしまいます。 tests/cost-train/ipa.testにこのデータがあり、test.gld.crfの結果では名詞 に分類されています。 以下は特定の場合にのみ起きるバグだと思われます。 ・TestSentenceGenerator::runでparam.openが2度呼ばれており、引数でファイ ルを渡す場合に2重に出力されてしまいます。 ・libmecab.cppのmecab_destroyでc->allocated==LIBMECAB_IDで確認したほうが 安全です。 ・dictionary_rewriter.cppのRewritePattern::rewrite関数で、 $1$2といったdpat_があった場合に2つ目の$が無視されてしまっています。 if(p<end) elm += *p; を次の行に書き換えるといいかと思います。 if(p<end)--p; 但し、ふつうはこのような使い方はしないように思います。 ・viterbi.cppのanalyze関数でstd::strcncpy(&sentence_[0], str, len);に+1 が同様についていません。 これはsentence_がリサイズされて小さくなった場合に、終端文字がなくなって しまいます。 但し、長さを指定しているため、特に問題が出ないかもしれませんが直しておい た方がよさそうです。 同様に、Viterbi::initConstraints関数でも+1がありません。 ・64bit環境でsize_tが64bitになりますが、unsigned long intが32bitのよう で、StringBufferクラスのオペレータが足りないようで、コンパイルエラーが出 ます。 stdint.hを使うべきですが、configureのコードまで手を入れる必要が出てくる と思われます。 なにより、Visual Studioは2010より前には存在しません。 パッチを作成して添付します。 但し、Windows環境なので改行コードがCRLFのままかもしれませんのでそのまま 適用できないかもしれません テスト環境はWindows7 64bit、Visual Studio 2008、x64でのビルドです。 また、char.defで0x00D0がSPACEとして割り当てられていますが、U+000Dの間違 いだと思われます。 NAIST-JIDCでも同様の定義がありました。 > 朝倉様 > > 丁寧で実践的なご報告大変ありがとうございます。おそらく数年に一度ぐらいの非常に質の高い > フィードバックだと思います。今は公私共に忙しい時期ですのでなかなかMeCabに割く時間がありませんが、 > 時間を見つけてはご指摘の問題を修正したいと思います。もし遅れているようでしたら、遠慮無く > つついてください。 > > 工藤 -------------- next part -------------- 文字コード指定の無い添付文書を保管しました... 名前: mecab-0.98.patch Descargar