使用正则表达式的亵渎过滤器(100个单词的列表)

Bud*_*Joe 6 regex language-agnostic profanity

从给定的字符串中删除亵渎单词的正确方法是什么:
1)我有一个在字符串数组中要查找的100个单词的列表.2)处理部分单词的正确方法是什么?大多数人如何处理这个问题?例如,质量这个词.然后有时候一个部分词也很糟糕 - 假设foobar是一个非常亵渎的词我可能想要禁止foobar和foobar*和*foobar.

那么你把所有单词放在一个表达式中还是循环遍历列表?

解决问题的正确方法是什么?我正在使用Groovy/Grails,但欢迎任何现代语言示例.

Bri*_*lli 7

这是一个很难解决的问题,您需要确定正则表达式是否适合您以及您如何处理嵌入(当您将字典词添加到像 frackface 这样的亵渎性词时,除了真正的 F 词时)。

正则表达式通常对它们的长度有限制,这通常会阻止您对所有单词使用单个正则表达式。对一个字符串执行多个正则表达式真的很慢,这取决于您需要什么样的性能以及您的黑名单有多大。我们最初将CleanSpeak实现为一个正则表达式系统,但它没有扩展,我们使用不同的机制对其进行了重写。

您还需要考虑短语、标点符号、空格、leet-speak 和其他语言。所有这些都使正则表达式作为解决方案的吸引力降低。以下是一些使用 hello 一词的示例(假设它是本练习中的脏话):

  • 项目清单
  • 你好
  • 你好
  • 你好
  • |-|你好
  • h3llo
  • “你好”(这个短语可能不包含任何亵渎的词,但结合起来是亵渎的)

您还需要处理两个或多个字典(白名单)单词在彼此相邻时包含脏话的边缘情况。一些包含 s 字的例子:

  • 猛击它
  • ssh 现在是安静的时间

这些显然不是亵渎,但大多数本土和许多商业解决方案都存在这些案例的问题。

在过去的 3 年中,我们一直在完善CleanSpeak使用的过滤器,以确保它能够处理所有这些情况,并且我们会继续对其进行调整并使其变得更好。我们还花了 8 个月的时间完善我们的系统以提高性能,它每秒可以处理大约 5,000 条消息。并不是说你不能构建一些可用的东西,而是准备好处理可能出现的很多问题,并创建一个不使用正则表达式的系统。


kel*_*oti 4

  1. 将每个单词连接成单词列表 -(foobar|foobaz|...)
  2. 然后在分组的两侧放置警卫以防止无关的字符

    [^!@#$%^&*]*(foobar|foobaz|foofii)[^!@#$%^&*]*

另外,您可能需要使用不区分大小写的标志,以便它也可以匹配 FooBaz 和 fOObaR 等单词。

就性能而言,将其连接为一个大正则表达式可能是最快的(尽管我不是专家)。正则表达式算法在搜索和处理分支条件方面非常有效。基本上,它必须优于O(mn)(其中m是字数,n是您正在搜索的文本大小)