基于 Aho-Corasick 自动机(AC 自动机) 实现的高性能敏感词过滤库,适用于 .NET 10。
词库来源:fwwdn/sensitive-stop-words,涵盖广告、政治、色情、涉爆等类别。
- ⚡ 高效匹配 — AC 自动机时间复杂度 O(n + m),一次遍历完成所有模式匹配
- 🔄 等长替换 — 敏感词替换为等长
*号,保持原文结构 - 📦 灵活加载 — 支持从字符串集合、文件、目录批量加载词库
- 🌐 在线词库 — 内置工具类,可直接从 GitHub 拉取最新词库
- 🔒 线程安全 — 过滤操作加锁,适合并发场景
- 🧪 完善测试 — xUnit 单元测试覆盖核心逻辑
ac-fsa/
├── src/
│ └── AcFsa/
│ ├── AcFsa.csproj # 库项目
│ ├── AhoCorasick.cs # AC 自动机核心实现
│ ├── SensitiveFilter.cs # 敏感词过滤门面类
│ └── WordListLoader.cs # 在线词库加载工具
├── tests/
│ └── AcFsa.Tests/
│ ├── AcFsa.Tests.csproj
│ └── AhoCorasickTests.cs
├── samples/
│ └── Demo/
│ ├── Demo.csproj
│ └── Program.cs # 控制台演示
├── AcFsa.sln
├── LICENSE
└── README.md
<ProjectReference Include="path/to/src/AcFsa/AcFsa.csproj" />using AcFsa;
var filter = new SensitiveFilter();
filter.LoadWords(["操", "尼玛", "傻逼", "妈的"]);
string result = filter.Filter("我操尼玛");
Console.WriteLine(result); // 输出: 我***var filter = new SensitiveFilter();
filter.LoadFile("stopword.dic", Encoding.UTF8);
filter.LoadDirectory("./wordlists/", "*.txt");
Console.WriteLine(filter.Filter("这是一段包含敏感词的文本"));using AcFsa;
var words = await WordListLoader.FetchRemoteAsync();
var filter = new SensitiveFilter();
filter.LoadWords(words);
Console.WriteLine(filter.Filter("你好,草泥马!"));
// 输出: 你好,***!// 检测是否含有敏感词
bool hasSensitive = filter.ContainsSensitiveWord("你好"); // false
// 获取所有匹配的敏感词
IReadOnlyList<string> found = filter.FindAll("我操尼玛啊");
// found => ["操", "尼玛"]
// 重置词库
filter.Reset();词库来自 fwwdn/sensitive-stop-words,包含以下类别:
| 文件 | 说明 |
|---|---|
stopword.dic |
通用停用词 |
广告.txt |
广告推广类 |
政治类.txt |
政治敏感类 |
涉枪涉爆违法信息关键词.txt |
涉枪涉爆类 |
网址.txt |
违规网址 |
色情类.txt |
色情类 |
Aho-Corasick 自动机 是多模式字符串匹配算法,由 Alfred Aho 和 Margaret Corasick 于 1975 年提出。
核心思想:
- Trie 树构建:将所有模式词插入前缀树
- 失败指针(Fail 指针):BFS 构建失败链接,指向最长真后缀对应节点
- 文本扫描:一次线性遍历即可找出所有模式词出现位置
时间复杂度:
- 构建:O(∑|pattern|)
- 搜索:O(|text| + 匹配数)
dotnet test tests/AcFsa.Tests/dotnet run --project samples/Demo/- .NET 10 SDK 或更高版本
敏感词库来源:fwwdn/sensitive-stop-words,该项目采用 MIT 许可证。
本项目基于 MIT License 开源。