Использование 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|
количество слов в словаре или словаре