Algoritmo de detección de spam en Thunderbird

noviembre 28th, 2005

En la nota anterior A plan for spam explicaba el algoritmo genérico que propuso Paul Graham para la detección de spam y comentaba que el de Thunderbird es una implementación ligeramente modificada de este. Veamos entonces como funciona.

El algoritmo está implementado en el fichero mozillamailnewsextensionsbayesian-spam-filtersrcnsBayesianFilter.cpp concretamente en la función classifyMessage. Para hacerlo más sencillo de entender lo pasaré a pseudo-código y lo simplificaré. En primer lugar debemos ver cuales son las variables que utiliza:

  • mGoodCount: número de mensajes ham clasificados
  • mBadCount: número de mensajes spam clasificados
  • mGoodTokens: tabla de hash de tokens ham con el número de veces que han aparecido
  • mBadTokens: tabla de hash de tokens spam con el número de veces que han aparecido

Por defecto:

si (mGoodCount == 0 || mGoodTokens.count() == 0)
	suponemos que el mensaje es spam
si (mBadCount == 0 || mBadTokens.count() == 0)
	suponemos que el mensaje es ham

Seguidamente vemos el algoritmo principal (copiado del bugzilla):

para cada token {
	hamcount = numero de veces que el token aparece en mensajes ham
	spamcount = numero de veces que el token aparece en mensajes spam
	hamratio = hamcount / nGoodCount
	spamratio = spamcount / nBadCount

	prob = spamratio / (hamratio + spamratio)

	n = hamcount +  spamcount 
	prob = (0.225 + n * prob) / (.45 + n)

	distance = abs(prob - 0.5)
	if (distance > = .1) {
		token.distance = distance
		token.prob = prob
	}
}

Con esto calculamos y guardamos la probabilidad de cada token. Una vez calculadas las probabilidades, ordenamos este array por distancias (tomando como distancia la diferencia entre las probabilidades de cada token) y cogemos los 150 primeros elementos. Utilizando una distribución de probabilidad chi2, de la cual ahorraremos el código para una mayor brevedad.

Una vez calculada esta distribución de probabilidad debemos comparar el valor resultante con el límite que tenemos establecido que, por defecto, es 0.9. Si la probabilidad es mayor o igual que esta, el mensaje será clasificado como spam.

Guardado en Spam | Comentarios desactivados en Algoritmo de detección de spam en Thunderbird

Los comentarios están cerrados.