web-dev-qa-db-fra.com

Existe-t-il une liste de caractères ressemblant aux lettres anglaises?

J'ai un problème de filtrage grossier pour un forum Web écrit en Python.

Dans ce cadre, j'essaie d'écrire une fonction qui prend un mot et renvoie toutes les orthographes factices possibles de ce mot qui utilisent des caractères visuellement similaires à la place de lettres spécifiques (par exemple, s † å © køv € rƒ | øw).

Je pense que je devrai étendre cette liste au fil du temps pour couvrir la créativité des gens, mais existe-t-il une liste flottant sur Internet que je pourrais utiliser comme point de départ?

26
Paul D. Waite

C’est probablement à la fois beaucoup plus profond que ce dont vous avez besoin, mais pas assez large pour couvrir votre cas d’utilisation, mais le consortium Unicode a dû faire face à des attaques contre des noms de domaine internationalisés et a dressé cette liste d’homographes (caractères avec les mêmes le rendu):

http://www.unicode.org/Public/security/latest/confusables.txt

Pourrait faire un point de départ au moins.

32
Robin Whittleton

http://en.wikipedia.org/wiki/Letterlike_Symbols

C'est beaucoup beaucoup moins complet mais plus compréhensible. 

12
spnzr

J'ai créé une classe python pour faire exactement cela, basé sur le lien unicode de Robin pour "confusables"

https://github.com/wanderingstan/Confusables

Par exemple, "Hello" serait développé dans le jeu suivant de classes de caractères regexp:

[H\H\ℋ\ℌ\ℍ\????\????\????\????\????\????\????\????\????\????\Η\????\????\????\????\????\Ⲏ\Н\Ꮋ\ᕼ\ꓧ\????\Ⱨ\Ң\Ħ\Ӊ\Ӈ][e\℮\e\ℯ\ⅇ\????\????\????\????\????\????\????\????\????\????\????\????\ꬲ\е\ҽ\ɇ\ҿ][l\‎\|\∣\⏽\│1\‎\۱\????\‎\????\????\????\????\????I\I\Ⅰ\ℐ\ℑ\????\????\????\????\????\????\????\????\????\????\????\Ɩ\l\ⅼ\ℓ\????\????\????\????\????\????\????\????\????\????\????\????\????\ǀ\Ι\????\????\????\????\????\Ⲓ\І\Ӏ\‎\‎\‎\‎\‎\‎\‎\‎\ⵏ\ᛁ\ꓲ\????\????\????\‎\‎\ł\ɭ\Ɨ\ƚ\ɫ\‎\‎\‎\‎\ŀ\Ŀ\ᒷ\????\⒈\‎\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\‎\????\⒒\Ⅲ\????\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙][l\‎\|\∣\⏽\│1\‎\۱\????\‎\????\????\????\????\????I\I\Ⅰ\ℐ\ℑ\????\????\????\????\????\????\????\????\????\????\????\Ɩ\l\ⅼ\ℓ\????\????\????\????\????\????\????\????\????\????\????\????\????\ǀ\Ι\????\????\????\????\????\Ⲓ\І\Ӏ\‎\‎\‎\‎\‎\‎\‎\‎\ⵏ\ᛁ\ꓲ\????\????\????\‎\‎\ł\ɭ\Ɨ\ƚ\ɫ\‎\‎\‎\‎\ŀ\Ŀ\ᒷ\????\⒈\‎\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\‎\????\⒒\Ⅲ\????\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙][o\ం\ಂ\ം\ං\०\੦\૦\௦\౦\೦\൦\๐\໐\၀\‎\۵\o\ℴ\????\????\????\????\????\????\????\????\????\????\????\????\ᴏ\ᴑ\ꬽ\ο\????\????\????\????\????\σ\????\????\????\????\????\ⲟ\о\ჿ\օ\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\ഠ\ဝ\????\????\????\????\‎\ø\ꬾ\ɵ\ꝋ\ө\ѳ\ꮎ\ꮻ\ꭴ\‎\ơ\œ\ɶ\∞\ꝏ\ꚙ\ൟ\တ]

Cette expression rationnelle correspondra à "???? ℮ ???? 1೦"

3
Stan James

Je n'ai pas de solution en soi, mais j'ai des idées.

L'approche de @ collapsar dans les commentaires me semble bonne en principe, mais je pense que vous voudriez utiliser une bibliothèque d'OCR sur étagère plutôt que d'essayer d'analyser les images vous-même. Pour créer les images, j'utiliserais une police ressemblant à quelque chose de la famille DejaVu, car elle couvre bien les caractères Unicode relativement obscurs.

Un autre moyen simple d’obtenir des données consiste à examiner les décompositions de caractères "précomposés" comme "à"; si un personnage peut être décomposé en un ou plusieurs chapitres combinés suivis d'un caractère de base ressemblant à une lettre anglaise, il ressemble probablement à une lettre anglaise elle-même.

Rien ne vaut beaucoup de données pour un problème comme celui-ci. Vous pouvez rassembler beaucoup de bons exemples de substitutions de personnages que des personnes ont effectuées en grattant les forums Web appropriés. Vous pouvez ensuite utiliser cette procédure pour en apprendre de nouveaux: d’abord, recherchez des "mots" contenant principalement des caractères que vous pouvez identifier, ainsi que d’autres que vous ne pouvez pas. Créez une expression rationnelle à partir de Word, convertissez tout ce que vous pouvez en lettres ordinaires et remplacez tout le reste par ".". Ensuite, associez votre expression rationnelle à un dictionnaire, et si vous n'obtenez qu'une correspondance, vous avez de très bons candidats pour ce que les caractères inconnus sont supposés représenter. (Je n'utiliserais pas réellement un regex pour chercher dans un dictionnaire, mais vous avez l'idée.)

Au lieu d'exploiter des forums, vous pourrez peut-être utiliser le corpus n-gramme de Google ( http://storage.googleapis.com/books/ngrams/books/datasetsv2.html ), mais je ne suis pas en mesure de vérifiez maintenant si elle contient le type de pseudo-mots dont vous avez besoin.

0
John Williams