web-dev-qa-db-de.com

Gibt es eine Liste von Zeichen, die englischen Buchstaben ähneln?

Ich habe einen Riesenhieb bei der profanen Filterung eines in Python geschriebenen Webforums.

Als Teil davon versuche ich, eine Funktion zu schreiben, die ein Wort übernimmt und alle möglichen Schein-Schreibweisen dieses Wortes zurückgibt, die visuell ähnliche Zeichen anstelle bestimmter Buchstaben verwenden (z. B. s † å © køv € rƒ | øw).

Ich gehe davon aus, dass ich diese Liste im Laufe der Zeit erweitern muss, um die Kreativität der Menschen zu berücksichtigen. Gibt es eine Liste im Internet, die ich als Ausgangspunkt verwenden könnte?

26
Paul D. Waite

Dies ist wahrscheinlich weitaus tiefer, als Sie benötigen, aber nicht breit genug, um Ihren Anwendungsfall abzudecken. Das Unicode-Konsortium musste sich jedoch mit Angriffen auf internationalisierte Domain-Namen befassen und diese Liste von Homographen (Charaktere mit dem gleichen oder ähnlichem) erstellen Rendern):

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

Könnte zumindest einen Ausgangspunkt bilden.

32

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

Es ist viel weniger umfassend, aber verständlicher. 

12
spnzr

Ich habe eine Python-Klasse erstellt, um genau dies zu tun, basierend auf Robins Unicode-Link für "Confusables"

https://github.com/wanderingstan/Confusables

Zum Beispiel würde "Hello" in den folgenden Satz von Regex-Zeichenklassen erweitert:

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

Dieser Regex passt gegen "???? ℮ ???? 1೦"

3
Stan James

Ich habe keine Lösung an sich, aber ich habe einige Ideen.

Der Ansatz von @ collapsar in den Kommentaren klingt prinzipiell gut für mich, aber ich denke, Sie möchten eine Standard-OCR-Bibliothek verwenden, anstatt zu versuchen, die Bilder selbst zu analysieren. Um die Bilder zu erstellen, würde ich eine Schriftart wie etwas aus der DejaVu-Familie verwenden, da sie relativ unscheinbare Unicode-Zeichen gut abdeckt.

Eine andere einfache Möglichkeit, Daten zu erhalten, besteht darin, die Zerlegungen "vorkomponierter" Zeichen wie "à" zu betrachten. Wenn ein Zeichen in ein oder mehrere kombinierte Kapitel zerlegt werden kann, gefolgt von einem Basiszeichen, das wie ein englischer Buchstabe aussieht, sieht es wahrscheinlich wie ein englischer Buchstabe selbst aus.

Nichts geht über viele Daten für ein solches Problem. Sie könnten viele gute Beispiele für Charaktersubstitutionen sammeln, die von den richtigen Webforen erstellt wurden. Dann können Sie dieses Verfahren verwenden, um neue zu erlernen: Suchen Sie zunächst nach "Wörtern", die hauptsächlich Zeichen enthalten, die Sie identifizieren können, und andere, die Sie nicht identifizieren können. Machen Sie aus dem Word einen Regex, indem Sie alles, was Sie können, in normale Buchstaben umwandeln und alles andere durch "." Ersetzen. Dann vergleichen Sie Ihren Regex mit einem Wörterbuch, und wenn Sie nur einen Treffer erhalten, haben Sie einige sehr gute Kandidaten für das, was die unbekannten Zeichen darstellen sollen. (Ich würde eigentlich keine Regex verwenden, um ein Wörterbuch zu durchsuchen, aber Sie haben die Idee.)

Anstelle von Mining-Foren können Sie möglicherweise auch den N-Gram-Corpus von Google ( http://storage.googleapis.com/books/ngrams/books/datasetsv2.html ) verwenden. Dies kann ich jedoch nicht Prüfen Sie jetzt, ob es die Art von Pseudo-Wörtern enthält, die Sie benötigen.

0
John Williams