我正在为一个用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的Unicode链接"confusables">
https://github.com/wanderingstan/Confusables
例如,"Hello"将扩展到以下一组正则表达式字符类:
[HHℋℌℍ𝐇𝐻𝑯𝓗𝕳𝖧𝗛𝘏𝙃𝙷Η𝚮𝛨𝜢𝝜𝞖ⲎНᎻᕼꓧ𐋏ⱧҢĦӉӇ]
[e℮eℯⅇ𝐞𝑒𝒆𝓮𝔢𝕖𝖊𝖾𝗲𝘦𝙚𝚎ꬲеҽɇҿ]
[l|∣⏽│1۱𐌠𝟏𝟙𝟣𝟭𝟷IIⅠℐℑ𝐈𝐼𝑰𝓘𝕀𝕴𝖨𝗜𝘐𝙄𝙸Ɩlⅼℓ𝐥𝑙𝒍𝓁𝓵𝔩𝕝𝖑𝗅𝗹𝘭𝙡𝚕ǀΙ𝚰𝛪𝜤𝝞𝞘ⲒІӀⵏᛁꓲ𖼨𐊊𐌉łɭƗƚɫŀĿᒷ🄂⒈⒓㏫㋋㍤⒔㏬㍥⒕㏭㍦⒖㏮㍧⒗㏯㍨⒘㏰㍩⒙㏱㍪⒚㏲㍫ljIJ‖∥Ⅱǁ𐆙⒒Ⅲ𐆘㏪㋊㍣Ю⒑㏩㋉㍢ʪ₶ⅣⅨɮʫ㏠㋀㍙]
[l|∣⏽│1۱𐌠𝟏𝟙𝟣𝟭𝟷IIⅠℐℑ𝐈𝐼𝑰𝓘𝕀𝕴𝖨𝗜𝘐𝙄𝙸Ɩlⅼℓ𝐥𝑙𝒍𝓁𝓵𝔩𝕝𝖑𝗅𝗹𝘭𝙡𝚕ǀΙ𝚰𝛪𝜤𝝞𝞘ⲒІӀⵏᛁꓲ𖼨𐊊𐌉łɭƗƚɫŀĿᒷ🄂⒈⒓㏫㋋㍤⒔㏬㍥⒕㏭㍦⒖㏮㍧⒗㏯㍨⒘㏰㍩⒙㏱㍪⒚㏲㍫ljIJ‖∥Ⅱǁ𐆙⒒Ⅲ𐆘㏪㋊㍣Ю⒑㏩㋉㍢ʪ₶ⅣⅨɮʫ㏠㋀㍙]
[oంಂംං०੦૦௦౦೦൦๐໐၀۵oℴ𝐨𝑜𝒐𝓸𝔬𝕠𝖔𝗈𝗼𝘰𝙤𝚘ᴏᴑꬽο𝛐𝜊𝝄𝝾𝞸σ𝛔𝜎𝝈𝞂𝞼ⲟоჿօഠဝ𐓪𑣈𑣗𐐬øꬾɵꝋөѳꮎꮻꭴơœɶ∞ꝏꚙൟတ]
此正则表达式将与"H℮l1೦"匹配
我本身没有解决方案,但我有一些想法。
@collapsar在评论中的方法原则上对我来说听起来不错,但我认为您希望使用现成的 OCR 库,而不是尝试自己分析图像。为了制作图像,我会使用类似于DejaVu系列的字体,因为它可以很好地覆盖相对模糊的Unicode字符。
获取数据的另一种简单方法是查看"预组成"字符(如"à"(的分解;如果一个字符可以分解为一个或多个组合章节,后跟一个看起来像英文字母的基本字符,那么它可能看起来像一个英文字母本身。
对于这样的问题,没有什么比大量数据更胜一筹了。你可以收集很多人们通过抓取正确的网络论坛来替换角色的好例子。然后,您可以使用此过程来学习新单词:首先,找到"单词",其中包含大多数您可以识别的字符,以及一些您无法识别的字符。从单词中创建一个正则表达式,将所有内容转换为常规字母,并将其他所有内容替换为"."。然后将您的正则表达式与字典进行匹配,如果您只得到一个匹配项,那么您就有一些非常好的候选者来表示未知字符应该代表的内容。(我实际上不会使用正则表达式来搜索字典,但你明白了。
你可以使用谷歌的n-gram语料库(http://storage.googleapis.com/books/ngrams/books/datasetsv2.html(,而不是挖掘论坛,但我现在无法检查它是否包含你需要的伪词。
另一个来源,其中包含一些不在 Unicode 列表中的创意选项:
https://www.i2symbol.com/abc-123
单击符号以查看匹配项。