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件とかそんなもんだろうから処理速度の向上は本当に「若干」だろうけど)
うーん、こういう製作者の意図はもう少しスムーズに読み取れるようになりたい。
散々悩まされたけど、普段見ようと思っても結局見ないソースコードを読む機会になり、勉強になりました。