Yusuke TABATA
yusuk****@w5*****
2007年 2月 22日 (木) 00:51:22 JST
田畑です。 anthyで使うアルゴリズムは適宜変えているのですが、最近のanthyは 例文の中で「そこにそういうのが出る確率」ではなく、 「そこにそういうのを出したら正解(or誤変換)になる確率」を推定するように 切り替えています。 このやり方で精度を上げるための方向性は次のようなものを考えていて、 それぞれを簡単に説明してみます。(不勉強でいい加減なことを 書いてるかもしれませんがご容赦ください) (1) 例文を増やす (2) 「そこにそういうの」を適切にデータ化する (3) 確率を推定する方法を改善する (1) 例文のデータには変換前の文と正解を書いているので、変換前の文を入力して 変換結果が出てくるとそれが正解か誤変換か判断ができます。 変換結果の中に特徴 v を持ったものが何個か出てきた場合、 そのうち何個が正解で何個が誤変換だったという確率が計算できるので、 p=f(v)という形の関数が定義できます。 統計の精度を稼ぐために例文の数を増やすという方向の他に、ユーザの使う 日本語に近い例文を集める、誤変換をうまく潰せる例文を集めるという 方向性があります。 また、今のところ一つの文に対して誤変換は高々1個しか取り出さないのですが、 複数個、あるいは(CRFのように)全部を取り出すという手法が考えられます。 (2) (1)で変換結果の特徴と述べましたが、例えば単一の文節の特徴を 説明しようとすると、次のように色々なレベルで適当なものを 考えることができます。 * 「〜は」という形式である * その文節の自立語は名詞である * 文字数が3文字以上である * 「今日」という単語である * 日付である * 体言である * 滅多に使わない単語である これらの特徴は各文節に対し真/偽の2値を取り、文節の素性 (そせい、feature)と呼ばれます。 素性は文節だけでなく、単語あるいは複数の文節の組み合わせの 特徴などにも設定することができます。 この素性に番号を付けると、「ある変換結果は素性1,2,10,50を持つ」 というような形で変換結果を表現できます。番号のリストはbitのベクトル としても表現できるので状況によって両方の表現を使い分けます。 どんな素性を選択するかが重要で、(1)や(3)の状況によっても最適な 選択は異なってくると思います。 できることなら、色々な素性を入れておいて、自動的に選ぶような 仕組みが作れれば楽かなと検討しています。 (3) 今のanthyでは(2)で説明したようにvは0,1のベクトルとし、各vに対する p=f(v)の形で経験的確率をハードコードしてそのまま使っています。 ( anthy/src-splitter/transition.h および anthy/calctrans/* 参照 ) この方法のメリットとして、 * 動作がわかりやすい * パラメータを収束させる計算が要らない * 変換時の動作も比較的軽い デメリットとしては、素性を増やすとvの空間がスカスカになって、 既存の正解に似ているのに確率0(0にしています)が付くという問題があります。 これをなんとかする方法として、機械学習の類の手法を用いて * CRFやMEMMのようにエントロピー最大の分布を想定する * SVMやニューラルネットワークを使う といった手が考えられます 別の切り口としてはvの中から独立な成分を選んで分割して p = f(v) = f1(v1) * f2(v2)というような形にすることも考えられます。 -- -- CHAOS AND CHANCE! Yusuke TABATA