2011-11-29 80 views
5

从给出的字符串中去除亵渎词的正确方法是什么:
1)我有一个包含100个单词列表的字符串数组。 2)处理部分单词的正确方法是什么?大多数人如何处理这个问题?例如单词mass。然后有时候一个部分词也是不好的 - 假设foobar是一个非常亵渎的词,我可能想要禁止foobar和foobar *和* foobar。使用正则表达式(100字的列表)的亵渎过滤器

那么你把所有的单词放到一个单一的表达式或通过列表循环?

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

+2

检查此链接:http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

寻找斯坎索普问题:http://en.wikipedia .ORG /维基/ Scunthorpe_problem – rossum

回答

2
  1. 串连每一个字成词的列表 - (foobar|foobaz|...)
  2. 然后把警卫分组两侧的多余的字符

    [^[email protected]#$%^&*]*(foobar|foobaz|foofii)[^[email protected]#$%^&*]*

此外,你可能会希望使用不区分大小写的标志,以便它可以匹配像FooBaz和fOObaR这样的词。

就性能而言,将它连接为一个大的正则表达式可能是最快的(尽管我不是专家)。正则表达式算法在搜索&处理分支条件时非常高效。基本上,它一定比O(mn)(其中m是单词的数量,n是你正在寻找的文字大小)

3

这是很解决一个难题,你需要确定是否正则表达式将工作为你和你如何处理嵌入(当你添加一个字典词的亵渎像frackface除了真正的F字)。

正则表达式通常会限制它们可以使用多长时间,这通常会阻止您为所有单词使用单个正则表达式。针对字符串执行多个正则表达式非常慢,具体取决于您需要的性能以及黑名单的大小。我们最初实施CleanSpeak作为正则表达式系统,但它没有扩展,我们使用不同的机制重写它。

您还需要考虑词组,标点符号,空格,leet-speak和其他语言。所有这些使得正则表达式作为解决方案的吸引力较小。下面是使用这个词打招呼一些例子(假设这是这项工作的亵渎):

  • 列表项
  • 你好
  • 你好
  • h_e_l_l_o
  • | - | ELLO
  • h3llo
  • “hello there”(这个短语可能不包含任何亵渎词,但结合他们是亵渎的)

您还需要处理两个或两个以上字典(白名单)字词在彼此相邻时包含亵渎的边缘情况。包含S-词的一些例子:

  • 庆典它
  • SSH是安静的时间

这些显然不是亵渎,但大部分自产自销,许多商业解决方案与这些案件的问题。

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