Обнаружение сходства и паттернов внутри строки - Python - PullRequest
1 голос
/ 13 мая 2010

это тот случай использования, для которого я пытаюсь это выяснить.

У меня есть список спам-подписок на услугу, и они снижают коэффициент конверсии и другие исследования удобства использования.

Вставленные электронные письма выглядят следующим образом:

rogerep_dyeepvu@hotmail.com

rogeram_ingramameb@hotmail.com

rogerew_jonesewct@hotmail.com

роджер [...] _ фамилия [...] @ hotmail.com


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

Помощь будет очень признателен!

Ответы [ 3 ]

3 голосов
/ 13 мая 2010

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

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

Другим способом может быть использование байесовского фильтра (например, что-то вроде Reverend в Python, хотя есть и другие), обученного на последних 4 письмах законных адресов электронной почты. Это, вероятно, определит 95% случайных, если вы сделаете данные пригодными для использования. например. Отправка не только четырех букв, но и каждой из двухбуквенных и трехбуквенных подстрок внутри, чтобы захватить контекст каждой буквы. Я не думаю, что это будет работать так же хорошо, как метод Маркова.

Независимо от того, что вы проверяете, вы можете сократить ложные срабатывания, отправив для него только определенные адреса электронной почты (например, только те, которые находятся на адресах электронной почты, которые содержат подчеркивание, по крайней мере с 3 символами перед подчеркиванием и 5 символами после него).

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

1 голос
/ 13 мая 2010

Звучит как работа для регулярных выражений:

if re.match("^roger[a-z]+_[a-z]+@hotmail.com$", email_address):
    # might be your spammer

(Если вы никогда не использовали регулярные выражения, вот краткое изложение того, что это означает: ^ соответствует началу строки и $ соответствует концу, поэтому мы требуем, чтобы все между этими символами было шаблон, описывающий всю строку. [a-z] соответствует любой строчной букве, а + означает «один или несколько раз», поэтому [a-z]+ соответствует одной или нескольким строчным буквам. Соединяя все это вместе, наше регулярное выражение соответствует если строка может быть описана как «начало строки, за которой следуют буквы roger, за которыми следуют одна или несколько строчных букв, затем подчеркивание, за которыми следуют одна или несколько строчных букв, за которыми следует @hotmail.com, за которым следует конец строки. "Если регулярное выражение совпадает, адрес электронной почты соответствует шаблону, который вы описали в своем вопросе.)

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

1 голос
/ 13 мая 2010

Не думаю, что вы можете сделать больше, чем пометить это как потенциальную проблему, проверив:

^roger([a-z]{2})_([a-z]+)@hotmail.com

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

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

^roger([a-z]{2})_([a-z]{5,})@hotmail.com

, что предполагает, что все их фамилии имеют по крайней мере один символ.

...