A Plan for Spam

Оригинал Перевод

Август 2002

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

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

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

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

Вы так и делаете, и сначала это работает. Несколько простых правил откусят большой кусок от вашего входящего спама. Простой поиск слова "click"("щелкните") поймает 79,7% электронных писем в моем корпусе спамовых текстов, выдавая лишь 1,2% ложноположительных результатов.

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

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

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

Я не знаю, почему я так долго избегал попытки статистического подхода. Я думаю, это было из-за того, что я пристрастился к попыткам самому определить спамовые характеристики, как будто я играл в какую-то состязательную игру со спамерами. (Не-хакеры часто не осознают этого, но большинство хакеров являются весьма соревнующимися.) Когда я попробовал статистический анализ, я сразу обнаружил, что он был намного умнее меня. Он обнаружил, конечно, что такие термины как "virtumundo" (спамовая контора в США, аналог "Центра изучения английского" -прим.пер.) и "teens"("подростки") являются хорошими показателями спама. Но он также обнаружил, что слова "per" и "FL" и "ff0000" тоже являются хорошими показателями спама. На самом деле оказалось, что "ff0000" (HTML код для цвета "ярко-красный") является настолько же хорошим показателем спама, как и любое порнографическое слово.

_ _ _

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

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

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

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

Я объяснил это на уровне кода, чтобы показать пару важных деталей. Я хочу немного сместить вероятности так, чтобы избежать ложных срабатываний, и методом проб и ошибок я нашёл, что хороший способ это сделать – это удвоить все числа в good. Это помогает различать слова, которые иногда возникают в "добропорядочной" ("законной") почте, и слова, которые там почти никогда не встречаются. Я рассматриваю только слова, которые встречаются всего более пяти раз (на самом деле, из-за удвоения, вхождение трех раз в неспамовой почте будет достаточно). И затем есть вопрос о том, какой вероятность задать словам, которые встречаются в одном корпусе, но не встречаются в другом. Снова методом проб и ошибок я выбрал 0.01 и 0.99. Здесь может быть пространство для настройки, но, с ростом корпуса, такая настройка, в любом случае, произойдёт автоматически.

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

Когда новая письмо приходит, оно сканируется в токены (лексемы), и самые интересные пятнадцать токенов, в которых интересность измеряется тем, насколько далёка их спамовая вероятность, от нейтрального 0.5, используются для того, чтобы вычислить вероятность того, что почта является спамом. Положим probs – это список из пятнадцати индивидуальных вероятностей, тогда вычисление скомбинированной вероятности будет таким:

Один вопрос возникает на практике – какую вероятность присвоить слову, которое вы никогда не встречали, т. е. такому, которое отсутствует в хэш-таблице вероятностей слова. Я нашел, снова путем проб и ошибок, что является 0,4 хорошим числом для этого. Если вы никогда не видели слово прежде, это, вероятно, довольно "невиновное" слово; спамовые слова, как правило, все слишком знакомы.

В приложении в конце есть примеры этого алгоритма, примененного к реальным письмам.

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

_ _ _

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

Но реальное преимущество байесовского подхода, конечно, состоит в том, что вы знаете, что вы измеряете. Фильтры, распознающие характеристики, такие как признание SpamAssassin назначают электронным письмам некие спамовые "баллы". Байесовский подход присваивает настоящую вероятность. Проблема с "баллами" состоит в том, что никто не знает, что они означают. Пользователь не знает что они означают, но что еще хуже, этого не знает и сам разработчик фильтра. Сколько баллов должно получить письмо за то, что в нем есть слово "секс"? Вероятность, конечно, может быть ошибочной, но мало двусмысленности в том, что она означает, или в том, как данные (признаки) должны быть скомбинированы для её вычисления. Основываясь на моем корпусе, слово "секс" указывает вероятность 0,97 того, что содержащее его письмо будет спамом, в то время как "сексуальные" ("sexy") выдает вероятность 0,99. И правило Байеса, столь же недвусмысленное, гласит, что письмо, содержащее оба слова имело бы, в (маловероятном) отсутствии каких-либо других доказательств, 99,97% шансов быть спамом.

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

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

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

Вы можете начать фильтровать для пользователей с начального фильтра, но в конечном счете каждый пользователь должен иметь свои собственные пословные вероятности основанные на той почте что он получает. Это (a) делает фильтры более эффективными, (b) позволяет каждому пользователю задать свое собственное точное определение спама и (c) возможно, самое лучшее, это делает трудным для спамеров настройку писем для обхода через фильтры. Если большинство "мозгов" фильтра будут находиться в индивидуальных базах данных, то тогда простая настройка спамовых писем на пробитие через изначальные настроенные фильтры не будет ничего гарантировать в том, как хороши они будут в прохождении фильтров отдельных пользователей, изменчивых. от пользователя к пользователю, и гораздо более натренированных.

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

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

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

_ _ _

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

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

Тем не менее, каждый, кто предлагает план для фильтрации спама, должен уметь ответить на вопрос: если бы спамеры знали что именно вы делаете, насколько успешно они могли бы пройти через ваш фильтр? Например, я думаю, что, если фильтрация спама основанная на контрольной сумме станет серьёзным препятствием, спамеры просто переключатся на техники mad lib* для генерации тела сообщений. (* mad lib -- американская игра в процессе которой игроки заменяют слова в тексте c сохранением части речи или иного контекста.)

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

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

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

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

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

Вдоль всего спектра, если ограничить коммерческие презентации, которые могут делать спамеры, вы неизбежно будете стремится вывести их из бизнеса. Слово "бизнес" является важным, чтобы запомнить. Спамеры – бизнесмены. Они шлют спам, потому что это работает. Это работает, потому что, хотя доля откликнувшихся отвратительно низкая (в лучшем 15 на миллион, против 3000 на миллион для рассылки писем по каталогу), стоит это им практически ничего. Стоимость огромна для получателей, около 5 человеко-недель на каждый миллион получателей, которые проводят секунду чтобы удалить спам, но спамеры не будут оплачивать это.

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

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

Это – крупная победа в конце концов. Я начал писать программное обеспечение для фильтрации спама, потому что я не хочу больше быть вынужденным смотреть на некоторые вещи. Но, если мы станем достаточно хорошими в фильтрации спама, он перестанет работать, и спамеры на самом деле перестанут слать его.

_ _ _

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

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

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

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

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

Пятнадцатью самых интересных слов в этом спаме, с их вероятностями, являются:

На этот раз, улики -- смесь из хорошего и плохого. Слово вроде "shortest" такое же доказательство невиновности, как слово вроде "мадам" или "продвижение" -- доказательство вины. Но всё еще доводы за вину более вески. Если вы скомбинируете эти числа в соответствии с правилом Байеса, в результирующая вероятность будет 0,9027.

"Мадам" явно из спама начинающегося на: "Дорогой Сэр или Мадам". Они не очень распространены, но слово "мадам" никогда не встречается в моих "законных" письмах, и такое соотношение говорит о всем.

"Республика" имеет высокие баллы, потому что это слово часто появляется в спамовых письмах нигерийских мошенническов, а также встречается один или два раза в спаме, ссылающемся на Корею и Южную Африку. Вы могли бы сказать, что это случайность, что это, таким образом, помогает идентифицировать этот спам. Но я обнаружил, при детальном рассмотрении спамовой вероятности, что есть много таких случайностей, и они имеют необъяснимую тенденцию толкать вещи в правильном направлении, а не в неправильном. В таком случае, это не совсем случайно, что слово "Республика" встречается у нигерийском спаме и также в этом спаме. Есть целый класс сомнительных деловых предложений, включающих менее развитые страны, а те, в свою очередь, скорее будут иметь имена, которые явно указывают (потому что они ими не являются), что они - республики.[3]

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

Для сравнения, вот пример той редкой птицы, спама, который проходит через фильтры. Почему? Потому что по чистой случайности письмо оказалось заполненным словами, которые встерчаются в моей реальной электронной почте:

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

Во-вторых, я думаю, фильтрация на основе пар слов (см. ниже) вполне может также поймать это: "cost effective", "setup fee", "money back" -- ("затратоэффекктивный", "плата за настройку", "возврат денег") - довольно уличающий материал. И, конечно, если они по-прежнему спамили меня (или сеть частью которой я был), "Hostex" сама была бы распознана в качестве спамового термина.

Наконец, вот невиновное письмо. Его пятнадцать самых интересных слов следующие:

Большинство слов здесь свидетельствует о том, что письмо – невиновное. Тут есть два плохо пахнущих слова, "color" (спамеры любят цветные шрифты) и "California" (которое встречается в "рекомендациях", а также в списках выбора в формах), но их недостаточно, чтобы перевесить очевидно невиновные слова, как "continuation" и "example".

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

Приложение: Больше идей

Одна идея, которую я ещё не пробовал, состоит в том, чтобы профильтроваться по парам слов или даже по тройкам, а не по отдельным словам. Это должно дать гораздо более точную оценку вероятности. Например, в моей текущей базе данных, слово "предложения" имеет вероятность 0,96. Если бы вы основывали вероятности на парах слов, в конечном счете получились бы "специальные предложения" и "ценные предложения" с вероятностями 0.99 и предположим "подход предлагает" (как часть "этот подход предлагает"), имеющими вероятность 0.1 или меньше.

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

Специфические характеристики спама (например, скрытый адрес получателя в поле письма "Кому:") имеет, конечно, ценность в распознавании спама. Их можно рассматривать в этом алгоритме, рассматривая их в качестве виртуальных слов. Я, наверное, сделаю это в будущих версиях, по крайней мере, для нескольких из самых вопиющих показателей спама. Фильтры. распознающие характеристики спама правы во многих деталях; чего им недостаёт – общей дисциплины для комбинирования доказательств.

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

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

Другая вещь, которую я могу попробовать в будущем, состоит в том, чтобы сосредоточить дополнительное внимание на конкретных частях письма. Например, около 95% от текущего спама включает в себя URL сайта, который они хотят чтобы вы посетили. (Остальные 5% хотят, чтобы вы назвали номер телефона, ответили по емейлу или на почтовый адрес США, или в некоторых случаях, чтобы купить определенные акции.) Гиперссылки в таких случаях практически достаточно самой по себе, чтобы определить, является ли адрес электронной почты спамом.

Доменные имена отличаются от остального текста в электронной почте (если она не на немецком), в том, что они часто состоят из нескольких слов склеенных вместе. Хотя это в общем случае вычислительно дорого, но может стоит попытаться разделить их. Если фильтр никогда не видел раньше лексему "xxxporn", он будет иметь отдельную спамовую вероятность 0,4, в то время как "xxx" и "porn" по отдельности имеют вероятности (в моём корпусе) 0,9889 и 0,99 соответственно и совместную вероятность 0,9998.

Я ожидаю, что разложение доменных имен станет более важным, как спамеры постепенно будут вынуждены прекратить использование компрометирующих слов в тексте своих сообщений. (Гиперссылка с IP-адресом, конечно, крайне уличающий знак, за исключением почты небольшого количества системных администраторов.)

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

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

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

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

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

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

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

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

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

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

Есть случаи деловых отношений, когда вы неявно запрашиваете некоторые виды писем. Когда вы заказываете что-то онлайн, я думаю, что вы неявно просите получить квитанцию заказа, а также уведомление об отгрузке товара. Я не возражаю, когда Verisign посылает мне письмо с предупреждением, что срок доменного имени истекает (по крайней мере, если они действительно его регистратор). Но когда VeriSign отправляет мне письмо с предложением "БЕСПЛАТНОГО Руководства по Созданию Моего Веб-Сайта с Электронной Коммерцией", то это спам.


Примечания:

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

[2] Сейчас самая низкая ставка, кажется, почти $200 для отправки миллиона спамовых писем. Это очень дешево, 1/50 цента за спамовое письмо. Но фильтрация 95% спама, например, увеличила бы затраты спамеров на достижение заданной аудитории в 20 раз. Немногие могут иметь достаточно большую маржу, чтобы вынести это.

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