改めて2次多項式カーネルであいさつbotをやってみる

ヒューガルデンホワイトのボトルとグラ

こうですね。わかります。

double kernel(Map<String, Double> x1, Map<String, Double> x2){
    double n = 0;
    for(Map.Entry<String, Double> ent : x1.entrySet()){
        if(!x2.containsKey(ent.getKey())) continue;
        n += ent.getValue() * x2.get(ent.getKey());
    }
    return (n + 1) * (n + 1);
}


ということで、2次多項式カーネルにするには、1足して2乗するだけということなのでやってみました。結果ですが、なんかよくなってるような気もするけど、よくわかりません。。。
やっぱ、ちゃんと交差検証で性能試せるようにしないと。

ナイーブベイズ分類器であいさつbot作ってみた

スパムフィルタでよく使われてる、ベイジアンフィルタのことです。これを使って「おはよう」判定してみました。
1000speakersのときに「ベイズやらないんですか?」って言われたり、tockriの人が以前「やっぱベイズよくできとるわ」とか書いてたり、テキスト分類ならベイズでいいん違うかと思ってみたので、やってみました。


結果から言うと、なんか不安定というか、1文字の違いで「おはよう」判定してしまうことがあります。ちゃんと性能測ってみないとわかんないですけど。
考えられるのは、データが少ないことですが(「おはよう」が750件中39件)、それよりも、ついったの発言では「おはよう」発言の中に「おはよう」と関係ない言葉が入ることが多くて、それが悪影響あたえてるんじゃないかと思います。ナイーブベイズアルゴリズムを考えると、データ中のノイズに弱い気がします。
「。」や「!」で文章を区切って学習・判定するといいかもしれません。これだとSVMの場合でも性能でそう。


比べてみて思ったのは、ベイズは実装が簡単だし大量データに強いということです。学習はデータ数をカウントするだけだし、判定は割り算して全部掛けるだけ。
決定論的に計算するので、ゆらぎがないし、ノイズがなければ強そう。
一方で、やっぱSVMは大量データには学習時間かかりまくるのだけど、データが少なくてもうまいこと特徴を抜き出してくれるな、と思いました。


ということで、ナイーブベイズ版のソース
こんな感じで「おはよう」の先頭に「m,」をつけて区別したデータを使います。このファイルをtwit.txtという名前でプログラムと同じフォルダに保存しておきます。

バスで駅に向かっている。
ただいま。
m,おはよ-
早く来い飯。
とりあえずシャワ-浴びるか。
だいじなメ-ルおくった。
m,うぐう、起きた。10時半から会社。
m,おはようございます。本を読んでたら寝てしまってました。


あとは、ソースはこんな感じ。GUIまわりは、NetBeansで生成したソースからコメントを抜いただけです。

続きを読む