Байесовское решение проблемы спама

Даже не ожидал, что Алексей ВИНОГРАДОВ, автор плагина BayesIt, окажется таким словоохотливым собеседником. В интервью Алексей не только с удовольствием ответил на ряд вопросов, касающихся своей разработки, но и рассказал о себе.


Алексей ВИНОГРАДОВ, 25 лет. Холост, живу в Южно-Сахалинске, работаю в газете верстальщиком. 10 лет назад приехал в Новосибирск, в Летнюю школу ("Специализированный Учебно-Научный Центр при НГУ"), также известную как Физико-математическая школа (ФМШ). Закончив ФМШ, поступил на физический факультет Новосибирского государственного университета. Вообще, многие выпускники ФМШ страдают так называемым "фымышатским синдромом" - поскольку образовательная программа в ФМШ очень насыщенная и фактически включает в себя некоторую часть университетской, то зачастую многие выпускники, поступая в университет, поначалу расслабляются, видя, что многое из нового материала они уже знают. А потом, когда становится действительно сложно, уже не успевают вновь напрячься. У меня, увы, это случилось уже на третьем курсе - "вылетел" зимой 1997 года. Но уже через полгода подал заявление для поступления в Лютеранскую богословскую семинарию, и, таким образом, резко "сменил специализацию".


- Алексей, по какому принципу работает созданный Вами антиспамовый плагин BayesIt?

- В общем случае принцип байесовской фильтрации хорошо известен - он описан в статье Пауля Грэхема "A plan for Spam" (www.paulgraham.com/spam.html). Сначала по заранее собранной и классифицированной базе писем создается вероятностный словарь - для каждого слова вычисляется, с какой вероятностью оно встречается в "хорошей" и "плохой" почте. Затем вступает в силу то, из-за чего метод называется байесовским - на основании собранной статистики можно с определенной вероятностью предсказать, в каком письме - "хорошем" или "плохом" - в следующий раз встретится то или иное слово. Именно так и работает фильтр: каждое вновь поступившее письмо разбивается на слова, и, пользуясь накопленной статистикой, фильтр делает предположение о том, является ли оно спамом.

Если в случае фильтрации по ключевым словам пользователю приходится внимательно изучать спам, чтобы "объяснить" фильтру, как его следует отфильтровывать, то в методе Байеса наоборот - пользователь сообщает фильтру, что является спамом, а фильтр уже сам решает, чем он отличается от нормальной почты и как его лучше поймать.

 

- Что послужило толчком к написанию плагина? Знаменитая статья Грэхема?

- В феврале 2003 года, следя за выходом новых бета-версий The Bat!, я обнаружил появление возможности подключения пользовательских плагинов и написал письмо разработчикам с просьбой объяснить, что это такое. В ответ меня перенаправили на список рассылки для разработчиков плагинов, и я загорелся. Довольно быстро пришел к выводу, что "традиционные" способы фильтрации нежелательной почты слишком твердолобы и страдают из-за своей излишней точности.

Затем в рассылке разработчиков появилось письмо, обсуждающее уместность введения в Бате кнопок, позволяющих классифицировать письма для байесовского метода фильтрации. Меня заинтересовал этот термин, и, спустя буквально несколько минут, я уже нашел в интернете статью Пауля Грэхема - не побоюсь назвать его родоначальником байесовских почтовых фильтров. На тот момент статье было около полугода, а, значит, метод был очень "свежим".

Первый рабочий вариант фильтра писался довольно долго - нужно было прочитать много документации и написать большое количество вспомогательного кода. Это был незаконченный продукт - небольшой набор утилит, своего рода "конструктор", позволяющий собрать нужную информацию и заставить ее работать. К тому времени у меня уже накопилось достаточно "плохой" почты, чтобы можно было собрать какую-то статистику, и где-то в конце марта 2003 года первое письмо было отфильтровано. Это уже был прорыв от теории к практике. В течение нескольких недель мое отношение к "плохой" почте в корне изменилось - она воспринималась уже не раздраженно, а с любопытством: осилит фильтр очередную порцию или нет.

Очень любопытно бывает просматривать журнал фильтра для наиболее "навороченных" спамерских произведений: люди так старались, и какие-то несколько случайных слов в письме их компрометировали перед фильтром :).

- Известны ли Вам другие продукты, в которых реализован байесовский метод фильтрации? Или BayesIt - уникальный в своем роде продукт?

- Сейчас метод Байеса стали использовать многие почтовые фильтры. В основном, пишут их под впечатлением от статьи Грэхема. Обычно программисты просто "копируют" упомянутую статью в своем коде, добавляя собственные нововведения и предположения. На сайте "крестного отца" байесовского метода приведено достаточно много ссылок на уже существующие решения - как правило, написанные для серверной фильтрации на Python или других скриптовых языках высокого уровня. Я же пытался создать вариант изначально для себя, а впоследствии - для абстрактного "конечного пользователя", минимизировав все возможные издержки.

Что касается других отличий от подобных программ, то, как я уже упомянул, изначально разрабатывалась именно пользовательская, а не серверная реализация. У обычного пользователя поток писем довольно небольшой, и оплата за интернет повременная. Поэтому я ввел в оригинальный байесовский метод некоторые оригинальные идеи, направленные на ускорение начального накопления оценочной статистики и повышение эффективности BayesIt.

Вдобавок я писал фильтр, ориентируясь именно на русскоязычного (или, в общем, "локальноязычного") пользователя. Поэтому в фильтре присутствует, например, расшифровка частично транслитерированных слов, в которых некоторые русские буквы заменены на похожие латинские. Такая "унификация" позволяет существенно сократить размер оценочной базы и количество необходимых для этого "плохих" писем. Из известных мне реализаций этого нет больше нигде. Затем фильтр различает текст письма и его технические заголовки. Благодаря этому становится очень просто реализовать фильтрацию через "выборочное скачивание" и, таким образом, "убивать" плохие письма прямо на сервере.

Наконец, основной подход: я умышленно не использую публичных "черных списков" или каких-либо методов, требующих либо взаимодействия с пользователем, либо дополнительных ресурсов (таких, как выход в интернет и пр.). Мысль такова, что раз пользователь может сам с первого взгляда отфильтровать почту, поскольку он оценивает содержание, а не исследует в интернете всевозможные "черные списки", - значит, и фильтр должен работать так же: то есть, как можно меньше беспокоить пользователя своими требованиями. Опять же, фильтр реализован как плагин к почтовому клиенту, а значит, нет никаких резидентных программ, которые нужно специально запускать перед получением почты, нет никаких промежуточных "виртуальных" серверов, которые пропускают через себя весь трафик - все интегрируется непосредственно в почтовую программу и работает прозрачно для пользователя.

- На чем писался плагин?

- В компьютерной области я довольно консервативен - не люблю никаких необдуманных нововведений и пользуюсь лишь теми программами, которые мне действительно постоянно нужны, стараясь не ставить, что попало, просто "чтобы посмотреть". Поэтому сразу ограничил число необходимых для работы компонентов и отказался от скриптовых языков. Выбор пал на C++ из-за его гибкости и высокой эффективности кода. Я пытался использовать лишь то, что действительно нужно, и всякий раз взвешивал все "за" и "против" перед тем, как принять решение в пользу использования еще одной библиотеки или компонента. Поэтому удалось избежать чрезмерного "раздувания" кода и системных требований: фильтр полностью функционален на всех системах, начиная с Windows 98 (на Windows 95, увы, не проверял) и за счет оптимизации кода без проблем работает даже на относительно медленных, по современным меркам, процессорах (первая версия писалась на Pentium-200, и модуль с тех пор не менялся). Естественно, нет предела оптимизации: сейчас я реализую "бедный" режим работы, который позволит нормально функционировать при ограниченной оперативной памяти.

- Раз уж Вы затронули тему новшеств, хотелось бы узнать, чем порадуете пользователей своего продукта в ближайшем будущем?

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

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

- Интересно, насколько BayesIt популярен сейчас и в каких странах используют данный фильтр?

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

Что же касается динамики скачивания, то за последнее время произошел буквально "взрыв". Страничка фильтра - один из разделов моей собственной "домашней" странички. Я делал ее для себя и для друзей - и посещаемость редко была больше 100 человек в месяц, но сейчас страничку посещают 1000 человек в день.

Сейчас количество писем от зарубежных пользователей составляет примерно треть от общего потока писем по тематике фильтра. Наверное, такой "интернационализации" способствует то, что базовый интерфейс фильтра - англоязычный.

- При такой плотной работе с пользователями остается ли у Вас время для поддержки и дальнейшего развития BayesIt?

- Да, есть и побочные эффекты такой популярности. Если раньше в свободное время я занимался разработкой фильтра, то теперь бОльшая часть этого времени уходит на переписку с пользователями. И эта тенденция мне уже не очень нравится. Однако, что поделать... Именно эти издержки и вынуждают думать о создании коммерческого варианта фильтра.

- Происходили ли курьезные случаи при использовании BayesIt?

- В основном, нет. Некоторые досадные и в то же время по-своему курьезные ситуации все же случаются. Когда у меня было сравнительно мало англоязычной корреспонденции, и я временно дал попользоваться своим адресом одному иностранцу, гостившему у нас. А поскольку спама на английском языке (вроде "Enlarge your...") было предостаточно, то фильтр автоматически отправлял такие письма, приходящие для гостя, в папку "Junk mail". Не пришлось даже создавать для него отдельную почтовую папку.

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

- Алексей, для версии BayesIt 0.3a Вы составили базу спама, на основании которой можно было быстро обучить программу. Планируете ли продолжить выпуск аналогичных баз для новых версий фильтра?

- Выпуск "базы спама" - понятие относительное и субъективное. Любой пользователь, имеющий достаточное количество спама, может опубликовать свой "спамовый" частотный словарь. Фактически мой "выпуск" был именно таким. Я, опять же, не в большом восторге от публикации подобных баз, поскольку понятие "спам" каждый определяет для себя сам, и база, собранная другим человеком, обучена именно на те письма, которые этот человек считает для себя нежелательными, то у пользователей с иными критериями "нежелательности" чужая база может наделать много ошибок. Например, у меня в базу спама входят данные о некоторых зарубежных рассылках, от которых мне просто лень было вовремя отписаться. А представляете, если этой базой воспользуется человек, который желает получать именно эти рассылки? Кстати, на сайте Пауля Грэхема есть довольно большая "свалка" спама, где каждый может скачать необходимое количество писем. Но здесь, опять же, вмешивается география: вряд ли русскоязычному пользователю сильно поможет база по иноязычному спаму.

Но, тем не менее, я набрался-таки мужества и отцедил в отдельную папку больше трех тысяч спамовских писем - и создал по ним публичный частотный словарь в формате 0.4xx, который уже выложил на сайт (klirik.narod.ru/arc/spamdict.rar). Так что пользуйтесь на здоровье!

- Спасибо, Алексей, за интервью и успехов Вам в развитии BayesIt!

Беседовал Павел БАДЯЛИК

Версия для печатиВерсия для печати

Номер: 

41 за 2003 год

Рубрика: 

Кто есть кто
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!
 

Комментарии

Аватар пользователя Константин
Классный плагин - ещё ни разу не ошибся у меня за месяц.
Аватар пользователя Павел Бадялик
обновление плагина происходит постоянно - чуть ли не каждые полмесяца