在Python中识别视觉上类似的字符串

时间:2017-01-20 17:35:51

标签: python filter

我正在开发一个python项目,我需要过滤亵渎的单词,我已经有了一个过滤器。唯一的问题是,如果用户切换具有视觉上相似字符的字符(例如pinghello),则过滤器不会将其拾取。有没有什么方法可以找到检测这些单词而无需对每个组合进行硬编码?

4 个答案:

答案 0 :(得分:1)

l331sp33ch翻译成leetspeech并应用简单的levensthein距离怎么样? (你需要先pip install editdistance

import editdistance
try:
    from string import maketrans # python 2
except:
    maketrans = str.maketrans # python 3

t = maketrans("01345", "oleas")
editdistance.eval("h3110".translate(t), 'hello')

结果为0

答案 1 :(得分:0)

也许在视觉上相似的角色和他们可以代表的角色之间建立关系,即

dict = {'3': 'e', '1': 'l', '0': 'o'} #etc....

然后您可以使用它来测试禁用词的数据库。 e.g。

输入:HE11

如果任何字符在dict中有条目,

dict ['h'] #not exists

dict ['e'] #not exists

dict ['1'] ='l'

dict ['1'] ='l'

将它们放在一起形成一个单词,然后搜索您的禁止列表。我不知道这是否是最快的方式,但它是“一种”方式。

我很想知道其他人想出了什么。

*免责声明:我已经做了一年左右的Perl,现在开始学习Python。当我有空的时候。这很难得到。

答案 2 :(得分:0)

线性替换

你会想要适合创新的正字法师的东西。首先,使用其他字符作为外卡,将字母字符与禁止字词的词典进行模式匹配。例如,您的示例将被翻译为“h ... o”,您将与您提出的禁忌词“hello”相匹配。

接下来,您将非字母字符与替换字典进行比较,从而允许常见的外卡字符代表任何内容。例如,星号,连字符和句号可代表任何东西; '4'和'@'代表'A',依此类推。但是,你要从禁忌词的力量来检查,而不是产生所有可能性:翻译是另一种方式。

你会有一点模棱两可,因为有些字符代表多个字母。 “@”可以代替'O'而变得狡猾。另请注意,并非所有字母都在您的常用设置中:您将要处理的是moentary符号(Euro,Yen和Pound都来自字母),以及碰巧类似拉丁字母的外来字母。< / p>

多字符替换

只处理与禁忌词长度相同的单词。你还可以处理缩写吗?有很多组合形式的“h-bomb”,其中禁止的单词仅作为第一个字母出现:效果是亵渎,但匹配更难,尤其是'b'被scharfes-S取代的地方(德语),带有希伯来语或Cryllic字符的'm',以及带有任何圆形的'o'构成整个字体。

<强>上下文

还有一个问题,即某些词语在一个语境中完全合法,但在俚语中亵渎。你是否也计划匹配短语,也许是为一个句子解析触发词?

培训解决方案

如果您需要全面的解决方案,请考虑使用您标记为“好”和“禁忌”的短语和单词训练神经网络,并让它运行一天。这可能需要很多适应性工作,并且增强模型并不是一个难题:添加新的差异化文本并从您离开的位置继续训练。

答案 3 :(得分:0)

感谢所有发布此问题答案的人。欢迎提供更多答案,因为他们可能会帮助其他人。最后,我结束了大卫泽门斯对这个问题的评论。

  

我会使用一个字典或常见变体列表(“sh1t”等),您可以将其保存为纯文本文件或json等,然后读入内存。这将允许您根据需要添加新条目,而与代码本身无关。如果你只关心亵渎,那么列表应该相当小,以维持,并且不太可能出现新的变化。我过去使用过硬编码的dict来表示统计t表(有1500个键/值对),看起来你的问题几乎不需要那么多键。

虽然这仍然意味着所有单词都将被硬编码,但它可以让我更轻松地更新列表。