
字节笔记本
2026年8月12日
Sensitive-lexicon:4000+ star 的开源中文敏感词库
做过内容审核、UGC 社区或聊天过滤的开发者,大概率都被「敏感词词库」这件事卡过——词从哪来、怎么维护、要不要自己一个个搜集。这篇文章介绍的 Sensitive-lexicon 就是专门解决这个问题的开源中文敏感词库,目前在 GitHub 上已经有 4000 多颗 star。
项目简介
Sensitive-lexicon 是由 Konsheng 开发维护的中文敏感词库,采用纯文本格式存储,覆盖政治、色情、暴力等主流敏感领域,词汇规模达数万条。它最大的特点是「纯词库」——不绑定任何特定语言或框架,你只要会读 .txt 文件就能用。
项目地址:https://github.com/konsheng/Sensitive-lexicon
许可证是宽松的 MIT,商用基本没有顾虑。除了词库本身,作者还在 dev 分支附带了一个基于 Go 的检测服务,支持模糊匹配和词库热加载,开箱即用。
核心特性
- 广泛覆盖:数万条词汇,覆盖政治、色情、暴力等敏感领域
- 持续更新:跟着社会语境变化定期更新,时效性有保障
- 易于集成:纯文本格式,任意语言/框架都能直接读
- 配套检测服务:Go 实现的 REST API,支持模糊匹配和热加载
- 社区驱动:通过 Issue 和 PR 协作完善词库
目录结构
项目结构很简洁,核心就是几个词库目录:
Sensitive-lexicon/
├── ThirdPartyCompatibleFormats/ # 第三方兼容格式
├── Organized/ # 已整理的词库
├── Vocabulary/ # 核心词汇库
├── LICENSE # MIT 许可证
└── README.md # 项目说明Vocabulary/是核心词库,直接读这里的.txt文件就能用Organized/是整理过的词库,做了进一步分类ThirdPartyCompatibleFormats/提供兼容第三方的格式,方便对接现成的过滤组件
快速开始
获取词库
直接克隆仓库就行,不需要装任何依赖:
git clone https://github.com/Konsheng/Sensitive-lexicon.git集成到项目
集成方式很简单,读取词库目录下的 .txt 文件,然后用合适的匹配算法做过滤。常见做法有三种:
- DFA(确定有穷自动机):性能好,适合高频过滤场景
- Trie 树:前缀匹配,结构清晰易维护
- 正则表达式:灵活但性能一般,适合规则少的场景
下面是一个 Node.js 的简单示例,读取词库文件并构建 Set 做基础过滤:
const fs = require('fs')
const path = require('path')
// 加载词库目录下所有 .txt 文件
function loadLexicon(dir) {
const words = new Set()
const files = fs.readdirSync(dir).filter(f => f.endsWith('.txt'))
for (const file of files) {
const content = fs.readFileSync(path.join(dir, file), 'utf-8')
content.split('\n').forEach(line => {
const word = line.trim()
if (word) words.add(word)
})
}
return words
}
const sensitiveWords = loadLexicon('./Vocabulary')
// 基础过滤:返回命中的敏感词
function filterText(text) {
const hits = []
for (const word of sensitiveWords) {
if (text.includes(word)) hits.push(word)
}
return hits
}
console.log(filterText('这是一段待检测的文本'))检测服务 API
如果不想自己写匹配逻辑,可以直接用项目自带的 Go 检测服务。服务代码在 ./cmd/server,基于 Go Fiber 框架,提供了四个接口:
| 接口 | 方法 | 说明 |
|---|---|---|
/detect | POST | 检测文本中的敏感词,返回所有命中项 |
/contains | POST | 判断文本是否包含敏感词(布尔结果) |
/reload | POST | 热加载词库,无需重启服务 |
/health | GET | 健康检查 |
/detect 接口支持模糊匹配,请求体长这样:
{
"text": "待检测的文本内容",
"enable_fuzzy": true
}返回命中的敏感词列表,每项标注匹配类型(精确子串 substring 或模糊 fuzzy)和编辑距离 distance:
{
"hits": [
{ "word": "敏感词1", "type": "substring" },
{ "word": "敏感词2", "type": "fuzzy", "distance": 1 }
]
}/contains 接口更轻量,只关心有没有命中,适合做快速的准入判断:
// 请求
{ "text": "待检测文本" }
// 响应
{ "contains": true, "word": "命中的敏感词" }模糊匹配配置
模糊匹配用 n-gram + 编辑距离实现,能对付简单的变体写法(比如插入符号、同音字替换)。通过环境变量调节灵敏度:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
PORT | 8080 | 服务端口 |
LEXICON_DIR | Vocabulary | 词库目录 |
FUZZY_MIN_NGRAM | 2 | n-gram 最小长度 |
FUZZY_MAX_NGRAM | 10 | n-gram 最大长度 |
FUZZY_MAX_DISTANCE | 1 | 允许的最大编辑距离 |
距离调大能抓更多变体,但误判率也会上升,建议从默认值起步按业务调。
Docker 部署
服务支持容器化部署,一行命令就能跑起来:
docker run -p 8080:8080 \
-e FUZZY_MAX_DISTANCE=1 \
ghcr.io/<用户名>/sensitive-lexicon-server:latest跑起来后访问 http://localhost:8080/health 确认服务正常。
注意事项
词库只是工具,怎么用还得看业务。几点经验:
- 误判问题:任何词库都有误伤,建议把命中结果交给人工或二次校验,别直接封号
- 地域文化差异:敏感词定义受地域和文化影响很大,照搬词库可能水土不服,建议结合自身场景增删
- 合规优先:实际应用要遵守当地法律法规和平台政策,词库不能替代合规审查
- 维护成本:词库不是一劳永逸的,新梗、新变体会不断出现,定期更新很有必要
贡献词库
项目欢迎社区贡献。如果在 Vocabulary/ 目录新增或修改词条后提交 PR,记得附上词条来源或用例,方便维护者审核。不确定怎么改也可以先开 Issue 讨论。
项目链接
- GitHub 仓库:https://github.com/konsheng/Sensitive-lexicon
- 开发分支:https://github.com/konsheng/Sensitive-lexicon/tree/dev
- 许可证:MIT
如果你正在做内容审核、评论过滤或者社区 UGC 相关的功能,这个词库可以直接拿来当基础,省下自己从零搜集的时间。配合它自带的 Go 检测服务,搭一个能跑的过滤服务其实很快。