【问题标题】:Is there a list of characters that look similar to English letters?是否有与英文字母相似的字符列表?
【发布时间】:2012-02-29 00:20:42
【问题描述】:

我正在为一个用 Python 编写的网络论坛过滤脏话。

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

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

【问题讨论】:

  • 我无法回答这个问题,但我不会使用返回一个单词所有可能的模拟拼写的函数。这可能非常多。相反,我会在查找坏词列表之前对帖子中的每个单词进行规范化,即在查找之前将“s†å©køv€rƒ|øw”转换为“stackoverflow”。
  • 相关但不完全重复:stackoverflow.com/questions/4846365/…
  • @PaulD.Waite:不,我不会。它不能解决问题,它只是一个旁注。您仍然需要有关字符映射的数据,这是这里的主要问题。 (而且我认为你的问题是完全有效的,而且很切题。)
  • 有一些脚本和程序可以使单词变得更简单(切换大小写并将 o 替换为 0,3 替换为 e,等等。我先看看这些。
  • 这个想法突然出现在我的脑海中——它既没有经过彻底的分析,也没有经过任何方式的测试。但是,如何 1. 选择一种字体 2. 创建所有字形的位图渲染 3. 定义位图的相似性度量(简单的一个:在标准边界框内的所有网格位置上相等与不同位值的比例)。 4. 计算字符对的相似度矩阵 5. 对字形进行相应的聚类 6. 为每个聚类选择一个代表(理想情况下,这些代表将作为 a-zA-Z0-9 出现)。然后过滤相当于将每个字符映射到正确的集群代表和字典查找。

标签: python unicode glyph profanity


【解决方案1】:

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

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

至少可以做一个起点。

【讨论】:

  • 优秀。我需要一些在视觉上与大写字母 E 无法区分的东西,但会出现在任何普通的英语单词之后。 “MATHEMATICAL SANS-SERIF CAPITAL E”是完美的(在我的例子中是字体。)
【解决方案2】:

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

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

【讨论】:

  • 等一下是哪一个?
  • 我认为综合性和可理解性是独立的品质?
  • 全面的:包含来自许多来源的大量信息和细节。可理解的:可以理解的。
【解决方案3】:

我创建了一个 python 类来做到这一点,基于 Robin 的“易混淆”的 unicode 链接

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೦”

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多