dspam envenenado
Introducción
Tras un periodo de uso de uno de mis programas (no suficientemente probado) he llegado a envenenar por completo mi base de datos de Spam, de tal manera que a día de hoy ya no reconoce prácticamente nada como spam y tengo un buzón de entrada que da gusto verlo ;-)
La solución propuesta en la documentación de dspam es bastante clara; el filtro se debe educar de manera equilibrada entre spam y ham porque en caso contrario los resultados son tendenciosos. Como última instancia sugieren que se borre la base de datos y se reeduque el filtro con material fresco, y eso es lo que me temo que voy a tener que hacer, puesto que un vistazo a mis estadísticas muestran
# dspam_stats -H victor
victor:
TP True Positives: 0
TN True Negatives: 3880
FP False Positives: 15046
FN False Negatives: 1769
SC Spam Corpusfed: 192
NC Nonspam Corpusfed: 0
TL Training Left: 0
SHR Spam Hit Rate 0.00%
HSR Ham Strike Rate: 79.50%
OCA Overall Accuracy: 18.75%
que ahora mismo el filtro tiene muy poca fiabilidad. Por cierto, para entender mejor la salida del programa dspam_stats
he escrito algunas notas sobre ello.
Preparando un corpus
Existe una utilidad llamada dspam_train
que utiliza un par de buzones de
tipo maildir para entrenar el filtro. Como a primera vista me parece
cómodo voy a crear dos carpetas en mi buzón llamadas CorpusHam
y
CorpusSpam
, y voy a copiar en ellas un buen número de mensajes en español e
inglés, intentando ser lo más ecuánime posible.
Eliminando la base de datos
Ahora, por las bravas, voy a eliminar mi base de datos de spam para empezar de nuevo:
# cd /var/spool/dspam
# cd data/local
# rm -rf victor
Eso sí, el servicio de correo ha sido detenido para no chocar con él en el siguiente paso.
Educando al filtro
# cd /home/victor
# dspam_train victor Maildir/.Spam.CorpusSpam/cur Maildir/.Spam.CorpusHam/cur
Taking Snapshot...
victor TP: 39 TN: 47 FP: 0 FN: 8 SC: 0 NC: 0
Training Maildir/.Spam.CorpusHam/cur/ / Maildir/.Spam.CorpusSpam/cur corpora...
[test: nonspam] 1184314160.P22358Q22M860661.daga result: PASS
[test: spam ] 1184314064.P19928Q33.daga.taquio result: PASS
...
...
...
[test: nonspam] 1184314160.P22358Q3M402099.daga. result: PASS
[test: spam ] 1184314064.P19928Q31.daga.taquio result: PASS
TRAINING COMPLETE
Training Snapshot:
victor TP: 695 TN: 513 FP: 0 FN: 4 SC: 0 NC: 0
SHR: 99.43% HSR: 0.00% OCA: 99.67%
Overall Statistics:
victor TP: 734 TN: 560 FP: 0 FN: 12 SC: 0 NC: 0
SHR: 98.39% HSR: 0.00% OCA: 99.08%
#
y ahora le echamos un vistazo a las estadísticas del usuario
# dspam_stats -H victor
victor:
TP True Positives: 734
TN True Negatives: 560
FP False Positives: 0
FN False Negatives: 12
SC Spam Corpusfed: 0
NC Nonspam Corpusfed: 0
TL Training Left: 1940
SHR Spam Hit Rate 98.39%
HSR Ham Strike Rate: 0.00%
OCA Overall Accuracy: 99.08%
y vamos a comprobar si con algunos mensajes que conocemos el filtro tiene aciertos o no, aunque sabemos que es muy pronto para ello, el número de mensajes tiene que superar la cifra de 2500.
$ dspam --stdout --classify < ruta_al_mensaje_de_spam
X-DSPAM-Result: victor; result="Spam"; class="Spam"; probability=1.0000; confidence=0.68; signature=46972193199353588779037
Lo que viene a decirnos que sí, que está funcionando por el momento. Veremos qué ocurre después, cuando llegue el correo real.