您如何建议过滤包含大量列表中定义的冒犯性词的评论



简而言之:

JAVA/Hibernate/AJAX/SpringMVC

我希望用户发布的每条评论都应该在服务器端阅读,然后再将其存储到数据库中如果它包含冒犯性文本,则拒绝该评论

令人反感的文本列表非常庞大(可能数千个)。 请看这个示例列表: http://onlineslangdictionary.com/lists/most-vulgar-words/

我想迭代此列表并执行如下所示的函数并不那么快。有没有其他方法可以更快地完成此过滤器?您认为搜索千分之一的项目会对资源 CPU/RAM 产生重大影响吗?欢迎任何建议!

for(String offensiveText : offensiveTextList ){     
    if(commentText.contains(offensiveText )){
         //reject comment
    }
}

更新:冒犯性项目列表可以包含由几个单词组成的项目(如 3 个单词的文本,并且可以包含停用词)。它甚至可以包含非字母字符,如 *&^%。

如果评论包含相应的冒犯性项目(完全相同的字母),则被视为已拒绝

为此,您可能需要使用一些自然语言处理库。如果您要将评论中的每个M个单词与列表中的N个攻击性单词进行比较,那么您的算法复杂性将是O(MN) = O(N^2),这是相当高的。

看看Lucene堆栈,你可能会发现一些非常好的想法,例如如何标记评论并通过删除无意义的单词来减少输入。

另请查看论文:"区分事实信息与新闻文章中带有单词或短语的侮辱性或辱骂性信息"

你准备了一个字符串,一个接一个地附加独特的攻击性单词。

然后检查offensivewordsString.contains(commentedText).

在注释文本中将仅包含主要单词

单词列表是否也基于语言?也许值得先只扫描海报的语言,如果它干净,让他们通过,然后在服务器不忙时发布后安排流程搜索其他令人反感的外语单词。

您可以将冒犯性的单词列表加载到某种内存缓存中,例如HashSet,然后将注释文本拆分为单词,然后检查每个单词是否存在于HashSet中。

与每次遍历整个攻击性列表相比,哈希集查找使用的资源更少。

我假设您的冒犯性词相对静态 - 如果列表在线更新,请注意线程。

我相信更好的解决方案是将文本中的单词放在一个集合中,然后检查整个集合以查看交集是否有任何元素。

您还可以检查最常见的英语单词并删除它们(I和等)。

  1. 把你所有的冒犯性词语都放进 Set 中;

    Set<String> offensiveWords = new HashSet<String>();

  2. 从注释中删除所有"the","a","by","on"等单词。

  3. 按空格字符将您的评论拆分为String[] word

  4. 检查Set<String> offenciveWords是否包含String[] word中的字词

它将为您提供更快的性能。

最新更新