uso str special mysqli_real_escape_string mysql_real_escape_string escape escapar como characters cadena actualizar mysql algorithm nlp spam phonetics

mysql - str - php pdo quote



cómo comprobar si una cadena se ve aleatorizada, o generada por humanos y pronouncable? (10)

Respuesta para la pregunta n. ° 1:

Desafortunadamente esto no se puede hacer, ya que la función de complejidad de Kolmogorov no es computable, por lo tanto no puede generar tal algoritmo a menos que aplique algunas reglas al dominio de posibles nombres de usuario, entonces podrá realizar análisis heurísticos y decidir, pero incluso así es realmente difícil de hacer.

PD: Después de publicar esta respuesta, me topé con algún servicio que me dio una idea del ejemplo de restricción de dominio de nombre de usuario, permití que los usuarios usaran el buzón de dominio público conocido como nombres de usuario.

Con el propósito de identificar [posibles] nombres de usuario generados por bot.

Supongamos que tiene un nombre de usuario como "bilbomoothof" ... puede ser una tontería, pero todavía contiene sonidos pronouncables y aparece generado por el ser humano.

Acepto que podría haber sido generado al azar a partir de un diccionario de sílabas o partes de palabras, pero supongamos por un momento que el robot en cuestión es un poco basura.

  1. Supongamos que tiene un nombre de usuario como "sdfgbhm342r3f", para un humano esto es claramente una cadena aleatoria. Pero, ¿se puede identificar esto programáticamente?
  2. ¿Hay algún algoritmo disponible (similar a Soundex, etc.) que pueda identificar sonidos pronunciables dentro de una cadena como esta?

Las soluciones aplicables en PHP / MySQL son las más apreciadas.


Busque el análisis n-gram. Se utiliza con éxito para detectar automáticamente el lenguaje de texto y funciona sorprendentemente bien incluso en textos muy cortos.

La demostración en línea (que ya no está en línea) reconoció ''bilbomoothof'' como inglés y ''sdfgbhm342r3f'' como nepalí. Probablemente siempre devuelva la mejor combinación, incluso si es muy pobre. Creo que podrías entrenarlo para discernir entre ''pronunciable'' y ''aleatorio''.


En ruso, hemos prohibido sílabas, como ГЙ , а Ъ o Ь después de una vocal, etc.

Sin embargo, los bots de spam simplemente usan la base de datos de nombres, por eso mi bandeja de entrada de spam está llena de nombres extraños que solo puedes encontrar en los libros de historia.

También espero que el inglés tenga histogramas de distribución de sílabas (como ETAOIN SHRDLU , pero para sílabas de dos letras o incluso de tres letras), y tener una densidad crítica de sílabas de baja frecuencia en un nombre es ciertamente una señal.


Estoy de acuerdo con Mac. Pero más que eso, las personas a veces tienen un nombre de usuario que no es ejecutable, como qwerty o rtfmorleave.

¿Por qué molestarse con eso?

<obsoleto y falso, pero no lo borro debido a comentarios>

Pero más que eso, ningún bots usa ''zetztzgsd'' como nombre de usuario , tienen un diccionario de nombre real, posible apodo, etc. por lo que creo que esto sería una pérdida de tiempo para ti

</ obsoleto y falso, pero no lo borro por los comentarios>


Fuera de mi cabeza, puedes buscar sílabas, haciendo uso de soundex . Esa es la dirección que exploraría, basada en la suposición de que una palabra pronunciable tiene al menos una sílaba.

EDITAR: Aquí hay una función para contar sílabas:

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; }

De este enlace muy interesante:

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


No sé de algoritmos existentes para este problema, pero creo que se puede atacar de cualquiera de las siguientes maneras:

  • su bot puede ser basura, pero puede mantener una lista de sílabas, o más específicamente, fonemas, que puede intentar encontrar en su cadena de caracteres. Pero esto suena un poco difícil porque necesitarías segmentar la cuerda en diferentes lugares, etc.
  • hay 5 vocales en el alfabeto inglés y 21 otras. Podría suponer que si se generaran aleatoriamente, entonces aproximadamente esperaría 5/26 * W, (donde W es la longitud de la palabra) letras que son vocales, y las desviaciones significativas de esto podrían ser sospechosas. (Si se incluyen letras, luego 5/31 y así sucesivamente). Puede intentar basarse en esta idea buscando doubletons y tratando de asegurarse de que cada doubleton ocurra con la misma probabilidad, etc.
  • Además, puedes intentar segmentar tu cadena de entrada alrededor de las vocales, por ejemplo, tres letras antes de una vocal y tres letras después de una vocal, y tratar de averiguar si produce un sonido reconocible al comparar con los fonemas.

Podría usar una red neuronal para evaluar si el sobrenombre se parece a un sobrenombre en lenguaje natural.

Arme dos conjuntos de datos: uno de apodos válidos y uno de los falsos. Entrene una red neuronal de capa oculta única y simple con los valores de caracteres como entradas. La red neuronal aprenderá a discriminar entre cadenas como "zrgssgbt" y "zargbyt", ya que esta última tiene consonantes y vocales entremezcladas.

Es importante usar ejemplos del mundo real para obtener un buen discriminador.


Solo use CAPTCHA como parte del proceso de registro.

Nunca se pueden distinguir nombres reales de nombres de usuarios creados por bots, sin molestar seriamente a los usuarios.

Bloquearás a los usuarios con nombres bizarros o no ingleses, lo que los irritará, y los bots seguirán intentándolo hasta que obtengan un buen nombre de usuario (del diccionario u otras fuentes, ¡ Users , por cierto! )

EDITAR: ¿Busca prevención en lugar de análisis después de los hechos?

La solución es dejar que otra persona administre las identidades del usuario por usted. Por ejemplo, puede usar una pequeña lista de proveedores de OpenID (como SO), o Facebook Connect , o ambos. Sabrá con certeza que los usuarios son reales y que han estado resolviendo al menos un CAPTCHA.

EDITAR: Otra Idea

Busque la cadena en Google y verifique el número de coincidencias encontradas. No debería ser su única herramienta, pero también es un buen indicador. Las cadenas aleatorizadas, por supuesto, deben tener poca o ninguna coincidencia.


Supongo que podrías pensar en algo así si pudieras restringirte a sonidos pronunciables en inglés . Para mí (soy francés), las palabras como szczepan o wawrzyniec son impronunciables y ciertamente tienen cierta aleatoriedad.

Pero en realidad son nombres polacos (es decir, steven y lawrence ) ...


Tenga en cuenta que muchos sitios grandes sugieren nombres de usuario como [first init] [middle init] [lastname] [number]. Los usuarios luego llevan estos nombres de usuario a otros sitios, y las primeras tres letras definitivamente no son pronunciables.