敏感词(敏感词/违禁词/违法词/脏词)检测工具,基于 DFA/AC 算法实现的高性能 Go 敏感词过滤工具框架。
- 🚀 高性能: 支持 DFA 和 AC 自动机两种算法,AC 算法适合生产环境
- 🔄 动态维护: 支持运行时动态添加/删除/替换敏感词,无需重启
- 🛡️ 智能归一化: 内置多种归一化策略,有效防御混淆攻击(大小写、全角、相似字符等)
- 📦 易用性: 丰富的 API 和示例代码,快速接入
- 🔌 灵活加载: 支持内置词库、文件、自定义(DB/http) 等多种加载方式
- 🛠️ 工具函数: 内置邮箱、URL、微信号等敏感信息检测和屏蔽功能
- 🔒 并发安全: 全链路并发安全,支持高并发场景
- ♻️ 资源管理: 支持优雅关闭,避免 goroutine 泄漏
- 🔍 来源追踪: 支持精确追踪每个敏感词所属的词库来源
go-sensitive-word/
├── examples/ # 示例代码目录
│ ├── basic/ # 基础功能演示
│ ├── ac/ # AC 算法示例
│ ├── dynamic/ # 动态维护示例
│ ├── callback/ # 回调加载示例
│ ├── file-load/ # 文件加载示例
│ ├── normalize/ # 归一化配置示例
│ ├── tools/ # 工具函数示例
│ ├── lifecycle/ # 资源管理示例
│ ├── multi-instance/ # 多实例示例
│ ├── word-source/ # 来源追踪示例
│ └── comprehensive/ # 综合功能演示
├── docs/ # 文档目录
│ ├── getting-started.md # 快速开始指南
│ ├── api-reference.md # API 参考文档
│ ├── normalization.md # 归一化功能详解
│ ├── algorithm-guide.md # 算法选择指南
│ ├── word-management.md # 词库管理详解
│ ├── word-loading.md # 词库加载详解
│ ├── word-source-tracking.md # 来源追踪功能详解
│ ├── tools.md # 工具函数详解
│ ├── lifecycle.md # 资源管理详解
│ ├── faq.md # 常见问题
│ └── best-practices.md # 最佳实践
├── internal/ # 内部实现
│ ├── filter/ # 过滤算法(DFA/AC)
│ ├── store/ # 词库存储
│ ├── normalize/ # 文本归一化
│ └── jianfan/ # 繁简转换
├── wordlists/ # 内置敏感词库
├── manager.go # 核心管理器
├── wrapper.go # 归一化包装器
├── tool.go # 工具函数
└── README.md # 本文档
安装
go get -u github.com/LuYongwang/go-sensitive-word@latest使用示例
package main
import (
"fmt"
"time"
sensitive "github.com/LuYongwang/go-sensitive-word"
"log"
)
func main() {
filter, err := sensitive.NewFilter(
sensitive.StoreOption{Type: sensitive.StoreMemory}, // 基于内存
sensitive.FilterOption{Type: sensitive.FilterDfa}, // 基于DFA算法
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
sensitive.DictPolitical,
sensitive.DictViolence,
// ... 其他词库
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
// 动态添加自定义敏感词
err = filter.AddWord("敏感词1", "敏感词2")
if err != nil {
log.Fatalf("添加敏感词发生了错误, err:%v", err)
return
}
// 等待异步处理完成
time.Sleep(100 * time.Millisecond)
text := "这是一段包含敏感词的文本"
// 是否有敏感词
res1 := filter.IsSensitive(text)
fmt.Printf("res1: %v \n", res1)
// 找到所有敏感词
res2 := filter.FindAll(text)
fmt.Printf("res2: %v \n", res2)
// 替换敏感词
res3 := filter.Replace(text, '*')
fmt.Printf("res3: %v \n", res3)
}IsSensitive()- 判断文本中是否存在敏感词FindOne()- 查找文本中的第一个敏感词FindAll()- 查找文本中所有敏感词(去重)FindAllCount()- 查找所有敏感词及其出现次数Replace()- 替换所有敏感词为指定字符Remove()- 从文本中删除所有敏感词
AddWord()/AddWords()- 动态添加敏感词DelWord()/DelWords()- 动态删除敏感词ReplaceWords()- 批量替换敏感词Clear()- 清空词库GetStats()- 获取词库统计信息ExportToString()/ExportToFile()- 导出词库
LoadDictEmbed()- 加载内置嵌入的词库(编译时嵌入)LoadDictPath()- 从文件路径加载词库LoadDictCallback()- 通过回调函数加载词库(支持数据库、Redis等)
LoadDictEmbedWithSource()- 加载内置词库并指定来源标识AddWordsWithSource()- 添加敏感词并指定来源GetWordSources()- 查询单个词的来源列表FindAllWithSource()- 查找敏感词及其来源信息
- 快速开始指南 - 新手入门,5分钟上手
- API 参考文档 - 完整的 API 文档
- 归一化功能详解 - 智能归一化策略说明
- 算法选择指南 - DFA vs AC 算法选择建议
- 词库管理详解 - 动态维护词库指南
- 词库加载详解 - 多种词库加载方式
- 来源追踪详解 - 词库来源追踪功能
- 工具函数详解 - 敏感信息检测和屏蔽
- 资源管理详解 - 生命周期和优雅关闭
- 常见问题 - FAQ 和问题解答
- 最佳实践 - 生产环境部署建议
项目提供了丰富的示例代码,覆盖所有核心功能:
| 示例文件 | 说明 |
|---|---|
| examples/basic/main.go | 基础功能演示(快速入门) |
| examples/ac/main.go | AC 自动机算法使用示例 |
| examples/dynamic/main.go | 动态维护词库功能演示 |
| examples/callback/main.go | 回调函数加载词库示例 |
| examples/file-load/main.go | 从文件加载词库示例 |
| examples/normalize/main.go | 归一化配置示例 |
| examples/tools/main.go | 工具函数使用示例 |
| examples/lifecycle/main.go | 资源管理示例 |
| examples/multi-instance/main.go | 多实例使用示例 |
| examples/word-source/main.go | 来源追踪功能演示 |
| examples/comprehensive/main.go | 综合功能演示 |
运行示例:
# 运行基础示例(快速入门)
go run examples/basic/main.go
# 运行 AC 算法示例
go run examples/ac/main.go
# 运行动态维护示例
go run examples/dynamic/main.go详细示例说明请查看:examples/README.md
- CPU: Apple M1 Pro
- 词库: 2915 个敏感词
- 测试方法: Go benchmark
| 操作 | DFA | AC | 说明 |
|---|---|---|---|
| IsSensitive | 1777 ns/op | 1605 ns/op | 判断是否敏感 |
| FindAll | 1659 ns/op | 1780 ns/op | 查找所有敏感词 |
| Replace | 1781 ns/op | 1899 ns/op | 替换敏感词 |
| 操作 | DFA (Parallel) | AC (Parallel) | 说明 |
|---|---|---|---|
| IsSensitive | 306.3 ns/op | 290.3 ns/op | 并发检测 |
| 操作 | DFA | AC | 提升 |
|---|---|---|---|
| IsSensitive | 621338 ns/op | 551174 ns/op | 1.13x |
| 操作 | 性能 | 说明 |
|---|---|---|
| GetWordSources | 179.8 ns/op | 查询单个词来源 |
| FindAllWithSource | 2148 ns/op | 查找词及来源 |
# 运行所有性能测试
go test -bench=. -benchtime=3s -run TestXXX
# 测试指定算法
go test -bench=BenchmarkAC_IsSensitive -benchtime=3s
go test -bench=BenchmarkDFA_IsSensitive -benchtime=3s
# 并发测试
go test -bench=BenchmarkAC_IsSensitive_Parallel -benchtime=3s
# 长文本测试
go test -bench=BenchmarkAC_LongText -benchtime=3s性能结论:
- AC 算法在单次检测和并发场景下性能略优于 DFA
- 长文本场景下 AC 算法有明显优势
- 来源追踪功能性能开销极小(~200ns)
- 并发场景下两种算法性能相当优秀
详细性能数据请查看:benchmark_test.go
- go-sensitive-word项目: https://github.com/zmexing/go-sensitive-word
- 基于Java DFA实现的敏感词过滤:https://github.com/houbb/sensitive-word
- unicode字词的神奇组合:https://www.zhihu.com/question/30873035
- unicode违规技巧:https://zhuanlan.zhihu.com/p/545309061
- unicode视觉欺骗:https://zhuanlan.zhihu.com/p/611904676
- unicode字符列表:https://symbl.cc/en/unicode-table
- 汉字结构描述字符:https://zh.wikipedia.org/wiki/%E8%A1%A8%E6%84%8F%E6%96%87%E5%AD%97%E6%8F%8F%E8%BF%B0%E5%AD%97%E7%AC%A6
- 敏感词库:https://github.com/konsheng/Sensitive-lexicon
本项目包含了一些敏感词库,其设计目的是为了解决在互联网环境中可能出现的不适当内容,通过技术手段屏蔽这些敏感词,旨在构建一个更健康、更安全的网络空间。
请注意以下几点:
-
项目目的:本项目的初衷是为开发者提供一个工具,帮助他们在各类互联网产品中过滤和屏蔽不适当或敏感的内容,从而营造一个良好的网络生态环境。
-
使用限制:本项目中的敏感词库仅供技术研究和实现内容过滤功能之用。任何个人或组织不得将本项目中的敏感词库用于传播、分享或其他任何可能导致敏感信息扩散的行为。
-
责任声明:使用本项目所产生的任何直接或间接后果,均由使用者自行承担。本项目开发者不对因不当使用造成的任何损失或法律后果负责。
-
使用规范:请确保在使用本项目时遵守相关法律法规。禁止将本项目用于任何违法或不正当的用途。
通过下载和使用本项目,即表示您同意并接受上述声明的所有内容。希望本项目能够为您在构建净化网络空间的过程中提供帮助。我们鼓励所有开发者共同努力,营造一个健康、安全的网络环境。