(0:17) 最近やっと高次 CRF(中華料理店フランチャイズじゃないほう)について考える時間ができている。
改めて考えてみると、昔はだいぶ考えが整理されていなかった。
まず、一次の CRF と違って、文頭・文末の特殊処理は必要ない。
一次の CRF ではエッジのような考え方をしているから文頭からのエッジ・文末までのエッジというのが自然に出てくるけど、高次の場合はそうではない。
(しかし、考えてみると一次の CRF でも文頭・文末の素性は観測素性に入れたらいいんじゃないだろうか?)
それと、素性テンプレートというのが本質的に必要だということ。
一次の CRF でも素性テンプレートというのはある(CRF++で使われている)けど、あれはどちらかというとユーザに使いやすくするためという感じで捉えていた。
CRFSuite には素性テンプレートがなく、自分で観測素性とラベルの列を用意する。
しかし、その場合でも考えてみると遷移素性については素性テンプレートと考えたほうがわかりやすい。
あと、計算のためのパターン列を生成するのは、トライを使わないでもできるはず。
列をソートしてイテレートするいつものやり方でやる。
(この「いつものやり方」だけど、実は名前を知らない)
このへんを整理して、Java あたりで書けば、だいぶわかりやすくなるはず。
修論のときに CRFSuite ベースで書いたやつは、頭が整理されていなかったこともあって、だいぶわけのわからないものになっている。
そもそも、ベースの CRFSuite が C(not C++)でクラスがないというのと、速度を重視しすぎて他人にはわからない書き方をしてしまったということもある。
Java で効率度外視のコードを書いてもオーダーが変わるわけじゃないんだから、とりあえずわかりやすさを重視して書こう。
それにしても、Java と C++ じゃ書きやすさが大違いだ。
Java は GC があるからオブジェクトのポインタを適当にあちこち持って行けるし、IDE の支援もレベルが違う。
C++ でスマートポイント使って循環参照をしないように気をつけたらいいんだけど、Java よりだいぶ面倒になる。
話は変わって、明日はぼくの父親が家に来る。
もう今日からこちらに来ていて、ホテルに泊まっている。
明日の朝、車で迎えに行く予定。