いつもながら仕事が速い、速すぎます…。
というわけで、2009X21 版を落としてきて改めてやり直し。
新用例辞書の ucdict についてはもうちょっといじってから明日書きたいと思いますが、ちょっと気づいた点。
多分
コーパスから自動生成した用例辞書の加点数を、単語の辞書の頻度値の 100相当になるように大幅に下げた。の影響だと思いますが、変換の傾向が結構変わった。さっき入れ直したばかりで、まだあまり使ってないのでアレですが、以前は文節を短く切ろうとする傾向が強かった(原作からの傾向)のが、長い文節をかなり許容するようになった気がする。ただ、やや緩すぎる(長い文節を許容しすぎる)感じがする。CANDIDATE_SCORE_CORPUS_UDICT というのを調節してみればいいんだろうか?
と思って、「307200」にしてみたが、うーん、微妙。「204800」のままでいいかも。
もうちょっといじってみよう。
【関連する記事】
CANDIDATE_SCORE_UCDIC_RATIO と CANDIDATE_SCORE_CORPUS_UDICT は、候補の並び順を決める時にしか使っていないので文節区切りには影響しません。
文節区切りの傾向が変わったとすると……、考えられるのは、2009X19版にて、連文節の接続情報がコーパスに該当が有る場合と無い場合の、確率の開きを小さくしてみた辺りだと思われます。
そのパラメータを環境設定で変更するオプションは作っていなかったので、2009X22版にて追加しました。CANDIDATE_STRUCT_PROB_WITHOUT_CORPUS と CANDIDATE_STRUCT_PROB_DEFAULT で指定します。
これまでは 0.10 が指定されていて、開きが約10倍になっています。2009X19版以降では 0.50 で約2倍に抑えてみました。開きを大きくするとコーパス重視になり、小さくするとコーパス軽視になります。
ややこしい作業に詳細な説明、いつもながら頭が下がります。
> CANDIDATE_SCORE_UCDIC_RATIO と CANDIDATE_SCORE_CORPUS_UDICT は、候補の並び順を決める時にしか使っていないので文節区切りには影響しません。
ありゃ、そうでしたか。
http://www.fenix.ne.jp/~G-HAL/whatsnew/20094th.html#2009X13
を読むと、2. で文節を区切って、3. で各文節毎の候補の並び順を決める、とちゃんと書いてありますね。
上記のパラメータは 3. に関わるもので、既に文節は区切られたあと、ということですか。
勝手に、
・先頭候補の選定と文節区切りは相即不離で切り離せないだろう
・従って、辞書中の頻度を変えると文節の区切り方も変わるだろう
と思い込んでいました。
例えば、「|風呂に|入る|」となってる時に、「居る」の頻度を大きく上げる(もしくは「入る」の頻度を大きく下げる)とかして、「はいる」という文節のスコアより「いる」という文節のスコアの方が大きくなれば、「|風呂には|居る|」になるんじゃないか、と。尤も、ビタビになってからの anthy では辞書の頻度をいじっただけではそうならないので、以前「辞書をいじっても anthy は賢くならない」と言ったわけですが、CANDIDATE_SCORE_CORPUS_UDICT ならあるいは…と思った次第です。
# ビタビで文節を区切る時って、どうやって区切るんだろう? 辞書は使わないんだろうか? 読みと品詞コードの部分だけ使う?
2009X22 版、早速使わせて頂きます。
(1) 単語辞書(略)から、入力された内容に一致する物を全て探し出す。
(2) (略)文節を区切る。
(3) 各文節毎に、候補の出自(略)連文節学習(略)コーパスの確率情報と辞書の頻度値を使って、各文節毎の候補の並び順を決める。
(4) 用例辞書を使って、各文節毎の候補の並び順を変更する(略)
(5) 連文節学習以外の学習を適用して、各文節毎の候補の並び順を変更する(略)
文節の区切り位置は、(2) で決まり、それ以降は変更されません。
辞書の頻度値は (3) だけで使われています。
CANDIDATE_SCORE_UCDIC_RATIO と CANDIDATE_SCORE_CORPUS_UDICT は (4) だけで使います。
それから。
ビタビでの文節区切りは、コーパスから得た連文節の各品詞等の接続する確率(trans_info)と、文節の文字数から得た確率(ポワソン分布らしい)の、2つの確率だけを使って決めています。
例えば「ふろにはいる」が入力された時の『|ふろ("名詞+格助詞")に("格助")|はい("動詞+終端")る("終端")|』の評価(確率)は、
trans_infoから確率を得る("名詞+格助詞","文頭"+"名詞+格助詞","格助",hash("に"),mw_features(),core_wt()) × ポワソン分布(3文字)
× trans_infoから確率を得る("動詞+終端","名詞+格助詞"+"動詞+終端","終端",hash("る"),mw_features(),core_wt()) × ポワソン分布(2文字)
の様な感じで決まります。
辞書上での頻度値や、変換結果にどの漢字が当てられるのかは、関係しません。
品詞が違うパターンとか区切り位置が違うパターンとかでも同様に計算し、最も確率が高かった文節区切りの位置を採用します。
大分イメージが掴めてきました。