中文敏感词库指南:把“敏感词过滤”这件事讲清楚
读完这篇文章,你将知道:
什么是敏感词库,它为什么重要 如何 5 分钟把 Sensitive-lexicon 集成到自己的项目 怎样避免踩坑:法律、语境、维护更新 常见疑问 15 问(FAQ)
1 为什么会有“敏感词库”?
“敏感词”不是新鲜词。我们在论坛、聊天室、APP 评论区里,经常能看到“**”或“[内容已隐藏]”。
背后就是一套“敏感词过滤”机制:程序先把文本拆开,再跟一份“黑名单”比对,发现命中就处理。
Sensitive-lexicon 就是这份黑名单的开源版本。它把“政治、色情、暴力”等常见敏感领域的词汇整理成一份纯文本文件,方便开发者直接拿来用,也欢迎社区一起维护。
2 Sensitive-lexicon 是什么?一张图看懂
维度 | 说明 |
---|---|
名称 | Sensitive-lexicon |
语言 | 中文 |
类型 | 纯文本词库 |
覆盖领域 | 政治、色情、暴力等 |
更新频率 | 持续更新 |
开源协议 | MIT License |
获取方式 | GitHub 克隆或下载 |
3 快速上手:3 步把词库放进你的代码
3.1 下载仓库
git clone https://github.com/Konsheng/Sensitive-lexicon.git
cd Sensitive-lexicon
文件夹里能看到:
-
sensitive-lexicon.txt
—— 主词库 -
Vocabulary/
—— 细分目录,方便按需取用
3.2 选一条匹配算法
词库只是“原料”,真正过滤要靠算法。下面 3 种最常用:
算法 | 思路 | 适用场景 |
---|---|---|
DFA(确定性有限自动机) | 把词库变成状态机,扫描一次文本即可 | 高并发、需要毫秒级响应 |
Trie 树 | 把词库变成前缀树,省内存 | 内存敏感型服务 |
正则表达式 | 一行代码就能跑 | 脚本、小工具、原型验证 |
举个 Python 小例子(Trie 树):
import json, os
# 1. 读词库
with open('sensitive-lexicon.txt', encoding='utf-8') as f:
words = [line.strip() for line in f if line.strip()]
# 2. 构建 Trie
trie = {}
for w in words:
node = trie
for ch in w:
node = node.setdefault(ch, {})
node['#'] = True # 结束标记
# 3. 过滤函数
def filter(text):
i, n = 0, len(text)
out = []
while i < n:
node, j = trie, i
while j < n and text[j] in node:
node = node[text[j]]
if '#' in node: # 命中敏感词
out.append('*'*(j-i+1))
i = j + 1
break
j += 1
else:
out.append(text[i])
i += 1
return ''.join(out)
print(filter("这是一段测试文字"))
3.3 验证效果
把一段包含敏感词的文本丢进去,看输出是不是被替换成了“*”。
如果结果不对,回到词库检查拼写或长度,再对比算法逻辑即可。
4 如何把项目越做越大?——贡献词汇的正确姿势
Sensitive-lexicon 是社区驱动项目,任何人都能提 Issue 或 Pull Request。
提交流程:
-
Fork 仓库 -
在 Vocabulary/
新建或修改词条(纯文本,一行一词) -
写清来源:微博、新闻、聊天截图……方便审核 -
提交 PR,等待维护者合并
提示:
不要一次性提交上万条,分批更容易 review 如果拿不准,先发 Issue 讨论
5 常见疑问 15 问(FAQ)
提问 | 回答 |
---|---|
1. 这个词库有多全? | 覆盖数万条,但不可能 100% 完整,需要结合业务补充。 |
2. 更新频率? | 社区有 commit 就更新,平均每月数次。 |
3. 商用收费吗? | 完全免费,MIT 协议可商用。 |
4. 可以直接用于生产吗? | 可以,但建议二次审核,避免误杀。 |
5. 如何区分色情与医学词汇? | 词库只给列表,语境判断靠业务逻辑。 |
6. 会不会侵犯隐私? | 词库本身不含用户数据。 |
7. 支持多语言吗? | 目前仅中文。 |
8. 文件编码? | UTF-8 无 BOM。 |
9. 有 API 吗? | 没有,需自己读文件。 |
10. 如何测试性能? | 用 wrk、ab 等压测工具,关注 QPS 与内存占用。 |
11. 误杀怎么办? | 建立白名单,或在匹配后加人工复核。 |
12. 有图形界面吗? | 无,需自己开发。 |
13. 如何回滚? | Git 版本控制,随时 checkout 旧版本。 |
14. 支持 Docker? | 无官方镜像,但可自己写 Dockerfile。 |
15. 如何联系维护者? | GitHub Issue 或 Discussion。 |
6 进阶:把词库做成服务
如果你不想每次重启进程就重新加载词库,可以做成独立服务:
-
把词库放进 Redis -
写一个 HTTP API(Flask、Spring Boot 任选) -
前端调用 POST /filter
,返回过滤后的文本
这样多个业务线共用一份词库,更新只需改 Redis 即可。
7 法律与伦理:红线在哪里?
-
遵守当地法律
不同地区对敏感内容的定义差异很大,上线前请让法务把关。 -
尊重语境
“乳房”在医学文章里是正常词,在弹幕里可能被滥用。 -
保留日志
过滤命中记录要脱敏存储,方便后续审计。
8 一张思维导图总结
graph TD
A[敏感词库] --> B[获取]
A --> C[使用]
A --> D[维护]
B --> B1[GitHub 克隆]
C --> C1[DFA/Trie/正则]
C --> C2[独立服务]
D --> D1[提交 PR]
D --> D2[建立白名单]
9 结语
敏感词过滤不是“一劳永逸”的工程,而是一场与语境、文化、法律共同演进的长期合作。
Sensitive-lexicon 提供了一把“瑞士军刀”,真正的功夫在于你如何用好它:
-
选对算法,性能不拖后腿 -
结合业务,避免误杀 -
遵守规则,守住底线
祝你用得顺利。如果遇到问题,回到 GitHub 提 Issue,社区永远欢迎多一双眼睛。