2009-04-06 8 views
8

Hace poco escribí un filtro de spam bayesiano, utilicé Paul Graham's article Plan for Spam y an implementation of it in C# I found on codeproject como referencias para crear mi propio filtro.Cálculo de la probabilidad de que un token sea correo no deseado en un filtro de spam bayesiano

Acabo de notar que la implementación en CodeProject usa el número total de tokens únicos para calcular la probabilidad de que un token sea correo no deseado (por ejemplo, si el corpus contiene 10000 tokens en total pero 1500 tokens únicos, el 1500 se usa para calcular la probabilidad de que Ngood), pero en mi aplicación que utiliza el número de puestos como se menciona en el artículo de Paul Graham, esto hace que me pregunte lo que uno de ellos debe ser mejor en el cálculo de la probabilidad:

  1. post count (como se mencionó en el artículo de Paul Graham)
  2. Número total de tokens únicos (como se usa en la implementación en el proyecto de código)
  3. contador de recuento total
  4. total incluyó recuento de fichas (es decir. esas fichas con b + g> = 5)
  5. total singular incluyen el recuento símbolo

Respuesta

0

Se puede alterar el código para utilizar los otros métodos? Luego podría probar con un conjunto de datos diferente y publicar los resultados.

+0

En realidad, yo no tienen una suficiente corpus grande del jamón y correo no deseado, así que es un poco difícil de prueba sin que esto .. estoy usando # 3 por ahora, ya que parece tener algún sentido para mí (que también hace que sea más fácil actualizar el corpus que utilizar el recuento de publicaciones) –

+1

Probablemente no necesite un gran corpus para entrenar su filtro. Visite http://entrian.com/sbwiki/ TrainingIdeas para obtener un buen resumen de lo que los desarrolladores de SpamBayes han comprobado que es efectivo. – ScottS

0

es posible que desee ver en POPFile, un tiempo a prueba la aplicación Perl. Hace un muy buen trabajo. Estoy bastante seguro de que es de código abierto y se puede ver qué fórmula utilizan.

2

This EACL paper by Karl-Michael Schneider(PDF) dice que se debe utilizar el modelo multinomial, es decir, el recuento total de testigo, para el cálculo de la probabilidad. Por favor, consulte el documento para los cálculos exactos.

1

En general, la mayoría de los filtros se han movido más allá de los algoritmos descritos en el artículo de Graham. Mi sugerencia sería obtener el origen de SpamBayes y leer los comentarios descritos en spambayes/clasificador.py (particularmente) y spambayes/tokenizer.py (especialmente en la parte superior). Hay mucha historia allí sobre los primeros experimentos que se hicieron, evaluando decisiones como esta.

FWIW, en el código actual de SpamBayes, la probabilidad se calcula de este modo (spamcount y hamcount son el número de mensajes en los que se ha visto el token (número de veces), y nham y nspam son el número total de mensajes):

hamratio = hamcount/nham 
spamratio = spamcount/nspam 
prob = spamratio/(hamratio + spamratio) 
S = options["Classifier", "unknown_word_strength"] 
StimesX = S * options["Classifier", "unknown_word_prob"] 
n = hamcount + spamcount 
prob = (StimesX + n * prob)/(S + n) 

unknown_word_strength es (por defecto) 0,45, y unknown_word_prob es (por defecto) 0.5.

+0

Muchas gracias por su respuesta, voy a comprobar esto. Actualmente estoy usando el recuento de tokens total, ya que es más práctico que usar el recuento de publicaciones/mensajes, más específicamente, es más práctico en el sentido de que no es necesario mantener un contador separado para el recuento de mensajes/mensajes, esto es esp. útil en mi caso, ya que guardo las estadísticas del cadáver en un archivo (es decir, las fichas y las veces que fueron repetidas en el cadáver) para no tener que escanear todas las publicaciones cada vez que el cadáver debe actualizarse (las publicaciones podrían ser demasiado para escanear al mismo tiempo). –

+0

Así que, guardo las estadísticas en un archivo y las actualizo 'incrementalmente', esto puede desordenarse fácilmente si se utiliza el recuento de publicaciones (podría no sincronizarse con las publicaciones realmente escaneadas, por ejemplo, en caso de error) –

Cuestiones relacionadas