中文敏感词库指南:把“敏感词过滤”这件事讲清楚
读完这篇文章,你将知道:
什么是敏感词库,它为什么重要
如何 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,社区永远欢迎多一双眼睛。