53

我正在为一个用 Python 编写的网络论坛进行亵渎过滤。

作为其中的一部分,我正在尝试编写一个函数,该函数接受一个单词,并返回该单词的所有可能的模拟拼写,这些拼写使用视觉上相似的字符代替特定的字母(例如 s†å©køv€rƒ|øw)。

我希望随着时间的推移,我将不得不扩展这个列表以涵盖人们的创造力,但是互联网上的任何地方是否有一个列表可供我用作起点?

4

4 回答 4

59

这可能比您需要的要深得多,但还不足以涵盖您的用例,但是 Unicode 联盟不得不处理针对国际化域名的攻击,并提出了这个同形异义词列表(具有相同或相似的字符渲染):

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

至少可以做一个起点。

于 2012-04-09T13:06:44.383 回答
16

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

它的全面性要低得多,但更容易理解。

于 2013-12-12T18:16:08.170 回答
5

我创建了一个 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೦”

于 2018-02-01T05:27:20.030 回答
0

我本身没有解决方案,但我有一些想法。

@collapsar 在评论中的方法原则上对我来说听起来不错,但我认为您希望使用现成的 OCR 库而不是尝试自己分析图像。为了制作图像,我会使用 DejaVu 系列中的字体,因为它可以很好地覆盖相对晦涩的 Unicode 字符。

另一种获取数据的简单方法是查看“预组合”字符(如“à”)的分解;如果一个字符可以分解为一个或多个组合章节,然后是一个看起来像英文字母的基本字符,它可能看起来像一个英文字母本身。

对于这样的问题,没有什么比大量数据更好的了。通过抓取正确的网络论坛,您可以收集到很多人们所做的字符替换的好例子。然后你可以使用这个程序来学习新的:首先,找到包含大部分你可以识别的字符的“单词”,以及一些你不能识别的字符。从单词中创建一个正则表达式,将所有可以转换的内容转换为常规字母,并将其他所有内容替换为“.”。然后将您的正则表达式与字典进行匹配,如果您只得到一个匹配项,那么对于未知字符应该代表的内容,您有一些非常好的候选者。(我实际上不会使用正则表达式来搜索字典,但你明白了。)

除了挖掘论坛,您也许可以使用 Google 的 n-gram 语料库 ( http://storage.googleapis.com/books/ngrams/books/datasetsv2.html ),但我现在无法检查是否它包含您需要的那种伪词。

于 2017-10-25T22:47:50.417 回答