В целом, большинство фильтров перешло алгоритмы, изложенные в статье Грэма. Мое предложение было бы получить источник SpamBayes и прочитать комментарии, изложенные в spambayes / classifier.py (в частности) и spambayes / tokenizer.py (особенно в верхней части). Там много истории о проведенных ранних экспериментах, оценивающих подобные решения.
FWIW, в текущем коде SpamBayes вероятность вычисляется таким образом (spamcount и hamcount - это количество сообщений, в которых был замечен токен (любое количество раз), а nham и nspam - общее количество сообщений) :
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 равно (по умолчанию) 0,45, а unknown_word_prob равно (по умолчанию) 0,5.