- Published on
敏感词过滤的实现方案
- Authors
- Name
- Shelton Ma
1. 常用方案
- 关键词匹配 (Keyword Matching)
- 使用预定义的敏感词库,匹配并屏蔽关键词.
- 适合速度快、关键词固定的场景.
- 示例场景:暴力、色情、政治敏感等词汇过滤.
- 正则表达式 (Regex Filtering)
- 处理变体、隐晦或故意混淆的词汇.
- 示例场景:脏话、拼音变种、带特殊符号的敏感词.
- NLP 模型检测 (NLP Model Filtering)
- 使用预训练模型检测更复杂的上下文敏感内容.
- 示例场景:煽动性言论、歧视、极端情绪等.
- 黑白名单机制
- 黑名单:拦截指定的违规词汇.
- 白名单:允许特定场景下的敏感词(如“武器”在游戏领域合法).
2. 性能优化
由于敏感词检测通常属于高频操作,以下措施可提升性能
将敏感词构建成 Trie 树,支持快速前缀匹配,效率高于循环或 includes().
Trie 树示例
class TrieNode { children: Record<string, TrieNode> = {}; isEndOfWord = false; } class Trie { root: TrieNode; constructor() { this.root = new TrieNode(); } insert(word: string) { let node = this.root; for (const char of word) { if (!node.children[char]) { node.children[char] = new TrieNode(); } node = node.children[char]; } node.isEndOfWord = true; } search(text: string): boolean { let node = this.root; for (const char of text) { if (node.children[char]) { node = node.children[char]; if (node.isEndOfWord) return true; } else { node = this.root; } } return false; } } // 示例 const trie = new Trie(); ['赌博', '暴力'].forEach(word => trie.insert(word)); console.log(trie.search("这是一段包含赌博的信息")); // true console.log(trie.search("这是一段安全的信息")); // false
缓存优化
- 使用 Redis 缓存已处理的文本,避免重复扫描.
- 对于高频短句可采用 LRU 缓存.
批量检测
- 将多条消息合并后批量检测,减少 API 调用次数.
- 示例:将用户多次发送的内容合并成一条再检测.
异步并行处理
- 使用 Promise.all() 提高多条内容的检测效率.
3. Trie 树
Trie 树是一种专门处理字符串检索的数据结构,适用于快速查找、自动补全、敏感词过滤
等场景
性能优化
- 批量构建 Trie 树:避免逐个插入,减少 I/O 开销.
- Trie + Redis 缓存:将 Trie 树转换为 JSON 格式存储,利用 Redis 提升查询速度.
- 文本预处理:统一转小写、去除空格/标点,降低匹配失败率.