Igo 0.4.5 リリース

Igo 0.4.5がリリースされたようです。

日曜日に報告したバグはちゃんと修正されていました。
素早い対応ありがとうございます。



この前の記事にIgoの作者さんからコメントをもらって気がついたんだけど、MeCab-ipadicのright-idとleft-idの数一緒だったんだね。Igoのバグはright-idとleft-idの個数を取り違えていたことにあったんだけど、数が一緒なら問題なく動いてしまうわけだ。

・・・あと、僕自身right-idとleft-idを色々と混同していたみたいですね。問題があったのは「左側形態素右文脈ID」と「右側形態素左文脈ID」の間のコストを計算する部分。「左側の形態素の~ID」と「左文脈ID」に同じ「left-id」という名前が付けられていたので混乱してました。


加えて混乱の元になったのが「net/reduls/igo/bin/Matrix.java」に書かれていた以下のコメント。

// NOTE: tmpMatrixという一時配列を用いている理由
// 
// この段階で、fmos.putShort(cost)、などとしてファイルに書き出した場合、
// matrix[leftId][rightId]=cost、といった配列ができる。
//
// それでも特に問題はないのだが、今回のケースでは、
// 「rightIdが固定で、leftIdのみが変動する」といったようなメモリアクセスパターンが多い。
//
// そのためtmpMatrix配列を用いて、コスト値の並び順を変更し、
// matrix[rightId][leftId]とったように、rightIdが第一添字になるようにした方が
// メモリアクセスの局所性が高まり(多分)、若干だが処理速度が向上する。
tmpMatrix[j*leftNum + i] = cost;  

外のループはi,jの順番になっているから、「leftNumごと飛び飛びにアクセスしてるじゃん!コメントと違うじゃん!」と思ってrightIdとleftIdを入れ替えるパッチを書いちゃった。でも、これ、よく考えてみると辞書作成時ではなく、解析時の事をいっていたみたい。辞書作成時は少しくらい時間かかってもいいもんね。

「現在の解析ノード」は固定で「遷移コストを最小限にするには、一つ前の形態素はどれが適当か」ってことを計算するから「rightIdが固定で、leftIdのみが変動する」アクセスパターンになるというわけだ。(多いと言っても一つの解析ノードに対してすべてのleftIdを試すわけではなく、せいぜい10件とかそんなもんだろうから処理速度の向上は本当に「若干」だろうけど)


うーん、こういう製作者の意図はもう少しスムーズに読み取れるようになりたい。
散々悩まされたけど、普段見ようと思っても結局見ないソースコードを読む機会になり、勉強になりました。