Algoritmo de detección de spam en Thunderbird
noviembre 28th, 2005En 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