Перейти к содержанию

Наивный Байес: как работает спам-фильтр

Коротко

Спам-фильтр не понимает смысл письма — он считает, какие слова чаще встречаются в спаме, и складывает улики. Каждое слово работает как маленькая подсказка: «акция» или «выигрыш» тянут письмо в спам, «договор» или имя коллеги — в обычную почту. Метод называют наивным, потому что он делает удобное упрощение: считает слова независимыми друг от друга. Несмотря на эту наивность, подход надёжно работает и десятилетиями применяется в защите от спама — от Яндекс Почты и Mail.ru до фильтрации комментариев в соцсетях.

В прошлом уроке — правиле Байеса — мы научились обновлять уверенность по мере поступления улик. Теперь применим эту идею к понятной задаче: как программа решает, бросить письмо в папку «Спам» или показать вам.

Письмо как набор слов-улик

Представьте, что фильтр не читает письмо как человек. Он разбирает текст на отдельные слова и смотрит на них как на признаки — простые наблюдаемые свойства объекта, по которым можно делать выводы. Для письма признаки — это слова: «скидка», «срочно», «перейдите», «коллеги», «счёт».

Это похоже на работу следователя. Один отпечаток ничего не доказывает, но десяток мелких улик вместе складываются в уверенную картину. Так и здесь: одно слово «акция» ещё не приговор — рассылка от вашего банка тоже может его содержать. Но если в коротком письме сошлись «акция», «выигрыш», «бесплатно» и «успейте», улики накапливаются, и вывод становится почти однозначным.

Программа, которая по таким признакам относит объект к одной из категорий (здесь — «спам» или «не спам»), называется классификатором. Спам-фильтр — это классификатор с двумя ответами, и наивный байесовский — один из самых известных его видов.

Как фильтр оценивает шансы на спам

Логика опирается на правило Байеса, но объяснить её можно без формул. У фильтра есть два вопроса к каждому слову:

  • Насколько часто это слово встречается в письмах, которые точно были спамом?
  • Насколько часто оно встречается в нормальной переписке?

Если слово «выигрыш» в спаме попадается заметно чаще, чем в обычных письмах, оно становится уликой в пользу спама. Если слово «договор» гораздо чаще встречается в деловой почте, оно тянет в обратную сторону.

Дальше фильтр собирает улики со всех слов письма и взвешивает их вместе. Получаются как бы две чаши весов: «похоже на спам» и «похоже на обычное письмо». Куда перевесит — туда письмо и отправится.

Важно

Фильтр не ищет одно «запретное слово». Решает не отдельная улика, а их сумма. Поэтому спамеры не могут обмануть систему, просто убрав слово «бесплатно»: остаются десятки других признаков, и баланс всё равно складывается не в их пользу.

Почему метод «наивный»

Здесь и прячется главное упрощение. Честно учесть, как слова в письме связаны между собой, очень сложно: «банк» и «карта» рядом значат не то же самое, что по отдельности. Наивный байесовский классификатор от этой сложности отказывается и делает наивное предположение независимости — допущение, что каждое слово влияет на ответ само по себе, словно остальных слов в письме нет.

Строго говоря, это неправда: язык полон связей. Но именно это «наивное» допущение позволяет считать вклад каждого слова отдельно и просто складывать улики, а не разбирать все возможные сочетания. Математика становится лёгкой, а программа — быстрой.

Удивительно, но упрощение почти не вредит делу. Для сортировки «спам / не спам» точные связи между словами не так важны — хватает того, что подозрительные слова в среднем тянут в нужную сторону. Это частый сюжет в ИИ: грубое, но удобное предположение работает на практике лучше, чем кажется.

Откуда фильтр знает вероятности: обучение на примерах

Сам по себе фильтр ничего не знает о словах. Все вероятности он берёт из опыта — из размеченных писем, где человек или система уже проставили ярлык «спам» либо «не спам».

Механика простая:

  1. Берём большую коллекцию писем с известными ответами.
  2. Считаем, как часто каждое слово встречается в спаме и как часто — в обычной почте.
  3. Эти подсчёты и становятся «уликовой ценностью» каждого слова.

Когда приходит новое письмо, фильтр уже знает «репутацию» слов и быстро взвешивает их. По сути, это обучение на примерах: показали много образцов с ответами — система вывела закономерности. Та же идея лежит в основе машинного обучения с учителем, к которому мы перейдём в следующей главе.

Важная деталь: когда вы нажимаете «Это спам» или «Не спам» в Яндекс Почте или Mail.ru, вы доразмечаете данные. Фильтр пересчитывает репутацию слов и со временем подстраивается под вашу переписку.

Пример: не только почта

Тот же подход работает шире писем. Соцсети и маркетплейсы — VK, Wildberries, Ozon — отсеивают нежелательные комментарии и накрученные отзывы похожей логикой: разбирают текст на слова-признаки и оценивают, насколько он напоминает уже известный спам. Поэтому шаблонные рекламные комментарии часто исчезают ещё до того, как их кто-то увидит.

Простой, но рабочий

У наивного Байеса нет глубокого «понимания» текста — и всё же он десятилетиями держится в строю. Причин несколько:

  • Скорость. Фильтр взвешивает письмо за доли секунды, что важно при миллионах писем в день.
  • Скромные требования. Метод обходится без мощных серверов и гигантских моделей.
  • Прозрачность. Видно, какие слова повлияли на решение, — такой фильтр легко проверить и поправить.
  • Достаточная точность. Для задачи «спам / не спам» сумма простых улик даёт уверенный ответ.

Это хорошая иллюстрация принципа из урока про неопределённость и шансы: не обязательно быть уверенным в каждой улике, чтобы уверенно решить целиком. Множество слабых подсказок, сложенных вместе, дают надёжный вывод.

Упражнение: взвесьте письмо вручную

Допустим, по опыту фильтра слова делятся так:

  • Тянут в спам: «выигрыш», «бесплатно», «успейте», «приз».
  • Тянут в обычную почту: «договор», «отчёт», «коллеги», «встреча».

Пришло короткое письмо: «Поздравляем! Ваш приз ждёт вас — успейте получить бесплатно».

Решите, спам это или нет, и объясните логику.

Разбор. Выпишем слова-улики: «приз», «успейте», «бесплатно» — все три из спам-списка. Слов из делового списка нет вообще. Складываем чаши весов: на стороне «спам» — три заметные улики, на стороне «обычное письмо» — ноль. Баланс резко смещён, поэтому фильтр уверенно пометит письмо как спам.

Обратите внимание на «наивность»: мы оценили каждое слово по отдельности и просто сложили подсказки, не задумываясь, как «приз» сочетается с «бесплатно». Именно так и работает наивный байесовский классификатор — и в этом примере упрощение приводит к верному ответу.

Проверьте себя

Короткий тест по уроку: выберите ответ и нажмите «Проверить» — увидите счёт и разбор.

Частые вопросы

Почему классификатор называют «наивным»?

Из-за упрощающего допущения: он считает слова письма независимыми друг от друга и оценивает каждое отдельно. В реальном языке слова связаны, поэтому предположение «наивное». Но оно сильно упрощает расчёты и на практике почти не вредит точности.

Может ли спам-фильтр ошибаться?

Да. Иногда обычное письмо попадает в спам (например, рассылка с акциями от знакомого магазина), а иногда спам проскакивает в почту. Поэтому существует папка «Спам», а не молчаливое удаление, и кнопки «Это спам / Не спам» — ваши пометки помогают фильтру переучиваться.

Чем наивный Байес отличается от нейросетей?

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

Фильтр действительно «читает» мои письма?

Нет, человек ваши письма не читает. Программа автоматически разбирает текст на слова и сравнивает их статистику с уже известными примерами спама. Это технический подсчёт, а не чтение, и в России подобная обработка регулируется законом о персональных данных (152-ФЗ).


В курсе: ← Назад: Правило Байеса простыми словами · Дальше: Виды машинного обучения: с учителем, без учителя, с подкреплением →

Авторы курса: Герман Коваленко (основатель ENGRAM) и Сергей Добров.

Попробуйте ENGRAM на своих данных

Нейросеть на ваших встречах, документах и переписке: отвечает со ссылкой на источник. Это ваша вторая память на базе ИИ. Данные хранятся в России, старт бесплатный.

Зарегистрироваться бесплатно
Обучаем команды работе с нейросетями под ваши процессы. Узнать о корпоративном обучении