Question

J'ai une fissure au filtrage de blasphèmes pour un forum Web écrit en Python.

Dans le cadre de cela, j'essaie d'écrire une fonction qui prend un mot et renvoie toutes les orthographes simulées 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 m'attends à ce que je puisse étendre cette liste au fil du temps pour couvrir la créativité des gens, mais y a-t-il une liste flottant n'importe où sur Internet que je pourrais utiliser comme point de départ?

Était-ce utile?

La solution

Ceci est probablement à la fois beaucoup plus profond que vous avez besoin, mais pas assez large pour couvrir votre cas d'utilisation, mais le consortium Unicode a dû faire face aux attaques contre les noms de domaine internationalisés et a trouvé cette liste d'homographes (personnages avec le même ou similaire le rendu):

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

Pourrait faire un point de départ au moins.

Autres conseils

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

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

J'ai créé une classe Python pour faire exactement cela, basé sur le lien Unicode de Robin pour "confus"

https://github.com/wanderingstan/confusables

Par exemple, "Hello" serait élargi dans l'ensemble 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\ℴ\𝐨\𝑜\𝒐\𝓸\𝔬\𝕠\𝖔\𝗈\𝗼\𝘰\𝙤\𝚘\ᴏ\ᴑ\ꬽ\ο\𝛐\𝜊\𝝄\𝝾\𝞸\σ\𝛔\𝜎\𝝈\𝞂\𝞼\ⲟ\о\ჿ\օ\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\ഠ\ဝ\𐓪\𑣈\𑣗\𐐬\‎\ø\ꬾ\ɵ\ꝋ\ө\ѳ\ꮎ\ꮻ\ꭴ\‎\ơ\œ\ɶ\∞\ꝏ\ꚙ\ൟ\တ]

Ce regexp correspondra à "𝓗℮𝐥1೦"

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

L'approche de Collapsar dans les commentaires me semble bien en principe, mais je pense que vous voudriez utiliser une bibliothèque OCR standard plutôt que d'essayer d'analyser les images vous-même. Pour faire les images, j'utiliserais une police comme quelque chose dans la famille Dejavu, car elle a une bonne couverture de caractères Unicode relativement obscurs.

Un autre moyen facile d'obtenir des données est de regarder les décompositions de personnages "précomposés" comme "à"; Si un personnage peut être décomposé en un ou plusieurs chapitres combinés suivis d'un personnage de base qui ressemble à une lettre anglaise, elle ressemble probablement à une lettre anglaise elle-même.

Rien ne vaut beaucoup de données pour un problème comme celui-ci. Vous pouvez collecter de nombreux bons exemples de substitutions de personnages que les gens ont faites en grattant les bons forums Web. Ensuite, vous pouvez utiliser cette procédure pour en apprendre de nouvelles: d'abord, trouvez des "mots" contenant principalement des caractères que vous pouvez identifier, ainsi que certains que vous ne pouvez pas. Faites un regard du mot, en convertissant tout ce que vous pouvez en lettres régulières et en remplaçant tout le reste ".". Faites ensuite correspondre votre regex contre un dictionnaire, et si vous n'obtenez qu'un seul match, vous avez de très bons candidats pour ce que les personnages inconnus sont censés représenter. (Je n'utiliserais pas réellement un regex pour rechercher un dictionnaire, mais vous avez l'idée.)

Au lieu de forums d'exploitation minière, vous pourrez peut-être utiliser le corpus N-Gram de Google (http://storage.googleapis.com/books/ngrams/books/datasetsv2.html) Au lieu de cela, mais je ne suis pas en mesure de vérifier maintenant s'il contient le type de pseudo-mots dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top