Golang怎么做敏感词过滤_Golang敏感词教程【精通】
敏感词过滤必须用[]rune而非[]byte,避免中文、emoji等被切碎;isEnd需在循环结束后设置;须支持重叠匹配;操作map前必须判nil。敏感词过滤必须用 []rune,别碰 []byte中文、emoji、生僻字在 Go 里不是单字节,[]byte 遍历会切碎字符,导致“王八蛋”变成 [229 165 172 229 165 189 229 174 182],匹配逻辑直接失效——树建对了,查不到;查到了,位置错位。所有敏感词入库、构建前缀树、文本扫描,统一先转 []rune: chars := []rune(text)遍历必须用 for _, r := range word,不是 for i := range word(后者遍历的是 byte 索引)如果硬要走 []byte(比如只处理纯 ASCII 日志),得提前加校验:if !utf8.Valid([]byte(text)) { return err },否则线上一跑中文就漏词isEnd = true 放错位置,敏感词误杀率飙升这是构建前缀树时最隐蔽的坑:把 node.isEnd = true 写在循环内部,会导致“王八蛋”路径上,“王”“王八”“王八蛋”全被标为结尾。结果用户输个“王者”,系统立刻拦截——因为“王”被当成完整敏感词了。正确做法:循环完所有 rune 后,在最终节点设 node.isEnd = true错误写法示例(危险):for _, r := range word {<br> node = node.getChild(r)<br> node.isEnd = true // ? 错!每走一步都标结尾<br>}如需支持“前缀敏感”(如“王八”和“王八羔子”都算违规),必须新增字段如 isPrefix bool,不能复用 isEnd匹配时只返回第一个词?那是没做「重叠匹配」输入“王八羔子坏”,只命中“王八”、漏掉“王八羔子”,说明匹配逻辑一碰到 isEnd == true 就 break 或 return 了——这叫「单次最长匹配」,不是生产可用的敏感词过滤。必须支持从每个起点出发、尽可能向后延展找最长匹配,再回退一位继续扫推荐双指针模式:start 固定,end 推进;找到一个匹配后,start++,重新进树简单场景可用 strings.ReplaceAllFunc + trie.Contains 判断,但性能差、无法定位位置;高并发或长文本务必手写滑动匹配node.Next[c] panic?你忘了判 nil map本地小数据测不出,压测时突然 panic: assignment to entry in nil map,堆栈指向 AddChild 或匹配循环里的 node.children[char]——大概率是 node.Next 是 nil,却直接当 map 用了。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
更多推荐
所有评论(0)