スパムフィルタでよく使われてる、ベイジアンフィルタのことです。これを使って「おはよう」判定してみました。
1000speakersのときに「ベイズやらないんですか?」って言われたり、tockriの人が以前「やっぱベイズよくできとるわ」とか書いてたり、テキスト分類ならベイズでいいん違うかと思ってみたので、やってみました。
結果から言うと、なんか不安定というか、1文字の違いで「おはよう」判定してしまうことがあります。ちゃんと性能測ってみないとわかんないですけど。
考えられるのは、データが少ないことですが(「おはよう」が750件中39件)、それよりも、ついったの発言では「おはよう」発言の中に「おはよう」と関係ない言葉が入ることが多くて、それが悪影響あたえてるんじゃないかと思います。ナイーブベイズのアルゴリズムを考えると、データ中のノイズに弱い気がします。
「。」や「!」で文章を区切って学習・判定するといいかもしれません。これだとSVMの場合でも性能でそう。
比べてみて思ったのは、ベイズは実装が簡単だし大量データに強いということです。学習はデータ数をカウントするだけだし、判定は割り算して全部掛けるだけ。
決定論的に計算するので、ゆらぎがないし、ノイズがなければ強そう。
一方で、やっぱSVMは大量データには学習時間かかりまくるのだけど、データが少なくてもうまいこと特徴を抜き出してくれるな、と思いました。
ということで、ナイーブベイズ版のソース
こんな感じで「おはよう」の先頭に「m,」をつけて区別したデータを使います。このファイルをtwit.txtという名前でプログラムと同じフォルダに保存しておきます。
バスで駅に向かっている。
ただいま。
m,おはよ-
早く来い飯。
とりあえずシャワ-浴びるか。
だいじなメ-ルおくった。
m,うぐう、起きた。10時半から会社。
m,おはようございます。本を読んでたら寝てしまってました。
あとは、ソースはこんな感じ。GUIまわりは、NetBeansで生成したソースからコメントを抜いただけです。
続きを読む