Расчет вероятности того, что токен является спамом в байесовском фильтре спама - PullRequest
8 голосов
/ 06 апреля 2009

Я недавно написал байесовский фильтр спама, я использовал статью Пола Грэма «План для спама» и реализацию его в C #, которую я нашел в codeproject в качестве ссылок для создания моего собственного фильтра.

Я только что заметил, что реализация в CodeProject использует общее количество уникальных токенов при расчете вероятности того, что токен является спамом (например, если в корпусе ветчины содержится всего 10000 токенов, но 1500 уникальных токенов, 1500 используется при вычислении вероятность как ngood), но в моей реализации я использовал количество постов, как упомянуто в статье Пола Грэма, это заставляет меня задуматься, какой из них должен быть лучше при расчете вероятности:

  1. Количество сообщений (как упомянуто в статье Пола Грэма)
  2. Общее количество уникальных токенов (как используется в реализации в codeproject)
  3. Общее количество токенов
  4. Общее количество включенных токенов (т. Е. Тех токенов с b + g> = 5)
  5. Общее количество уникальных включенных токенов

Ответы [ 4 ]

2 голосов
/ 16 апреля 2009

В этой статье EACL Карла-Михаэля Шнайдера (PDF) говорится, что для расчета вероятности следует использовать полиномиальную модель, то есть общее количество токенов, для расчета вероятности. Пожалуйста, смотрите документ для точных расчетов.

1 голос
/ 30 апреля 2009

В целом, большинство фильтров перешло алгоритмы, изложенные в статье Грэма. Мое предложение было бы получить источник 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.

0 голосов
/ 14 апреля 2009

вы можете взглянуть на PopFile, проверенную временем реализацию perl. Это очень хорошая работа. Я почти уверен, что это открытый исходный код, и вы могли видеть, какую формулу они используют.

0 голосов
/ 10 апреля 2009

Можете ли вы изменить свой код, чтобы использовать другие методы? Затем вы можете выполнить тестирование с другим набором данных и опубликовать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...