我正在为一个用 Python 编写的网络论坛进行亵渎过滤。
作为其中的一部分,我正在尝试编写一个函数,该函数接受一个单词,并返回该单词的所有可能的模拟拼写,这些拼写使用视觉上相似的字符代替特定的字母(例如 s†å©køv€rƒ|øw)。
我希望随着时间的推移,我将不得不扩展这个列表以涵盖人们的创造力,但是互联网上的任何地方是否有一个列表可供我用作起点?
这可能比您需要的要深得多,但还不足以涵盖您的用例,但是 Unicode 联盟不得不处理针对国际化域名的攻击,并提出了这个同形异义词列表(具有相同或相似的字符渲染):
http://www.unicode.org/Public/security/latest/confusables.txt
至少可以做一个起点。
http://en.wikipedia.org/wiki/Letterlike_Symbols
它的全面性要低得多,但更容易理解。
我创建了一个 python 类来做到这一点,基于 Robin's unicode link for "confusables"
https://github.com/wanderingstan/Confusables
例如,“Hello”将扩展为以下一组正则表达式字符类:
[H\H\ℋ\ℌ\ℍ\\\\\\\\\\\Η\\\\\\Ⲏ\Н\Ꮋ\ᕼ\ꓧ\\Ⱨ\Ң\Ħ\Ӊ\Ӈ]
[e\℮\e\ℯ\ⅇ\\\\\\\\\\\\\ꬲ\е\ҽ\ɇ\ҿ]
[l\\|\∣\⏽\│1\\۱\\\\\\\I\I\Ⅰ\ℐ\ℑ\\\\\\\\\\\\Ɩ\l\ⅼ\ℓ\\\\\\\\\\\\\\ǀ\Ι\\\\\\Ⲓ\І\Ӏ\\\\\\\\\ⵏ\ᛁ\ꓲ\\\\\\ł\ɭ\Ɨ\ƚ\ɫ\\\\\ŀ\Ŀ\ᒷ\\⒈\\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\\\⒒\Ⅲ\\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙]
[l\\|\∣\⏽\│1\\۱\\\\\\\I\I\Ⅰ\ℐ\ℑ\\\\\\\\\\\\Ɩ\l\ⅼ\ℓ\\\\\\\\\\\\\\ǀ\Ι\\\\\\Ⲓ\І\Ӏ\\\\\\\\\ⵏ\ᛁ\ꓲ\\\\\\ł\ɭ\Ɨ\ƚ\ɫ\\\\\ŀ\Ŀ\ᒷ\\⒈\\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\\\⒒\Ⅲ\\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙]
[o\ం\ಂ\ം\ං\०\੦\૦\௦\౦\೦\൦\๐\໐\၀\\۵\o\ℴ\\\\\\\\\\\\\ᴏ\ᴑ\ꬽ\ο\\\\\\σ\\\\\\ⲟ\о\ჿ\օ\\\\\\\\\\\\\\\\\\\\\ഠ\ဝ\\\\\\ø\ꬾ\ɵ\ꝋ\ө\ѳ\ꮎ\ꮻ\ꭴ\\ơ\œ\ɶ\∞\ꝏ\ꚙ\ൟ\တ]
此正则表达式将匹配“℮1೦”
我本身没有解决方案,但我有一些想法。
@collapsar 在评论中的方法原则上对我来说听起来不错,但我认为您希望使用现成的 OCR 库而不是尝试自己分析图像。为了制作图像,我会使用 DejaVu 系列中的字体,因为它可以很好地覆盖相对晦涩的 Unicode 字符。
另一种获取数据的简单方法是查看“预组合”字符(如“à”)的分解;如果一个字符可以分解为一个或多个组合章节,然后是一个看起来像英文字母的基本字符,它可能看起来像一个英文字母本身。
对于这样的问题,没有什么比大量数据更好的了。通过抓取正确的网络论坛,您可以收集到很多人们所做的字符替换的好例子。然后你可以使用这个程序来学习新的:首先,找到包含大部分你可以识别的字符的“单词”,以及一些你不能识别的字符。从单词中创建一个正则表达式,将所有可以转换的内容转换为常规字母,并将其他所有内容替换为“.”。然后将您的正则表达式与字典进行匹配,如果您只得到一个匹配项,那么对于未知字符应该代表的内容,您有一些非常好的候选者。(我实际上不会使用正则表达式来搜索字典,但你明白了。)
除了挖掘论坛,您也许可以使用 Google 的 n-gram 语料库 ( http://storage.googleapis.com/books/ngrams/books/datasetsv2.html ),但我现在无法检查是否它包含您需要的那种伪词。