Использование naive-bayes для обнаружения спама

Я внедряю наивный байесовский детектор спама, который представляет собой слова, и я не уверен, правильно ли я понимаю алгоритм.

Вот как я пытаюсь реализовать алгоритм:

В обучающем наборе я подсчитываю, как часто конкретное слово из текста присутствует в спам-тексте и как часто оно присутствует в не спам-тексте. Я также храню общее количество проверенных и не спаменных сообщений во время обучения.

Теперь, когда обучение закончено, предположим, что у меня есть новый текст T который я хочу классифицировать.

Сначала я предполагаю, что предыдущие вероятности для спама (S) и не спама (N):

P(S) = 0.5 
P(N) = 0.5

Теперь я проверяю каждое слово W который содержится в T

Прими слово W присутствовал 20 раз в спам-тексте и 2 раза в не спам-тексте. Общее количество проверенных спамов равно 50, а общее количество проверенных не спамов также равно 50, поэтому у меня есть задние вероятности:

P(W|S) = 20 / 50
P(W|N) = 2 / 50

Расчетные вероятности будут тогда

P(S|W) = P(W|S) * P(S) = 0.2
P(N|W) = P(W|N) * P(N) = 0.02

Исходя из этого алгоритм классифицирует текст как спам.

Что я с трудом понимаю, так это следующий случай:

Предположим, у нас есть слово W который присутствовал 0 раз в тексте спама, но 1 раз в тексте без спама. в этом случае апостериорная вероятность спама будет

P(W|S) = O / 50 = 0

и, следовательно, вся вероятность также будет равна 0.

Таким образом, это будет означать, что всякий раз, когда в тексте присутствует слово, которое никогда не было найдено в тексте спама, но было найдено в тексте, не являющемся спамом, алгоритм классифицирует текст как не спам, независимо от каких-либо других слов и предыдущей вероятности.

Это то, что смущает меня и заставляет думать, что я еще не правильно понял алгоритм.

1 ответ

Решение

Вы должны реализовать аддитивное сглаживание, чтобы учесть не словарные слова.

Это аддитивное сглаживание сделает вероятность того, что слово не принадлежит словарю P(W|S) > 0.

Это модифицированная формула для вероятности:

P(word|class) = sum ( I(word,D) + lambda) / |D_class| + lambda|V| ) on each document D belonging to all documents in the class.

где I(word,document) это индикаторная функция, которая возвращает 1 если документ содержит слово и 0 иначе.

lambda выбранная константа

|D_class| количество документов в классе

|V| количество слов в словаре или словаре

Другие вопросы по тегам