74 votes

Y a-t-il un moyen de détecter des chaînes de caractères comme putjbtghguhjjjanika ?

Les gens font des recherches sur mon site web et certaines de ces recherches sont celles-là :

tapoktrpasawe
qweasd qwa as
ae qwo ak kqw
qwe qwe qwe a

Ma question est la suivante : existe-t-il un moyen de détecter les chaînes de caractères similaires à celles ci-dessus ?

Je suppose qu'il est impossible de les détecter à 100%, mais toute solution sera la bienvenue :)

edit : Je veux dire les "recherches de charabia". Par exemple, certaines personnes recherchent des chaînes comme "asdqweasdqw", "paykaprkg", "iwepr wepr ow" dans mon moteur de recherche, et je veux détecter les recherches en charabia.

Peu importe si le résultat de la recherche sera 0 ou autre. Je ne peux pas utiliser cette logique.

Certaines nouvelles marques ou nouveaux produits seront ignorés si je les considère comme des "mots ordinaires".

Merci pour votre aide

4 votes

Qu'essayez-vous exactement de détecter ? Nous avons besoin de plus d'informations si nous voulons vous aider.

0 votes

Même Google n'a pas donné de résultat pour ce put#@@. Alors quel résultat donnez-vous ? :-)

0 votes

Vous pourriez peut-être mettre un vérificateur d'orthographe dans votre formulaire de recherche.

178voto

Rob Neuhaus Points 5522

Vous pourriez construire un modèle de transitions de personnage à personnage à partir d'un tas de textes en anglais. Par exemple, vous pouvez déterminer dans quelle mesure il est courant d'ajouter un "h" après un "t" (assez courant). En anglais, on s'attend à ce qu'après un "q", on obtienne un "u". Si vous obtenez un 'q' suivi d'autre chose qu'un 'u', cela se produira avec une très faible probabilité, et cela devrait donc être assez alarmant. Normalisez les comptes dans vos tables afin d'obtenir une probabilité. Ensuite, pour une requête, parcourez la matrice et calculez le produit des transitions que vous prenez. Puis normalisez par la longueur de la requête. Si le nombre est faible, vous avez probablement une requête en charabia (ou quelque chose dans une autre langue).

Si vous disposez d'un grand nombre de journaux de requêtes, vous pouvez d'abord créer un modèle de texte anglais général, puis pondérer fortement vos propres requêtes dans cette phase d'apprentissage du modèle.

Pour en savoir plus, lisez les articles suivants Chaînes de Markov .

Edit, j'ai implémenté ceci ici en Python :

https://github.com/rrenaud/Gibberish-Detector

et buggedcom l'a réécrit en PHP :

https://github.com/buggedcom/Gibberish-Detector-PHP

my name is rob and i like to hack True
is this thing working? True
i hope so True
t2 chhsdfitoixcv False
ytjkacvzw False
yutthasxcvqer False
seems okay True
yay! True

17 votes

+1 pour avoir répondu à la question au lieu de vous tordre les mains et d'être généralement un nigaud comme tout le monde dans ce fil :).

3 votes

Laisser entendre que les chaînes de Markov sont le "fond" de la technique que vous utilisez donne l'impression que vous faites quelque chose de beaucoup plus sophistiqué que ce que vous faites réellement. Le lecteur n'a pas besoin de connaître les chaînes de Markov pour comprendre votre solution.

0 votes

Je ne considère pas cette réponse comme pertinente car elle n'est pas dans le langage de script souhaité.

9voto

Vous pourriez faire ce que fait Stackoverflow y calculer l'entropie de la chaîne .

Bien entendu, il ne s'agit que d'une des nombreuses heuristiques utilisées par SO pour déterminer les réponses de mauvaise qualité, et il ne faut pas s'y fier à 100 %.

0 votes

C'est probablement la meilleure réponse ici - la plupart des gens viennent probablement sur ce sujet afin de trouver un moyen de détecter les entailles invalides.

8voto

En supposant que vous voulez dire des recherches en charabia... Ce serait plus d'ennuis que ça n'en vaut la peine. Vous leur fournissez une fonctionnalité de recherche, laissez-les l'utiliser comme bon leur semble. Je suis sûr qu'il existe des algorithmes qui détectent les groupes de caractères étranges, mais cela demanderait probablement plus de ressources et de travail que de ne renvoyer aucun résultat.

8voto

mhucka Points 310

J'ai dû résoudre un problème très proche pour un projet d'extraction de code source, et bien que le paquet soit écrit en Python et non en PHP, il m'a semblé utile de le mentionner ici au cas où il pourrait être utile d'une manière ou d'une autre. Le paquet est Nostril (pour "Nonsense String Evaluator") et il vise à déterminer si les chaînes extraites pendant l'exploration du code source sont susceptibles d'être des identifiants de classe/fonction/variable/etc. ou du charabia aléatoire. Il fonctionne bien sur du texte réel aussi, pas seulement sur des identifiants de programmes. Nostril utilise des n-grams (similaires au Gibberish Detector de la réponse de Rob Neuhaus ) en combinaison avec une TF-IDF fonction de notation. Il est livré préformé et prêt à être utilisé dès sa sortie de la boîte.

Exemple : le code suivant,

from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

produira le résultat suivant :

bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense

Le projet est sur GitHub et les contributions sont les bienvenues.

5voto

John Points 12438

Je pense qu'on peut détecter ces chaînes de la même manière que les "mots réguliers". C'est juste une correspondance de motifs, non ?

Quant à pourquoi les utilisateurs recherchent ces chaînes, c'est la grande question. Il est peut-être possible d'endiguer les recherches de charabia d'une autre manière. Par exemple, si ce sont des phrases de spam de commentaire que les gens (ou un script) recherchent, alors installez un CAPTCHA.

Modifier : Une autre façon de contourner l'interprétation de l'entrée est de l'étrangler légèrement. Autorisez une recherche toutes les 10 secondes environ. (Je me souviens avoir vu cela sur les logiciels de forum, ainsi qu'à divers endroits sur SO.) Cela enlèvera un peu de plaisir à la recherche de sdfpjheroptuhdfj encore et encore, tout en ne gênant pas les utilisateurs qui cherchent et trouvent leurs produits.

0 votes

La plupart des visiteurs sont des enfants, alors ils le font tout simplement. Le CAPTCHA n'est pas une solution utile pour le mettre avant chaque recherche. Certaines nouvelles marques ou produits seront ignorés si je considère les "mots ordinaires". Merci pour votre aide

0 votes

CAPTCHA n'est pas ce dont il a besoin. Pourquoi rendre la vie difficile aux utilisateurs qui font une recherche correcte, puisque les recherches en charabia ne sont pas si nuisibles que ça.

0 votes

Si c'est le cas, vous pouvez vous en sortir en limitant (légèrement) les recherches, c'est-à-dire en autorisant une recherche toutes les 10 secondes environ. Cela enlèvera un peu de plaisir à la recherche de sdfgbpoisdfbijhaoi encore et encore, mais n'auront aucun impact sur les personnes qui cherchent et trouvent réellement ce dont elles ont besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X