comment vérifier si une chaîne a l’air aléatoire, ou humaine et prononçable?

Dans le but d’identifier [possibles] noms d’utilisateur générés par un bot.

Supposons que vous ayez un nom d’utilisateur comme “bilbomoothof” … cela peut être un non-sens, mais il contient toujours des sons prononçables et apparaît donc comme étant généré par l’homme.

J’accepte qu’il ait pu être généré aléatoirement à partir d’un dictionnaire de syllabes ou de parties de mots, mais supposons un instant que le bot en question soit un peu foutu.

  1. Supposons que vous ayez un nom d’utilisateur comme “sdfgbhm342r3f”, pour un humain, il s’agit clairement d’une chaîne aléatoire. Mais cela peut-il être identifié par programme?
  2. Existe-t-il des algorithmes disponibles (similaires à Soundex, etc.) qui peuvent identifier des sons prononçables dans une chaîne comme celle-ci?

Les solutions applicables en PHP / MySQL sont les plus appréciées.

Je suppose que vous pourriez penser à quelque chose comme ça si vous pouviez vous limiter à des sons prononcés en anglais . Pour moi (je suis français), des mots comme szczepan ou wawrzyniec sont imprononçables et ont certainement un certain caractère aléatoire.

Mais ce sont en réalité des prénoms polonais (signifiant steven et lawrence ) …

Je suis d’accord avec Mac. Mais plus que cela, les gens ont parfois un nom d’utilisateur qui n’est pas prononçable, comme qwerty ou rtfmorleave.

Pourquoi s’embêter avec ça?

Mais plus que ça, aucun bots n’utilise zetztzgsd comme nom d’utilisateur , ils ont un dictionnaire de realname, un pseudonyme possible, etc. Je pense donc que ce serait une perte de temps pour vous.

Recherchez l’parsing n-gram. Il est utilisé avec succès pour détecter automatiquement le langage du texte et fonctionne étonnamment bien, même sur des textes très courts.

La démo en ligne (qui n’est plus en ligne) a reconnu «bilbomoothof» en anglais et «sdfgbhm342r3f» en népalais. Il renvoie probablement toujours la meilleure correspondance, même si elle est très mauvaise. Je pense que vous pouvez l’entraîner à discerner entre «prononçable» et «aléatoire».

Utilisez simplement CAPTCHA dans le cadre du processus d’inscription.

Vous ne pouvez jamais distinguer les noms d’utilisateurs réels des noms d’utilisateurs créés par des robots, sans énerver vos utilisateurs.

Vous allez bloquer les utilisateurs avec des noms bizarres ou non anglais, ce qui les irritera, et les bots continueront à essayer jusqu’à ce qu’ils attrapent un bon nom d’utilisateur (du dictionnaire, ou d’autres sources – c’est très sympa , en passant! ).

EDIT: Vous recherchez la prévention plutôt que l’parsing après coup?

La solution consiste à laisser quelqu’un d’autre gérer les identités de l’utilisateur pour vous. Par exemple, vous pouvez utiliser une petite liste de fournisseurs OpenID (comme SO), une connexion Facebook ou les deux. Vous saurez que les utilisateurs sont réels et qu’ils ont résolu au moins un CAPTCHA.

EDIT: une autre idée

Recherchez la chaîne dans Google et vérifiez le nombre de correspondances trouvées. Ne devrait pas être votre seul outil, mais c’est aussi un bon indicateur. Les chaînes aléatoires, bien sûr, devraient avoir peu ou pas de correspondances.

Au sumt de ma tête, vous pourriez chercher des syllabes, en utilisant soundex . C’est la direction que j’explorerais, basée sur l’hypothèse qu’un mot prononçable a au moins une syllabe.

EDIT: Voici une fonction pour compter les syllabes:

 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('/[^az]/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 ce lien très intéressant:

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

Réponse à la question n ° 1:

Malheureusement, cela ne peut pas être fait, puisque la fonction de complexité de Kolmogorov n’est pas calculable, vous ne pouvez donc pas générer un tel algorithme à moins d’appliquer certaines règles au domaine des noms d’utilisateurs possibles. difficile à faire.

PS: Après avoir posté cette réponse, je suis tombé sur un service qui donnait une idée de la ressortingction de domaine de nom d’utilisateur, laisser aux utilisateurs utiliser la boîte aux lettres de domaine public bien connu comme noms d’utilisateur.

Vous pouvez utiliser un réseau neuronal pour évaluer si le pseudonyme ressemble à un surnom en langage naturel.

Assemblez deux ensembles de données: l’un des surnoms valides et l’un des pseudo-générés. Entraînez un simple réseau neuronal à couche cachée rétro-progressive avec les valeurs de caractères comme entrées. Le neural network apprendra à distinguer les chaînes telles que “zrgssgbt” et “zargbyt”, puisque ces dernières ont des consonnes et des voyelles mélangées.

Il est important d’utiliser des exemples réels pour obtenir un bon discriminateur.

Je ne connais pas les algorithmes existants pour ce problème, mais je pense qu’il peut être attaqué de l’une des manières suivantes:

  • votre bot peut être une bêtise, mais vous pouvez conserver une liste de syllabes, ou plus précisément des phonèmes, que vous pouvez essayer de trouver dans votre chaîne donnée. Mais cela semble un peu difficile parce que vous devez segmenter la corde dans des endroits différents, etc.
  • il y a 5 voyelles dans l’alphabet anglais et 21 autres. Vous pourriez supposer que si elles étaient générées aléatoirement, alors approximativement vous vous attendriez à ce que 5/26 * W, (où W est la longueur du mot) des lettres qui sont des voyelles, et des écarts significatifs pourraient être suspects. (Si lettre est incluse alors 5/31 et ainsi de suite ..) Vous pouvez essayer de construire sur cette idée en recherchant des doubletons, et en essayant de vous assurer que chaque doublet se produit avec la même probabilité, etc.
  • de plus, vous pouvez essayer de segmenter votre chaîne d’entrée autour des voyelles, par exemple trois lettres avant une voyelle et trois lettres après une voyelle, et essayer de savoir si elle fait un son reconnaissable en comparant avec les phonèmes.

En russe, nous avons des syllabes interdites, comme ГЙ , а ou Ь après une voyelle et ainsi de suite.

Cependant, les robots de spam utilisent simplement la firebase database des noms, c’est pourquoi ma boîte de réception de spam contient des noms étranges que vous ne pouvez rencontrer que dans les livres d’histoire.

Je m’attends à ce que l’anglais ait aussi des histogrammes de dissortingbution de syllabes (comme ETAOIN SHRDLU , mais pour des syllabes de deux lettres ou même de trois lettres), et avoir une densité critique de syllabes basse fréquence dans un nom est certainement un signe.

Notez que de nombreux grands sites suggèrent des noms d’utilisateur comme [first init] [init méd] [nom] [nombre]. Les utilisateurs portent ensuite ces noms d’utilisateurs sur d’autres sites, et les trois premières lettres ne sont certainement pas prononçables.