ByteNoteByteNote
Sensitive-lexicon:4000+ star 的开源中文敏感词库

字节笔记本

2026年8月12日

Sensitive-lexicon:4000+ star 的开源中文敏感词库

API中转
¥120

做过内容审核、UGC 社区或聊天过滤的开发者,大概率都被「敏感词词库」这件事卡过——词从哪来、怎么维护、要不要自己一个个搜集。这篇文章介绍的 Sensitive-lexicon 就是专门解决这个问题的开源中文敏感词库,目前在 GitHub 上已经有 4000 多颗 star。

项目简介

Sensitive-lexicon 是由 Konsheng 开发维护的中文敏感词库,采用纯文本格式存储,覆盖政治、色情、暴力等主流敏感领域,词汇规模达数万条。它最大的特点是「纯词库」——不绑定任何特定语言或框架,你只要会读 .txt 文件就能用。

项目地址:https://github.com/konsheng/Sensitive-lexicon

许可证是宽松的 MIT,商用基本没有顾虑。除了词库本身,作者还在 dev 分支附带了一个基于 Go 的检测服务,支持模糊匹配和词库热加载,开箱即用。

核心特性

  • 广泛覆盖:数万条词汇,覆盖政治、色情、暴力等敏感领域
  • 持续更新:跟着社会语境变化定期更新,时效性有保障
  • 易于集成:纯文本格式,任意语言/框架都能直接读
  • 配套检测服务:Go 实现的 REST API,支持模糊匹配和热加载
  • 社区驱动:通过 Issue 和 PR 协作完善词库

目录结构

项目结构很简洁,核心就是几个词库目录:

text
Sensitive-lexicon/
├── ThirdPartyCompatibleFormats/   # 第三方兼容格式
├── Organized/                     # 已整理的词库
├── Vocabulary/                    # 核心词汇库
├── LICENSE                        # MIT 许可证
└── README.md                      # 项目说明
  • Vocabulary/ 是核心词库,直接读这里的 .txt 文件就能用
  • Organized/ 是整理过的词库,做了进一步分类
  • ThirdPartyCompatibleFormats/ 提供兼容第三方的格式,方便对接现成的过滤组件

快速开始

获取词库

直接克隆仓库就行,不需要装任何依赖:

bash
git clone https://github.com/Konsheng/Sensitive-lexicon.git

集成到项目

集成方式很简单,读取词库目录下的 .txt 文件,然后用合适的匹配算法做过滤。常见做法有三种:

  • DFA(确定有穷自动机):性能好,适合高频过滤场景
  • Trie 树:前缀匹配,结构清晰易维护
  • 正则表达式:灵活但性能一般,适合规则少的场景

下面是一个 Node.js 的简单示例,读取词库文件并构建 Set 做基础过滤:

javascript
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 框架,提供了四个接口:

接口方法说明
/detectPOST检测文本中的敏感词,返回所有命中项
/containsPOST判断文本是否包含敏感词(布尔结果)
/reloadPOST热加载词库,无需重启服务
/healthGET健康检查

/detect 接口支持模糊匹配,请求体长这样:

json
{
  "text": "待检测的文本内容",
  "enable_fuzzy": true
}

返回命中的敏感词列表,每项标注匹配类型(精确子串 substring 或模糊 fuzzy)和编辑距离 distance

json
{
  "hits": [
    { "word": "敏感词1", "type": "substring" },
    { "word": "敏感词2", "type": "fuzzy", "distance": 1 }
  ]
}

/contains 接口更轻量,只关心有没有命中,适合做快速的准入判断:

json
// 请求
{ "text": "待检测文本" }

// 响应
{ "contains": true, "word": "命中的敏感词" }

模糊匹配配置

模糊匹配用 n-gram + 编辑距离实现,能对付简单的变体写法(比如插入符号、同音字替换)。通过环境变量调节灵敏度:

环境变量默认值说明
PORT8080服务端口
LEXICON_DIRVocabulary词库目录
FUZZY_MIN_NGRAM2n-gram 最小长度
FUZZY_MAX_NGRAM10n-gram 最大长度
FUZZY_MAX_DISTANCE1允许的最大编辑距离

距离调大能抓更多变体,但误判率也会上升,建议从默认值起步按业务调。

Docker 部署

服务支持容器化部署,一行命令就能跑起来:

bash
docker run -p 8080:8080 \
  -e FUZZY_MAX_DISTANCE=1 \
  ghcr.io/<用户名>/sensitive-lexicon-server:latest

跑起来后访问 http://localhost:8080/health 确认服务正常。

注意事项

词库只是工具,怎么用还得看业务。几点经验:

  • 误判问题:任何词库都有误伤,建议把命中结果交给人工或二次校验,别直接封号
  • 地域文化差异:敏感词定义受地域和文化影响很大,照搬词库可能水土不服,建议结合自身场景增删
  • 合规优先:实际应用要遵守当地法律法规和平台政策,词库不能替代合规审查
  • 维护成本:词库不是一劳永逸的,新梗、新变体会不断出现,定期更新很有必要

贡献词库

项目欢迎社区贡献。如果在 Vocabulary/ 目录新增或修改词条后提交 PR,记得附上词条来源或用例,方便维护者审核。不确定怎么改也可以先开 Issue 讨论。

项目链接

如果你正在做内容审核、评论过滤或者社区 UGC 相关的功能,这个词库可以直接拿来当基础,省下自己从零搜集的时间。配合它自带的 Go 检测服务,搭一个能跑的过滤服务其实很快。

分享: