[mecab-users 423] Re: MeCab 0.98のバグ報告その2

アーカイブの一覧に戻る

朝倉 輝 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
ダウンロード 



mecab-users メーリングリストの案内
アーカイブの一覧に戻る