Как проверить, выглядит ли строка рандомизированной или созданной человеком и произнесенной?

В целях выявления [возможных] сгенерированных ботом имен пользователей.

Предположим, у вас есть имя пользователя, например "bilbomoothof".. это может быть бессмысленным, но оно все же содержит произносимые звуки и, таким образом, создается человеком.

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

  1. Предположим, у вас есть имя пользователя, например "sdfgbhm342r3f", для человека это явно случайная строка. Но можно ли это определить программно?
  2. Существуют ли какие-либо алгоритмы (похожие на Soundex и т. Д.), Которые могут идентифицировать произносимые звуки в такой строке?

Решения, применимые в PHP/MySQL, наиболее ценны.

11 ответов

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

Но это на самом деле польские имена (имеется в виду Стивен и Лоуренс)...

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

Зачем с этим?

<устарело и ложно, но я не удаляю из-за комментариев>

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

Посмотрите n-граммовый анализ. Он успешно используется для автоматического определения языка текста и работает на удивление хорошо даже на очень коротких текстах.

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

Просто используйте CAPTCHA как часть процесса регистрации.

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

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

РЕДАКТИРОВАТЬ: В поисках профилактики, а не после фактического анализа?

Решение позволяет кому-то другому управлять личностью пользователя за вас. Например, вы можете использовать небольшой список поставщиков OpenID (например, SO), или Facebook Connect, или оба. Вы наверняка будете знать, что пользователи настоящие, и что они решают хотя бы одну CAPTCHA.

РЕДАКТИРОВАТЬ: Другая идея

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

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

РЕДАКТИРОВАТЬ: Вот функция для подсчета слогов:

function count_syllables($word) {

$subsyl = Array(
'cial'
,'tia'
 ,'cius'
 ,'cious'
 ,'giu'
 ,'ion'
 ,'iou'
 ,'sia$'
 ,'.ely$'
 );

 $addsyl = Array(
 'ia'
 ,'riet'
 ,'dien'
 ,'iu'
 ,'io'
 ,'ii'
 ,'[aeiouym]bl$'
 ,'[aeiou]{3}'
 ,'^mc'
 ,'ism$'
 ,'([^aeiouy])\1l$'
 ,'[^l]lien'
 ,'^coa[dglx].'
 ,'[^gq]ua[^auieo]'
 ,'dnt$'
 );

 // Based on Greg Fast's Perl module Lingua::EN::Syllables
 $word = preg_replace('/[^a-z]/is', '', strtolower($word));
 $word_parts = preg_split('/[^aeiouy]+/', $word);
 foreach ($word_parts as $key => $value) {
 if ($value <> '') {
 $valid_word_parts[] = $value;
 }
 }

 $syllables = 0;
 // Thanks to Joe Kovar for correcting a bug in the following lines
 foreach ($subsyl as $syl) {
 $syllables -= preg_match('~'.$syl.'~', $word);
 }
 foreach ($addsyl as $syl) {
 $syllables += preg_match('~'.$syl.'~', $word);
 }
 if (strlen($word) == 1) {
 $syllables++;
 }
 $syllables += count($valid_word_parts);
 $syllables = ($syllables == 0) ? 1 : $syllables;
 return $syllables;
 }

Из этой очень интересной ссылки:

http://www.addedbytes.com/php/flesch-kincaid-function/

Ответ на вопрос № 1:

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

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

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

Соберите два набора данных: один из действительных псевдонимов и один из поддельных. Обучите простую нейронную сеть с обратным распространением и скрытым слоем со значениями символов в качестве входных данных. Нейронная сеть научится различать такие строки, как "zrgssgbt" и "zargbyt", поскольку в последней есть согласные и гласные.

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

Я видел регистрации ботов, где и имя пользователя, и полное имя представляют собой строки случайных букв верхнего и нижнего регистра. Как правило, они состоят не менее чем из 10 символов, поэтому в данном случае невозможно быть точным на 100 %, но вы можете приблизиться к ним, сначала пропустив любой символ, не содержащий [a-zA-Z] (например, пробел). , число или специальный символ).

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

Алгоритм можно уточнить, запустив его для группы известных действительных регистраций.

Обратите внимание, что многие крупные сайты предлагают имена пользователей, такие как [первая инициация][средняя инициализация][фамилия][число]. Затем пользователи переносят эти имена пользователей на другие сайты, и первые три буквы определенно не произносимы.

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

  • Ваш бот может быть мусором, но вы можете сохранить список слогов или, более конкретно, фонемы, которые вы можете попытаться найти в данной строке. Но это звучит немного сложно, потому что вам нужно сегментировать строку в разных местах и ​​т. Д.
  • в английском алфавите 5 гласных и еще 21. Вы можете предположить, что если бы они были сгенерированы случайным образом, то приблизительно вы ожидаете, что 5/26*W (где W - длина слова) являются гласными, и существенные отклонения от этого могут быть подозрительными. (Если буква включена, то 5/31 и т. Д.) Вы можете попытаться развить эту идею, выполнив поиск дублетов и попытавшись убедиться, что каждый дублет встречается с одинаковой вероятностью и т. Д.
  • Кроме того, вы можете попытаться сегментировать входную строку вокруг гласных, например, три буквы перед гласной и три буквы после гласной, и попытаться выяснить, издает ли она узнаваемый звук, сравнивая с фонемами.

На русском языке у нас запрещенные слоги, вроде ГЙ, а Ъ или же Ь после гласной и так далее.

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

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

Другие вопросы по тегам