White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

今日の無駄な抵抗

先日のアルゴリズムがうまく行ってないので、紙に書いてシミュレートした。

例えば、以下の文があるとする。/の位置で単語が区切れるとする。

  1. 明日/は/いい/天気/でしょう
  2. 今日/は/いい/天気/です
  3. 昨日/は/悪い/天気

これを各文、各単語ごとに出現頻度を取る。さらに出現した文章の数も数える。
まず1を解析すると、次のような表になる。
表の中の数値は、一つの文の中に二つの単語が同時に存在していれば+1する(ただし同じ位置にある単語は当然カウントしない。同じ単語でも違う位置にあるならカウントする)。
今回だと全て一つの文章にあるので表の値は全て1になる。

(出現文数) 明日 いい 天気 でしょう
明日 1 0 1 1 1 1
1 1 0 1 1 1
いい 1 1 1 0 1 1
天気 1 1 1 1 0 1
でしょう 1 1 1 1 1 0

続けて2も解析する。"は""いい""天気"は既に存在するので、これらの組み合わせの数値は2になる。

(出現文数) 明日 いい 天気 でしょう 今日 です
明日 1 0 1 1 1 1 0 0
2 1 0 2 2 1 1 1
いい 2 1 2 0 2 1 1 1
天気 2 1 2 2 0 1 1 1
でしょう 1 1 1 1 1 0 0 0
今日 1 0 1 1 1 0 0 1
です 1 0 1 1 1 0 1 0

さらに3も解析してみる。この時点でデータ量が多くなってきた。

(出現文数) 明日 いい 天気 でしょう 今日 です 昨日 悪い
明日 1 0 1 1 1 1 0 0 0 0
3 1 0 2 3 1 1 1 1 1
いい 2 1 2 0 2 1 1 1 0 0
天気 3 1 3 2 0 1 1 1 1 1
でしょう 1 1 1 1 1 0 0 0 0 0
今日 1 0 1 1 1 0 0 1 0 0
です 1 0 1 1 1 0 1 0 0 0
昨日 1 0 1 0 1 0 0 0 0 1
悪い 1 0 1 0 1 0 0 0 1 0

んで、各項?の数値を出現文数で割る。

(出現文数) 明日 いい 天気 でしょう 今日 です 昨日 悪い
明日 1 0 1 1 1 1 0 0 0 0
3 0.33 0 0.67 1 0.33 0.33 0.33 0.33 0.33
いい 2 0.5 1 0 1 0.5 0.5 0.5 0 0
天気 3 0.33 1 0.67 0 0.33 0.33 0.33 0.33 0.33
でしょう 1 1 1 1 1 0 0 0 0 0
今日 1 0 1 1 1 0 0 1 0 0
です 1 0 1 1 1 0 1 0 0 0
昨日 1 0 1 0 1 0 0 0 0 1
悪い 1 0 1 0 1 0 0 0 1 0

この表は何を表してるかというと、ある単語Aがあったとき、どのくらいの割合で単語Bがあるかを表している。
例えば"は"という単語と"明日"では、"は"から見れば3分の1の確率で"明日"、"明日"から見れば10割の確率で"は"が存在していることが分かる。確率論でいうと、P("明日"|"は")=0.33,P("は"|"明日")=1って感じかな。

まあ細かい数値はともかくとして、ここで問題なのは「0かそうでないか」ってことで。
0なら今までに出てきたことのない単語の組み合わせだから注意しなければならない。そうでなければ学習した文章で単語の組み合わせが出てきている。
(続く?)