简短:
JAVA /休眠/ AJAX /用SpringMVC
我希望用户发布的每条评论都应该在服务器端读取,然后再将其存储到数据库中,拒绝评论,如果它包含令人反感的文本。
攻击性文本列表相当庞大(可能是数千个)。请查看此示例列表:http://onlineslangdictionary.com/lists/most-vulgar-words/
我想迭代这个列表并执行如下函数并不是那么快。还有其他方法可以更快地完成此过滤吗? 您认为搜索超过千分之一的项目会对资源CPU / RAM产生重大影响吗?欢迎提出任何建议!
for(String offensiveText : offensiveTextList ){
if(commentText.contains(offensiveText )){
//reject comment
}
}
更新: 攻击性项目列表可以包含由其中的几个单词组成的项目(如3个单词的文本,可以包含停用词)。 它甚至可以包含非字母字符,如*& ^%。
如果评论中包含相应的攻击性项目(完全相同的字母),那么它将被视为已拒绝
答案 0 :(得分:6)
您可能需要使用一些自然语言处理库。如果您要将评论中的每个 M 单词与列表中的 N 令人反感的单词进行比较,那么您的算法复杂度将为O(MN) = O(N^2)
,即很高。
看一下Lucene stack,您可能会发现一些非常好的想法,例如如何标记评论并通过删除无意义的单词来减少输入。
答案 1 :(得分:0)
我认为更好的解决方案是将文本中的单词放入Set中,然后检查整个集合以查看交集是否有任何元素。
您还可以检查最常见的英语单词并将其删除(我,等等)
答案 2 :(得分:0)
您准备一个字符串,其中包含一个接一个追加的独特冒犯性词语。
然后检查offensivewordsString.contains(commentedText).
在commentedText中只包含主要词
答案 3 :(得分:0)
单词列表是否也基于语言?也许值得首先只扫描海报的语言,如果它是干净的话允许它们通过,然后在服务器不忙的情况下发布后搜索其他令人反感的外语单词。
答案 4 :(得分:0)
您可以将offensiveWordList加载到某种类型的内存缓存(如HashSet)中,然后将注释文本拆分为单词,然后在HashSet中检查每个单词是否存在。
哈希集查找使用的资源少于每次迭代整个攻击列表的资源。
我假设您的冒犯性词语相对静止 - 如果列表在线更新,请注意线程化。
答案 5 :(得分:0)
将所有令人反感的词汇放入Set;
Set<String> offensiveWords = new HashSet<String>();
删除所有“”,“a”,“by”,“等等......评论中的文字。
按空格字符将评论拆分为String[] word
。
检查Set<String> offenciveWords
是否包含String[] word
它会为您提供更快的性能。