3

简而言之:

JAVA/休眠/AJAX/SpringMVC

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

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

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

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

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

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

4

6 回答 6

6

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

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

另请参阅论文:“区分事实信息与新闻文章中带有词语或短语的侮辱性或辱骂性信息”

于 2012-08-14T08:25:21.727 回答
0

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

您还可以检查最常见的英语单词并删除它们(I, and, the etc.)

于 2012-08-14T08:11:29.420 回答
0

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

然后检查offensivewordsString.contains(commentedText).

在 commentedText 中将只包含主要词

于 2012-08-14T08:14:33.480 回答
0

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

于 2012-08-14T08:15:20.737 回答
0

您可以将攻击性WordList 加载到某种内存缓存中,例如HashSet,然后将您的评论文本拆分为单词,然后检查HashSet 中的每个单词是否存在。

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

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

于 2012-08-14T08:16:03.143 回答
0
  1. 把你所有的冒犯的话放进Set;

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

  2. 从评论中删除所有 ""the","a","by" "on" 等词。

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

  4. 检查是否Set<String> offenciveWords包含来自的单词String[] word

它会给你更快的性能。

于 2012-08-14T08:23:37.460 回答