您如何建议过滤包含巨大列表中定义的攻击性词语的注释

时间:2012-08-14 08:06:30

标签: java spring hibernate search filtering

简短:

JAVA /休眠/ AJAX /用SpringMVC

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

攻击性文本列表相当庞大(可能是数千个)。请查看此示例列表:http://onlineslangdictionary.com/lists/most-vulgar-words/

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

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

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

如果评论中包含相应的攻击性项目(完全相同的字母),那么它将被视为已拒绝

6 个答案:

答案 0 :(得分:6)

您可能需要使用一些自然语言处理库。如果您要将评论中的每个 M 单词与列表中的 N 令人反感的单词进行比较,那么您的算法复杂度将为O(MN) = O(N^2),即很高。

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

另请参阅论文:"Distinguishing Between Factual Information and Insulting or Abusive Messages bearing Words or Phrases in News Articles"

答案 1 :(得分:0)

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

您还可以检查最常见的英语单词并将其删除(我,等等)

答案 2 :(得分:0)

您准备一个字符串,其中包含一个接一个追加的独特冒犯性词语。

然后检查offensivewordsString.contains(commentedText).

在commentedText中只包含主要词

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以将offensiveWordList加载到某种类型的内存缓存(如HashSet)中,然后将注释文本拆分为单词,然后在HashSet中检查每个单词是否存在。

哈希集查找使用的资源少于每次迭代整个攻击列表的资源。

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

答案 5 :(得分:0)

  1. 将所有令人反感的词汇放入Set;

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

  2. 删除所有“”,“a”,“by”,“等等......评论中的文字。

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

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

  5. 中的字词

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