2008年1月19日土曜日

Chapter 23 Practical: A Spam Filter

著者が配布しているソースは、asdfでパッケージ管理されている。
asdfの簡単なメモ。



ここにきて、ひとつ疑問。
CLのプログラムの起動方式ってどういう種類があるんだろう。ACLでは、例えばSLIMEで開発をして、"Application"としてまとめるようだ(含むランタイム)。ということは、日頃はSLIMEに住むということなのだな。

著者提供のソースを動かしてみる。

  • ソースDL。展開。
  • /.../systemsをasdf:*central-registry*に登録。
  • 全てのasdのシンボリックリンクを/.../systems/に作成。
  • REPLで、(asdf:operate 'asdf:load-op :spam)
  • うまくいったようだ。
  • REPLで、(in-package :com.gigamonkeys.spam)しておく。



前説

特になし。


The Heart of a Spam Filter

  • internって言葉、アプリ書くときにも、こんな風に使う感じなんだ。



Training the Filter

特になし。


Per-Word Statistics

メモ。この本この部分の説明はかなり雑というか、ヘタクソではないか。ちょっとイライラする。


  • 基本方針は次のとおり。メッセージを、それが含むfeaturesにしたがって分類する。そのとき、個別のfeatureについて、それを含むメッセージがspamである確率を算出し、それら全てを結合したものをそのメッセージのスコアとする。
  • では、あるfeatureを含むメッセージがspamである確率をどう計算するか。
  • 第一案:

    (defun spam-probability (feature)
    (with-slots (spam-count ham-count) feature
    (/ spam-count (+ spam-count ham-count))))

  • 問題あり。これだと、そのfeatureのspam-countとham-countだけに依存している。例えば、spam-countが1で、ham-countが9であっても、次の2つの状況によって、その確率は異なるべきだ。

    状況1
    *total-spams* 100
    *total-hams* 100

    状況2
    *total-spams* 10
    *total-hams* 1000

    spam-countについてくらべると、同じ1であっても、状況1よりも状況2の方がspamである確率は高いはず。また、ham-countでいえば、同じ9であっても状況1よりも状況2の方がhamである確率は低いはず。そこで、、
  • 第二案:

    (defun spam-probability (feature)
    (with-slots (spam-count ham-count) feature
    (let ((spam-frequency (/ spam-count (max 1 *total-spams*)))
    (ham-frequency (/ ham-count (max 1 *total-hams*))))
    (/ spam-frequency (+ spam-frequency ham-frequency)))))

  • 第二案ではfrequency(頻度)という形で総数の影響を組み入れた。
  • しかし、問題あり。2000メッセージを取り扱った結果、spamとhamが半々だったとする。あるfeatureはspam-count = 1000かつham-count = 0だったとする。別のfeatureは、spam-count = 1 かつ ham-count = 0だったとする。するとそれぞれのspam-probabilityは、どちらも1である。後者の方がspamである可能性は低くあるべきだ。そこで、これを補正する方法を考える。第三案ではなく補正。
  • 補正:

    (defun bayesian-spam-probability (feature &optional
    (assumed-probability 1/2)
    (weight 1))
    (let ((basic-probability (spam-probability feature))
    (data-points (+ (spam-count feature) (ham-count feature))))
    (/ (+ (* weight assumed-probability)
    (* data-points basic-probability))
    (+ weight data-points))))



Combining Probabilities
Inverse Chi Square

統計学のお話。読むだけ。


Training the Filter
Testing the Filter
A Couple of Utility Functions
Analyzing the Results
What's Next

特になし。

うーん。平日はほとんど進められなかった。。。

0 件のコメント: