敏感词检测的实现方式可以分为以下几种:
- 基于关键词列表的检测: 这是最常见的敏感词检测方式。首先,建立一个敏感词库,包含各种敏感词汇。然后,遍历待检测的文本,查找是否包含敏感词库中的任何词汇。一旦匹配到敏感词,可以将其过滤、替换或标记为敏感内容。
- 基于正则表达式的检测: 使用正则表达式可以更灵活地匹配敏感词。将敏感词转化为适当的正则表达式,然后在文本中进行匹配。这种方法允许处理模糊匹配和变体。
- 基于机器学习的检测: 使用机器学习技术,可以训练模型来检测敏感内容。需要大量已知的敏感和非敏感文本样本来训练模型。一旦训练完成,模型可以自动识别新的文本中的敏感内容。常见的机器学习算法包括朴素贝叶斯、支持向量机(SVM)和深度学习模型等。
本次我采用的是基于关键词列表检测上升级的方法:
将敏感词库做成 前缀树 :
- 比如现在有几个敏感词:吊毛吃猪肉、吊毛很帅、你很帅、你很笨、ctm…我们可以将其按照树形结构,构造成这样:
在检测时,循环检测字符串,只要遇到有结束标识(图中绿色的部分),就表明存在敏感词,这样一来,不仅能够节省内存空间,还能够减少判断次数。
(前缀树段来源于摘要的连接,csdn的一篇敏感词文章~如有侵权请联系)
我具体的敏感词检测工具类代码实现如下
/** * 敏感词工具类 */ public class TrieUtils { //通过map保存子树 private Map<Character, TrieUtils> children; private boolean isEnd; public TrieUtils() { children = new HashMap<>(); isEnd = false; } //将敏感词插入到前缀树中 public void insert(String word) { TrieUtils node = this; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); TrieUtils childrenNode = node.children.get(ch); if (childrenNode == null) { node.children.put(ch, new TrieUtils()); } node = node.children.get(ch); } node.isEnd = true; } // 检测文本中是否包含敏感词,并返回第一个匹配到的敏感词 public String detectSensitiveWord(String word, int start) { TrieUtils node = this; StringBuilder detectedWord = new StringBuilder(); for (int i = start; i < word.length(); i++) { char ch = word.charAt(i); TrieUtils childrenNode = node.children.get(ch); if (childrenNode == null) { // 说明后面没有匹配的了 break; } else { detectedWord.append(ch); node = childrenNode; if (node.isEnd) { return detectedWord.toString(); // 返回检测到的敏感词 } } } return null; // 没有匹配到敏感词 } //检查一个单词是否存在敏感词 public String sensitiveWord(String word) { //不断向前移动检查 for (int i = 0; i < word.length(); i++) { if (!Objects.isNull(detectSensitiveWord(word, i))) { return detectSensitiveWord(word, i); } } return null; } }
使用方法也很简单:
TrieUtils trie = new TrieUtils();//new敏感词前缀树对象 for (String s : SensitiveList) { trie.insert(s);//便利敏感词集合(敏感词可以存放在数据库中,需要的时候查询出来),把敏感词添加到前缀树中 } if (!Objects.isNull(trie.sensitiveWord(entity))) {//调用sensitiveWord方法,传入你需要检测的文章内容 return AjaxResult.error("包含敏感字符:" + trie.sensitiveWord(entity) + ",请修改");//如果有敏感词就会把检测到的第一个敏感词返回给前端 }
谢谢浏览~