Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2010-11-24

TinySegmenter を賢くするアイデア

14:52

まだ構想段階。

こういうテキストがあって、

現在、日本語や英語などの形態素解析でもっとも有力とされるものは隠れマルコフモデル (HMM, Hidden Markov Model) による統計的な方法である。

MeCab と TinySegmenter で分かち書きすると、それぞれこんなふうになる。

現在 、 日本語 や 英語 など の 形態素 解析 で もっとも 有力 と さ れる もの は 隠れ マルコフ モデル ( HMM , Hidden Markov Model ) による 統計 的 な 方法 で ある 。
現在 、 日本語 や 英語 など の 形態 素解 析 でもっとも 有力 と さ れる もの は 隠れ マルコフモデル ( HMM ,  Hidden  Markov  Model ) による 統計 的 な 方法 で ある 。

だいたいあってる。しかし、3文字以上の漢字(特に奇数文字数)の羅列になると TinySegmenter はかなりしょぼい。いくつか上の文などから抜粋すると、

形態 素解 析
各単 語間
事実 上不 可能
両単 語
自然言 語処 理
計算言 語学
意味 論的 側面

などなど。

これらのマッチングを高めるために、パラメーターを修正すればいいんだけど、どうやればいいか。


ある文字列を TinySegmenter が処理するとき、i を増やしながら前から見ていって、i-3番目の文字を w1、i-2番目の文字を w2、i-1番目の文字を w3 などと割り振っていく。

ここでは「英語などの形態素解析でもっとも」の「素」の位置に i があると考える。

i _ _ i-3 i-2 i-1 i i+1 i+2 _
文字
w _ _ w1 w2 w3 w4 w5 w6 _

という具合。

そして、例えば w4 という文字を UW4 というスコア表で評価したり、w3+w4 を BW2 というスコア表で評価したり、w3+w4+w5 を TW3 というスコア表で評価して点数を加算していく。スコアの合計がプラスになると、i 番目の文字の直前に区切りが入るということ。

それを表したのが下の表。

i _ _ i-3 i-2 i-1 i i+1 i+2 _
文字
w _ _ w1 w2 w3 w4 w5 w6 _
UW1 _ _ w1 _ _ _ _ _ _
UW2 _ _ _ w2 _ _ _ _ _
UW3 _ _ _ _ w3 _ _ _ _
UW4 _ _ _ _ _ w4 _ _ _
UW5 _ _ _ _ _ _ w5 _ _
UW6 _ _ _ _ _ _ _ w6 _
BW1 _ _ _ w2 w3 _ _ _ _
BW2 _ _ _ _ w3 w4 _ _ _
BW3 _ _ _ _ _ w4 w5 _ _
TW1 _ _ w1 w2 w3 _ _ _ _
TW2 _ _ _ w2 w3 w4 _ _ _
TW3 _ _ _ _ w3 w4 w5 _ _
TW3 _ _ _ _ _ w4 w5 w6 _

例えば「i 番目の文字とその前2つの3文字が「形態素」になっていたら、そこに区切りがある確率は低い」という条件を追加するには、TW2["形態素"] を小さく(マイナスに大きく)すればいい。もしくは、「「素」と「解」の間に区切りがある確率は低い」だったら BW3["素解"] を小さくすればいい。逆に、区切りがあるはずなのに無いところは、対応するスコアを大きくしてやればいい。


これを元にして MeCab と比較しながら、TW2 などのスコアを調節していけばいいというわけ。

ただ、一つのパラメーターを弄ると色んなバランスが崩れてしまう可能性があるため、好き勝手に足したり引いたりしてると困るかもしれない。


ここからは妄想の域を出ないけど、たぶん遺伝的アルゴリズムを使えば簡単にパラメーター調節できる気がする。

  1. ある程度巨大な文書を用意して、一度 TinySegmenter と MeCab で分かち書きしてみて、それを比べる。
  2. 「区切りがあるはずなのに無いところ」と「区切りが無いはずなのにあるところ」を見て、それぞれについて「どのパラメーターがいくつだったらそこでちゃんと区切れるか」をすべての可能性について計算する。
    • 例えばさっきの場合だと、「TW2["形態素"] を〇〇以上に」とか「BW2["素解"] を〇〇以下に」とか。
  3. これらの新しいパラメーターを使って、同じテキストを分かち書きしてみる。
  4. 得点が高くなったものは切り捨てて、残りを「交叉」させる。
  5. 2へ戻って繰り返す。

という感じ。これを繰り返すと、たぶん TW2 とかのキーがどんどん増えていくことになるけど、これは「キーの数が少ないほど良い」ということにして切り捨てていけばいいはず。B-tree の lookup が O(log n) だそうなので、2乗のキー数があれば2倍効率が悪い。逆に言うと、ちょっとぐらいキーが増えてもほとんど影響ないはず。


気が向いたらやってみます。


ところで、TinySegmenter 0.1 のパラメーターセットだと、「。」とその次の文字との間に区切りが入らなかったりする。これは UC3 のテーブルに "O":6646 というのを追加すれば直る。また、数字が全部区切られてしまうので、BC2 の表に "NN":-3267 というのを追加すれば直る。

ただしこれらの数字が適切かどうかは知らない。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20101124
 |