基于 PaddleNLP 的中文敏感数据智能脱敏系统
本文导读:介绍一个开源的中文敏感数据智能脱敏系统,结合 正则匹配 和 深度学习NER 双重识别策略,支持四种脱敏模式,提供 Web 和 Docker 一键部署。
前言
在数据驱动的时代,个人隐私保护已成为不可忽视的议题。无论是企业的日志系统、客服对话记录,还是数据分析报告,都可能包含大量敏感信息——手机号、身份证号、银行卡号、姓名等。
《个人信息保护法》和《数据安全法》的实施,对数据脱敏提出了更高要求。传统的正则匹配方案虽然能处理结构化数据(如手机号),但面对「张三给李四转了 5000 元」这类非结构化文本时往往力不从心。
本文将介绍一个我开发的开源项目——敏感数据智能脱敏系统,它结合了正则匹配和**深度学习 NER(命名实体识别)**的优势,实现了对中文文本的智能脱敏处理。
GitHub 项目地址系统概述
核心特性
| 特性 | 说明 |
|---|---|
| 双重识别 | 正则匹配结构化数据 + NLP 识别非结构化实体 |
| 四种策略 | 部分脱敏、完全脱敏、占位符替换、哈希脱敏 |
| Web | 基于 Gradio 的现代化交互界面 |
| 容器化 | Docker 多阶段构建,一键部署 |
| 高性能 | 支持 Intel MKLDNN 加速,fast/accurate 双模式 |
技术架构
graph TB
subgraph UI["Web Layer"]
A[Gradio 6.1+]
end
subgraph APP["Application Layer"]
B[RegexDesensitizer<br/>正则识别]
C[NLPDesensitizer<br/>PaddleNLP NER]
D[CompositeDesensitizer<br/>组合脱敏器]
end
subgraph ENGINE["Engine Layer"]
E[PaddlePaddle 2.6+]
F[PaddleNLP 2.8+]
end
A --> D
B --> D
C --> D
D --> E
D --> F
架构设计
设计原则
在设计这个系统时,遵循了以下原则:
- 开闭原则: 对扩展开放,对修改关闭——新增脱敏类型只需扩展,无需修改现有代码
- 单一职责: 每个脱敏器只负责一种识别策略
- 依赖倒置: 高层模块依赖抽象,而非具体实现
类结构设计
系统采用 抽象工厂 + 策略模式 的组合设计:
1 | class EntityType(Enum): |
1 | class MaskStrategy(Enum): |
1 |
|
脱敏器继承体系
classDiagram
class BaseDesensitizer {
<<abstract>>
+strategy: MaskStrategy
+entity_types: list
+recognize_entities()* list~Entity~
+mask_text(text, entity) str
+desensitize(text) MaskResult
+display_result(result) void
}
class RegexDesensitizer {
+PATTERNS: dict
+recognize_entities(text) list~Entity~
}
class NLPDesensitizer {
+TAG_MAPPING: dict
-_ner: Taskflow
+recognize_entities(text) list~Entity~
}
class CompositeDesensitizer {
-_regex: RegexDesensitizer
-_nlp: NLPDesensitizer
+recognize_entities(text) list~Entity~
-_remove_overlapping() list~Entity~
}
BaseDesensitizer <|-- RegexDesensitizer
BaseDesensitizer <|-- NLPDesensitizer
BaseDesensitizer <|-- CompositeDesensitizer
这种设计的优势:
- 易于扩展: 新增脱敏方式只需继承
BaseDesensitizer并实现recognize_entities() - 策略可组合: 四种脱敏策略可独立选择,与识别方式解耦
- 接口统一: 所有脱敏器对外暴露相同的
desensitize()接口
核心实现
正则脱敏器
对于 结构化敏感数据(手机号、身份证、银行卡、邮箱),正则匹配是最准确高效的方案:
1 | class RegexDesensitizer(BaseDesensitizer): |
正则模式详解
| 类型 | 正则表达式 | 说明 |
|---|---|---|
| 手机号 | 1[3-9]\d{9} |
以 1 开头,第二位 3-9,共 11 位 |
| 身份证 | \d{17}[\dXx] |
17 位数字 + 1 位数字或 X |
| 银行卡 | \d{16,19} |
16-19 位连续数字 |
| 邮箱 | RFC 5322 简化版 | 标准邮箱格式 |
NLP 脱敏器
对于 非结构化敏感数据(人名、地名、组织机构等),借助 NLP 的命名实体识别(NER)能力:
1 | class NLPDesensitizer(BaseDesensitizer): |
NER 模式对比
| 指标 | fast 模式 | accurate 模式 |
|---|---|---|
| 模型 | BiGRU-CRF (LAC) | ERNIE + CRF |
| 大小 | ~50MB | ~400MB |
| 延迟 | <100ms | 200-500ms |
| 准确率 | ~90% | ~95% |
| 内存 | ~500MB | ~2GB |
| 场景 | 实时服务 | 批量处理 |
组合脱敏器
flowchart LR
A[输入文本] --> B[正则识别]
A --> C[NLP识别]
B --> D[合并去重]
C --> D
D --> E[脱敏处理]
E --> F[输出结果]
style B fill:#e1f5fe
style C fill:#f3e5f5
style D fill:#fff3e0
1 | class CompositeDesensitizer(BaseDesensitizer): |
脱敏策略详解
效果: 张三 → 张*三,13812345678 → 138****5678
1 | def _partial_mask(self, text: str) -> str: |
适用场景: 人工审核、演示展示、客户沟通记录
效果: 张三 → **,13812345678 → ***********
1 | def _full_mask(self, text: str) -> str: |
适用场景: 日志记录、公开数据、合规归档
效果: 张三 → [人名],13812345678 → [电话]
1 | def _placeholder_mask(self, entity: Entity) -> str: |
适用场景: 数据分析、NLP 训练数据、统计报表
效果: 张三 → [4f8b2c1a]
1 | def _hash_mask(self, text: str) -> str: |
适用场景: 数据对账、可追溯场景、A/B 测试
策略选择指南
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 客服系统日志 | 部分脱敏 | 保留可读性,便于问题排查 |
| 公开数据报告 | 完全脱敏 | 最大化隐私保护 |
| 数据分析/BI | 占位符 | 保留语义结构,便于统计 |
| 数据血缘追踪 | 哈希脱敏 | 可关联原始数据,不可逆推 |
Docker 部署
多阶段构建
查看完整 Dockerfile
1 | # Stage 1: Builder (依赖安装) |
一键部署
1 | git clone https://github.com/daojiAnime/sensitive-data-masking.git |
1 | docker compose up -d |
1 | docker run -d -p 7860:7860 \ |
内存配置建议
| 模式 | 最小内存 | 推荐内存 |
|---|---|---|
| fast | 1GB | 2GB |
| accurate | 2GB | 4GB |
使用示例
Python API
1 | from demo import CompositeDesensitizer, MaskStrategy, EntityType |
查看输出结果
1 | 脱敏后: 客户张*三(身份证号:1101011990****1234)于2024年1月15日 |
扩展开发
1 | # 1. 在 EntityType 枚举中添加新类型 |
1 | # 1. 在 MaskStrategy 枚举中添加新策略 |
总结
核心优势
- 识别全面: 覆盖结构化(手机/身份证/银行卡)和非结构化(人名/地名/组织)敏感信息
- 策略灵活: 四种脱敏策略适应不同业务场景
- 开箱即用: Gradio Web + Docker 一键部署
- 易于扩展: 基于设计模式的架构,方便添加新类型和策略
适用场景
- 企业日志脱敏
- 客服对话记录处理
- 数据分析报告生成
- 合规数据归档
- NLP 训练数据预处理
未来规划
规划中
- 支持更多实体类型(车牌号、社保号等)
- 支持自定义正则规则配置
开发中
- 支持批量文件处理
- 支持 API 服务模式
优化中
- 性能优化(GPU 加速)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 盗计のBlog!
评论
