(2010年07月07日 15:53), NIIBE Yutaka wrote:
> lattice.c では「いわゆるビタビアルゴリズムを使用して経路を選ぶ」とコメ
> ントにありますが、このコメントは削除すべきではないでしょうか。
> 
> 現状の実装は Viterbi アルゴリズムとは関係ないと思います。似ていると勘違
> いしたか、あるいはこれから実装するつもりだったのか。
[...]
> 「Viterbi アルゴリズムを利用」する、というのであれば、文節 (Hidden
> State)、読み (Obserbation) と対応させて、文節の遷移確率に加えて、文節か
> らその読みが出てくる確率を使って、最尤の文節の並びを見つける、となると
> 思います。

Viterbi アルゴリズムは、動的計画法(Dynamic Programming)[1]で最尤の信号
源の状態遷移を見つける、ということだと思います。

Anthy の実装は「単に動的計画法で shortest path を見っけているだけじゃん、
(似てるといっても)Viterbi とは言えんだろう」と 7/7 の時点では考えていま
した。

それで、もう少しちゃんと読んだら、現状の実装はもっとひどい実装でした。

ここは及第点とは言えない、というレベルではなく、明らかに落第点しかあげ
られない、という感じです。プンプン。

現状の実装では「もっとも良いものを選択する」とならないことがあります。
ちょっと複雑な長い文章ならば、ぜんぜんダメでしょう。たぶん。

コメントにはラティス/トレリスと書いてありますが、実際はツリーで、全部の
場合を列挙しようと試みるものとなっています。例えば、下記のような[1] と
同じ例を考えます。

           B  E  H
        A  C  F  I J
           D  G

build_graph で左から node を作っていきますが、一番最初だけはたしかにラ
ティス/トレリスっぽい、例えば、こんな感じになります。

            [A-B]
        [A] [A-C]
            [A-D]

でも、次の段階で、
                  [A-B-E]
            [A-B] [A-B-F]
                  [A-B-G]
                  [A-C-E]
        [A] [A-C] [A-C-F]
                  [A-C-G]
                  [A-D-E]
            [A-D] [A-D-F]
                  [A-D-G]

となって行きます。こう進めていくと node がたくさんになってしまうので、
NODE_MAX_SIZE を越えると remove_min_node で node が削られます。
うわぁ。削られるのは現状の段階のものだけなので、最後の方では足しては削り
足しては削りとなるでしょう。

うーん。弱ったなぁ。元になっている feature_set も疑問であるとともに、実
装も大きく間違ってる。どうしたものでしょう。

冷静に理性的に考えれば feature_set を使わないものにするとしても、遷移確
率で Viterbi アルゴリズムを使うにしても、いずれにしろ動的計画法による選
択の実装を書き直しましょう、ということでしょう。ここはグッと耐えて、ま
ずは lattice.c をマシなものに書き直し、かなぁ。


[1] http://mat.gsia.cmu.edu/classes/dynamic/node3.html
-- 

_______________________________________________
Anthy-dev mailing list
Anthy-dev@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/anthy-dev

メールによる返信