Пол Грэм: План для спама

После продажи своей компании Viaweb поисковому гиганту Yahoo, Пол Грэм написал эссе A Plan for Spam, которое, по сути, инициировало мини-революцию в технологиях фильтрации спама. В этом эссе Пол предлагает элегантный алгоритм борьбы со спамом, построенный на Байесовской фильтрации.


Август, 2002

Эта статья описывает методы фильтрации спама, которые мы использовали в антиспамном веб-клиенте электронной почты, созданном нами, чтобы отточить Arc. Улучшенный алгоритм описан в статье Better Bayesian Filtering (Улучшенная байесовская фильтрация спама).

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

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

Но им необходимо донести определённое сообщение, каким бы оно ни было. Если нам удастся написать ПО, распознающее их сообщения, они не смогут обойти такое препятствие.

Для реципиента (получателя) спам легко узнаваем. Если вы наймёте кого-то для чтения своей почты и удаления спама, вряд ли у него возникнут трудности. Но что мы должны сделать, в условиях нехватки ИИ, чтобы автоматизировать этот процесс?

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

Используя слегка настроенный (как описано ниже) Байесовский фильтр, мы стали пропускать менее 5 спам-писем из каждой 1.000, при 0 ложных срабатываний.

Статистический подход, как правило, не является первым, который люди пытаются использовать при написании спам-фильтров. Большинство хакеров инстинктивно пытаются написать софт, который распознает индивидуальные свойства спама.

Вы смотрите на спам и думаете: “Эти ребята нагло пытаются отправить мне письмо, которое начинается со слов «Дорогой друг», или с заголовком, набранном капслоком (Caps Lock) и заканчивающимся 8 восклицательными знаками. Я же могу отфильтровать всё это буквально одной строчкой кода!”.

Так вы и поступаете, и поначалу всё работает. Несколько простых правил избавляют вас от большей части входящего спама. Простой поиск слова «click» отфильтровывает 79,7% писем в мою папку для спама, при всего лишь 1,2 % ложных срабатываний.

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

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

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

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

Как только я попробовал статистический анализ, я тут же обнаружил, что он гораздо умнее, чем я. Конечно, он показал, что такие термины, как «virtumundo» и «teens» — хорошие индикаторы спама. Но он так же обнаружил, что слова «per», «FL» и «ff0000» — тоже отличные показатели спама!

По сути, «ff0000» (html-обозначение ярко-красного цвета) оказался не менее хорошим показателем спама, чем любой порнографический термин.

Вот схема, по которой я делал статистическую фильтрацию спама. Я начал с 2 ящиков: в одном из них спам, в другом — обычная почта. На тот момент в каждом из них было 4000 сообщений. Я просканировал весь текст, включая заголовки, встроенные html и javascript каждого сообщения в каждом ящике.

Я включил алфавитно-цифровые символы, тире, апострофы и знак доллара в лексемы, а всё остальное посчитал, как разделители лексем. (Вероятно, здесь есть пространство для улучшений). Я игнорирую лексемы, состоящие только из цифр, а также комментарии html, не рассматривая их даже как разделители лексем.

Я посчитал, сколько раз каждое слово (лексема) — игнорируя регистр — появлялось в каждом из ящиков. На этом этапе я получил 2 большие хэш-таблицы, по одной на каждый ящик, которые показывали частоту появления слов в ящиках.

Затем я создал третью хэш-таблицу, на этот раз показывающую вероятность для каждого слова, что письмо, в котором оно встречается, окажется спамом, которую я считал так [1]:

(let ((g (* 2 (or (gethash word good) 0)))
(b (or (gethash word bad) 0)))
(unless (< (+ g b) 5) (max .01 (min .99
(float (/ (min 1 (/ b nbad)) (+
(min 1 (/ g ngood))
(min 1 (/ b nbad)))))))))

, где word — лексема, вероятность которой просчитывается, good и bad — это хэш-таблицы, которые я создал на первом шаге, а ngood и nbad — числа нормальных и спамных писем соответственно.

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

Я рассматривал только те слова, которые суммарно встречаются больше пяти раз. (На самом деле, благодаря удвоению, появление этих слов в нормальных письмах более 3 раз было бы достаточным). И тогда возникает вопрос, какая вероятность должна быть назначена словам, которые возникают в одном ящике, но не возникают в другом.

Снова путём проб и ошибок я выбрал 0.01 и 0.09. Возможно, здесь тоже есть место для настройки, но по мере увеличения ящика такая настройка в любом случае происходит сама собой автоматически.

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

При поступлении новой почты она сканируется по лексемам, и наиболее интересные 15 лексем, где интересность измеряется тем, насколько велика их спам-вероятность от нейтральных 0.5, используются для вычисления вероятности, что письмо — спам. Если probs — это список 15 индивидуальных вероятностей, вы вычисляете комбинированную вероятность как:

(let ((prod (apply #'* probs)))
(/ prod (+ prod (apply #'* (mapcar #'(lambda (x)
(- 1 x))
probs)))))

На практике возникает один вопрос: какую вероятность назначить словам, которые вы никогда не видели — т.е. тем, которых нет в хэш-таблице вероятностей слов. Снова методом проб и ошибок, я понял, что лучше использовать число 0.4. Если вы никогда не видели слово раньше, то, скорее всего, оно довольно безобидно. Слова, характерные для спамных писем, имеют тенденцию быть хорошо знакомыми.

Примеры такого алгоритма, внедренного в реальную почту, приведены в приложении в конце статьи.

Я отношусь к почте как к спаму, если алгоритм выше даёт вероятность спама выше 0.9. Но на практике не имело бы большого значения, где я провожу порог, потом что несколько вероятностей оказываются в середине диапазона.

Одно из больших преимуществ статистического подхода — что вам не приходится читать горы спама. За последние 6 месяцев я прочитал буквально тысячи спам-сообщений, и это на самом деле деморализует.

Норберт Винер сказал, что если вы соревнуетесь с рабами, вы становитесь рабом, и при соревновании со спамерами происходит похожая деградация. Чтобы узнать индивидуальные особенности спама, вам приходится залезать в разум спамера, хотя, честно говоря, мне бы хотелось провести там как можно меньше времени.

Но реальное преимущество Байесовского подхода в том, что вы знаете, что меряете. Такие распознающие особенности спама фильтры, как SpamAssassin, присваивают письму определенное количество “баллов”. В то время, как Байесовский подход присваивает фактическую вероятность.

Проблема “баллов” в том, что никто не знает, что они означают. Пользователь не знает, что они значат, но, что ещё хуже, этого не знают и сами разработчики фильтра. Сколько очков должно присваиваться письму, если оно содержит слово “секс”?

Вероятность, конечно, может быть ошибочной, но в случае с ней нет неопределённости по поводу того, что она означает, или как данные должны быть скомбинированы для вычислений. Основываясь на моём ящике, “секс” с вероятностью 0.97 значит, что письмо – спам, тогда как “сексуальный” указывает на вероятность 0.99.

А правило Байеса, так же не вызывающее разночтений, говорит, что письмо, содержащее оба слова, в случае (маловероятном) отсутствия любого другого подтверждения имеет шанс оказаться спамом на 99.97%.

Байесовский подход учитывает все данные в письме — и хорошие, и плохие одновременно, поскольку измеряет вероятности. Слова, которые встречаются в спаме разочаровывающе редко (такие, как “хотя”, “сегодня вечером”, “по-видимому”) способствуют уменьшению вероятности, а такие, как “отписаться” и “подписаться” — увеличивают. Таким образом, невинное в остальном письмо, содержащее слово “секс”, не будет помечено как спам.

В идеале, конечно, вероятность должна просчитываться индивидуально для каждого пользователя. Я получаю много писем, содержащих слово “Лисп”, и (пока) спама с таким словом не приходило. Таким образом, это слово – некий эффективный вид пароля для отправки письма на мой адрес.

В моем более раннем ПО для спам-фильтрации пользователь мог настроить список таких слов, и содержащее их письмо автоматически проходило фильтры.

В свой список я добавил такие слова, как “Лисп”, а также мой индекс, чтобы письма от онлайн-заказов (которые могли звучать, как спам) приходили в почту, а не в спам. Я думал, что это я такой умный, но обнаружил, что Байесовский фильтр делает то же самое для меня — и, более того, обнаруживает множество слов, о которых я даже не думал.

Когда я говорил в начале, что наши фильтры пропускают меньше чем 5 спам-сообщений из каждой 1.000 при 0 ложных срабатываний, я говорил о фильтрации моей почты. Но эти цифры не вводят в заблуждение, и я готов защитить свой подход: фильтр почты каждого пользователя основан и на спаме, и обычной почте, которую он получает.

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

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

  1. Делает фильтр более эффективным
  2. Позволяет каждому пользователю решать, где проходит его личная граница между спамом и обычной почтой
  3. Самое важное: это затрудняет спамерам подбор состава письма для прохождения фильтров

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

Спам-фильтры, созданные на основе собственных данных, часто сочетаются с “белым списком” — списком отправителей, чьи письма принимаются без фильтрации. Один из простых способов создать такой белый лист – иметь список всех адресатов, которым пользователь когда-либо отправлял письмо.

Если у ридера почты есть кнопка “удалить-как-спам”, то вы можете так же добавить в “белый лист” адреса отравителей, чьи письма пользователь удалил, как обычную почту.

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

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

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

В некотором смысле, мои фильтры сами по себе – воплощение “белого списка” (и “черного” тоже), потому что они основаны на полных текстах сообщений, включая заголовки.

Так что, в какой-то мере, они “знают” e-mail-адрес надёжных отправителей и даже маршруты, которыми почта добиралась от них до меня. И они знают то же самое о спаме, включая имя сервера, почтовую версию и протоколы.

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

Я больше полагаюсь на Байесовские фильтры, так как они развиваются вместе со спамом. Если спамеры начнут использовать «c0ck» вместо «cock» чтобы обойти простые спам-фильтры на основе индивидуальных слов, то Байесовский фильтр это заметит автоматически. На самом деле, «c0ck» — гораздо более весомая улика, чем «cock» — и Байесовский фильтр может точно сказать, насколько.

Тем не менее, любой, кто предлагает план фильтрации спама, должен суметь ответить на вопрос : если бы спамеры точно знали, что вы делаете, насколько успешно они бы могли преодолеть ваш фильтр?

Например, я думаю, что если фильтрация на основе суммы спам-сообщений (checksum-based spam filtering) станет для спамеров серьёзным препятствием, им придётся переключиться на mad-lib — техники генерации текстов спам-писем (программы, заменяющие по маске ключевые слова в тексте для уникализации — техника, уходящая корнями в СЕО- прим. пер.).

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

Спам — это, в основном, коммерческие предложения, и если ваша обычная почта не представляет собой поток таких коммерческих писем, спам будет легко узнаваем.

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

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

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

Привет. Думаю, тебе стоит посмотреть на это:
http://www.27meg.com/foo

 

потому что в нём ровно столько коммерческих нот, сколько создателям спама позволяют оставить фильтры контента.

Но спамерам это мало поможет. На самом деле, с такими сообщениями им будет даже сложнее обойти спам-фильтры, потому что если всё остальное в письме выглядит нейтрально, то вероятность спама будет зависеть от url, и понадобится приложить усилие, чтобы придать нейтральный вид и ему).

Спамеры бывают очень разными: от тех, кто работает по списку почтовых адресов (opt-in lists), даже не пытаясь скрыть свою личность, до тех, кто взламывает почтовые сервера и рассылает рекламу порносайтов.

Если мы используем фильтрацию для сужения возможностей спамеров до писем, как в примере выше, это в значительной степени вытесняет их в “законную” область бизнеса; различные законы обязывают их включать шаблонные объяснения, почему их спам — это вовсе не спам, и как отказаться от «подписки», а такой вид текста легко распознать.

(Я привык думать, что вера в уменьшение спама более строгими законами наивна. Теперь я считаю, что хотя более строгие законы могут не уменьшать количество спама, посылаемого спамерами, они точно могут помочь фильтрам уменьшить количество спама, который видят получатели).

Если вы ограничите варианты спамерских коммерческих питчей, то неизбежно положите конец их бизнесу. Здесь важно запомнить слово “бизнес”. Спамеры – это бизнесмены.

Они рассылают спам, потому что он работает. А работает он, потому что, несмотря на низкий процент ответов (в лучшем случае, 15 на каждый миллион против 3000 на миллион при рассылке по каталогу), его стоимость для спамеров практически нулевая.

Но цена для получателей спама огромна: примерно 5 недель работы на каждый миллион получателей, которые тратят 1 секунду на удаление спама. Но спамеры за это не платят.

Правда, отправка спама всё же кое-что стоит для спамера. [2] Так что, чем больше мы можем уменьшить отклики на спам — с помощью фильтрации или пользовательских фильтров, которые вынудят спамеров адаптировать тексты писем — тем меньше бизнесов будут видеть выгоду в рассылке спама.

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

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

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

Спамеры бы не писали все эти аппетитные питчи, если бы они не звучали столь привлекательно. И «думаю, тебе стоит на это взглянуть» просто не будет иметь такого влияния на получателя спама, как те пёстрые речи, что шлют современные спамеры.

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

В конце концов, это большая победа. Я начал писать ПО для фильтрации спама, потому что больше не хотел видеть спам. Если мы достаточно продвинемся в фильтрации спама, он просто перестанет работать, и спамеры прекратят его рассылать.

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

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

Приложение 1: Примеры фильтрации

Вот пример спама, который пришёл мне, пока я писал эту статью. 15 самых интересных слов в спаме были:

  • qvp0045
  • indira
  • mx-05
  • intimail
  • $7500
  • freeyankeedom
  • cdo
  • bluefoxmedia
  • jpg
  • unsecured
  • platinum
  • 3d0
  • Qves
  • 7c5
  • 7c266675

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

К сожалению, это делает письмо скучнейшим примером правила Байеса. Чтобы увидеть разные интересные вероятности, нам стоит взглянуть на этот
довольно нетипичный спам.

15 наиболее интересных слов из него (с вероятностями):

madam0.99
promotion0.99
republic0.99
shortest0.047225013
mandatory0.047225013
standardization0.07347802
sorry0.08221981
supported0.09019077
people’s0.09019077
enter0.9075001
quality0.8921298
organization0.12454646
investment0.8568143
very0.14758544
valuable0.82347786

 

На этот раз видно смешение плохого и хорошего. Такая лексема, как «самый короткий» — столь же очевидный показатель невинности письма, как слова типа «госпожа» или «предложение» — признаки спама. Но всё же вероятность спама выше. Если вы сложите эти вероятности по правилу Байеса, результатом будет 0.9027.

«Madam» явно взялось из спама, начинающегося с приветствия «Dear Sir or Madam». Они не очень распространены, но слово «madam» никогда не встречается в моей обычной почте. Это вопрос соотношений.

«Республика» имеет такую высокую вероятность потому, что часто встречается в письмах нигерийских мошенников, а так же 1-2 раза встречалось в отношении Кореи и Южной Африки.

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

В таком случае, не совсем случайно, что слово «республика» возникло в письмах нигерийских мошеников и в этом спаме.

Существует целый класс сомнительных деловых предложений с участием малоразвитых стран, и в них чатсто встречаются имена, явно указывающие на то, что они являются республиками (как раз потому, что они на самом деле ими не являются). [3]

С другой стороны, «вход» — очевидный промах. Это слово встречается, в основном, в инструкциях по отписке, но на этот раз они используется в совершенно невинном варианте.

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

Для сравнения, вот редкий пример спама, прошедшего через спам-фильтры. Почему он прошёл? Потому что чисто по случайности он оказался наполнен словами, которые часто встречаются в моей переписке.

perl0.01
python0.01
tcl0.01
scripting0.01
morris0.01
graham0.01491078
guarantee0.9762507
cgi0.9734398
paul0.027040077
quite0.030676773
pop30.042199217
various0.06080265
prices0.9359873
managed0.06451222
difficult0.071706355

 

Есть 2 хорошие новости. Во-первых, такое письмо, вероятно, не пройдет через фильтры того, кто не специализируется на языках программирования и не имеет хорошего друга по имени Моррис. Для среднего пользователя, все топ-5 слов будут нейтральными и не будут вносить вклад в вероятности спама.

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

И, конечно, если они продолжают присылать мне спам (или сети, частью которой я являюсь), «Hostex» начнёт сам по себе распознаваться, как спам-термин.

Наконец, вот пример нормального письма. Его 15 самых интересных слов (с вероятностями):

continuation0.01
describe0.01
continuations0.01
example0.033600237
programming0.05214485
i’m0.055427782
examples0.07972858
color0.9189189
localhost0.09883721
hi0.116539136
california0.84421706
same0.15981844
spot0.1654587
us-ascii0.16804294
what0.19212411

 

Большинство слов здесь указывает на то, что письмо невинное. Здесь есть 2 подозрительных слова: цвет (спаммеры любят цветные шрифты) и «Калифорния» (встречается в рекомендациях, а также в меню форм), но этого мало для того, чтобы перевесить явно невинные слова типа «продолжение» и «пример».

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

Приложение 2: Другие идеи

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

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

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

Особенности спама (например, отсутствие адреса получателя в поле «кому:»), конечно, ценны при его распознавании. Они могут быть рассмотрены в алгоритме распознавания в качестве виртуальных слов. Я, наверное, сделаю это в следующих версиях — по крайней мере, для нескольких вопиющих спам-индикаторов. Спам-фильтры, распознающие особенности спама, хороши во многих отношениях; но им не хватает общей дисциплины для объединения свидетельств.

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

Я не ожидаю, что второй уровень фильтрации будет Байесовским. Он неизбежно будет служить той же цели, но основываться на догадках, поскольку число ложных срабатываний не будет склонно быть достаточно большим, чтобы заметить закономерности. (Хорошо, если система резервного копирования не использует ту же технологию в качестве основной системы).

Другая вещь, на которой я, возможно, попробую сосредоточиться в будущем — особые части письма. Например, около 95% нынешнего спама содержат URL сайта, который он хочет заставить вас посетить (остальные 5% хотят, чтобы вы позвонили по телефону, ответили на имейл или по обычной почте, или (в некоторых случаях) что-то купили. В таких случаях, URL достаточно, чтобы определить, является ли письмо спамом.

Доменные имена отличаются от остального текста имейла (не немецкого) тем, что часто состоят из нескольких слов, составленных вместе. Несмотря на то, что это требует вычислительных затрат, стоит попробовать разложить их на слова. Если фильтр никогда раньше не «видел» слова «xxxporn», то индивидуальная вероятность спама будет равна 0.4, в то время как для «xxx» и «porn» вероятность спама будет 0.9889 и 0.99 соответственно, а общая вероятность — 0.9998.

Полагаю, важность декомпозиции доменных имён будет повышаться по мере того, как спамеры постепенно будут вынуждены отказываться от использования изобличающих их слов в текстах писем. (URL, содержащий IP адрес — более чем явный признак спама, за исключением писем от некоторых сисадминов).

Возможно, было бы хорошо иметь совместно поддерживаемый список url’ов, продвигаемых спамерами. Нам бы понадобилась шкала доверия, изучаемая Рафом Левиеном (Raph Levien) для предотвращения злонамеренных или некомпетентных сабмитов. Но если бы у нас был такой список, это обеспечило бы прогресс любого фильтрационного ПО. А также было бы удобной основой для бойкотов.

Ещё один способ проверить сомнительные url’ы — отправить краулера (бота), чтобы он проверил сайт до того, как пользователь просмотрит письмо, в котором он упоминается. Байесовский фильтр можно использовать для оценки сайта так же, как и для оценки имейлов, и всё, что будет на нём найдено, может быть включено в вычисление вероятности спамности письма. Url, который привёл к переходу на другой сайт, будет, конечно, признан крайне подозрительным.

Ещё один совместный проект, который, как я думаю, будет отличной идеей: накопить гигантскую коллекцию спама. Гигантский, состоящий только из спама блок – ключ к тому, чтобы заставить Байесовский фильтра работать на “отлично”. Фильтра мог бы использовать этот спам, как входные данные. Такое собрание спама будет полезно и для других фильтров — чтобы их протестировать.

Создание такого собрания спама создаёт некоторые проблемы. Конечно, нам понадобится шкала доверия для предотвращения злонамеренных или некомпетентных материалов. А также способы стирания личной информации (не только адрес получателя и CCS, но и аргументы для функций отказа от подписки, которые зачастую привязаны к адресу) из писем коллекции. Если кто-нибудь хочет взяться за этот проект, это будет полезная миру вещь.

Приложение: Определение спама

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

Для начала: спам – это нежелательное электронное письмо коммерческого характера. Если кто-то из соседей услышит, что я ищу старый трехскоростной велосипед Raleigh
в хорошем состоянии и пришлет мне письмо с предложением купить, я буду в восторге, но при этом письмо будет непрошенным и коммерческим. Определяющая черта спама (его суть) — не то, что он нежелателен, а то, что он автоматизирован.

То, что спам обычно коммерческий — чистая случайность. Если кто-то начнёт массово рассылать письмо с просьбой поддержать, например, политическую акцию, это будет таким же спамом, как и продвижение порно-сайта.

Я предлагаю определить спам, как нежелательное автоматически созданное письмо. Это определение включает часть писем, которые не включают многие законные определения спама.

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

Но тот факт, что вы купили что-то у компании, не означает, что вы хотите постоянно получать от них письма. Если я заказываю что-то в онлайн магазине, и они начинают слать мне поток спама, то это всё равно спам.

Компании, рассылающие спам, часто дают вам возможность «отписаться», или просят перейти на сайт и изменить ваши «настройки аккаунта», чтобы прекратить получать спам. Но этого недостаточно, чтобы письмо перестало быт спамом. Отсутствие отказа от чего-либо не означает желание в этом участвовать.

До тех пор, пока получатель не ответит утвердительные на ответ на вопрос о том, хочет ли он получать почту, отметив выделенное поле (в котором по умолчанию установлен вариант “нет”), письма являются спамом.

В некоторых деловых отношениях вы неявно запрашиваете некоторые виды имейлов. Например, совершая онлайн-покупку, вы запрашиваете чек и уведомление об отправке. Я не возражаю. когда компания Verisign присылает на имейл уведомление. что срок делегирования домена скоро закончится (по крайней мере, если оно действительно зарегистрировано у них). Но когда Verisign шлет мне письмо, предлагая бесплатный гайд по построению интернет-магазина — это спам.

Примечания:

[1] Примеры в этой статье переведены в Common Lisp для, верите или нет, большей доступности. Приложение, которое здесь описывается -, одно из тех, что мы написали в процессе тестирования нового диалекта Lisp, названного Arc, который еще не выпущен.

[2] В настоящее время, самая низкая ставка — около 200$ для отправки миллиона спам-писем. Это очень дешево:1/50 цента за 1 спам-письмо. Но фильтрация 95% спама, например, увеличит стоимость достижения целевого показателя в 20 раз. Мало может так раздвинуть свои границы.

[3] Как правило, чем больше прилагательных перед названием страны, тем более коррумпированны её правители. Страна, называющаяся “Социалистическая Народная Демократическая Республика X”, вероятно, последнее место в мире, где вы хотели бы жить.

Благодарности:

Спасибо Саре Харлин (Sarah Harlin) за чтение черновиков и Дэниелу Гифиину (Daniel Giffin), который так же пишет интерпретатор Arc, за некоторые хорошие идеи по поводу фильтрации и создания нашей имейл-инфраструктуры.

Спасибо Роберту Моррису (Robert Morris), Тревору Блеквеллу и Эранну Гату (Erann Gat) за многочисленные дискуссии о спаме, Ральфу Левиену (Raph Levien) за совет по поводу метрики доверия, Чипу Колдвеллу (Chip Coldwell) и Сэму Штейнгольду (Sam Steingold) за совет по поводу статистики.


Если вам понравился пост, делитесь и подписывайтесь, чтобы нам тоже было приятно ♥

Другие эссе Пола Грэма на WOB: