Use the functions to build a dictionary of words and their statistical
distribution in spam and non-spam mails. Then use a function to determine
whether a buffer contains spam or not."
+ :version "21.4"
:group 'gnus)
(defcustom spam-stat-file "~/.spam-stat.el"
"Name of the `spam-stat-buffer'.")
(defvar spam-stat-coding-system
- (if (coding-system-p 'emacs-mule) 'emacs-mule 'raw-text)
+ (if (mm-coding-system-p 'emacs-mule) 'emacs-mule 'raw-text)
"Coding system used for `spam-stat-file'.")
;; Hooking into Gnus
(lambda (word count)
(let ((entry (gethash word spam-stat)))
(if (not entry)
- (error "This buffer has unknown words in it")
+ (gnus-message 8 "This buffer has unknown words in it")
(spam-stat-set-good entry (- (spam-stat-good entry) count))
(spam-stat-set-bad entry (+ (spam-stat-bad entry) count))
(spam-stat-set-score entry (spam-stat-compute-score entry))
(lambda (word count)
(let ((entry (gethash word spam-stat)))
(if (not entry)
- (error "This buffer has unknown words in it")
+ (gnus-message 8 "This buffer has unknown words in it")
(spam-stat-set-good entry (+ (spam-stat-good entry) count))
(spam-stat-set-bad entry (- (spam-stat-bad entry) count))
(spam-stat-set-score entry (spam-stat-compute-score entry))
;; Saving and Loading
(defun spam-stat-save (&optional force)
- "Save the `spam-stat' hash table as Lisp file.
+ "Save the `spam-stat' hash table as lisp file.
With a prefix argument save unconditionally."
(interactive "P")
(when (or force spam-stat-dirty)
(defun spam-stat-score-buffer ()
"Return a score describing the spam-probability for this buffer."
(setq spam-stat-score-data (spam-stat-buffer-words-with-scores))
- (let* ((probs (mapcar (lambda (e) (cadr e)) spam-stat-score-data))
+ (let* ((probs (mapcar 'cadr spam-stat-score-data))
(prod (apply #'* probs)))
(/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x))
probs))))))
(remove-hook 'gnus-select-article-hook
'spam-stat-store-gnus-article-buffer))
+(add-hook 'spam-stat-unload-hook 'spam-stat-unload-hook)
+
(provide 'spam-stat)
;;; spam-stat.el ends here