中国个人信息脱敏库 - 识别和处理中国大陆个人身份信息
Project description
CN PII Anonymization
English | 简体中文
中国个人信息脱敏库 - 识别和处理中国大陆个人身份信息(Personally Identifiable Information, PII)
项目简介
CN PII Anonymization 是一个专注于中国大陆个人身份信息(PII)识别与脱敏处理的 Python 库。基于 Microsoft Presidio 框架构建,提供文本和图像两种处理模式,支持多种 PII 类型的识别与匿名化处理。
效果演示
主要特性
支持的PII类型
| PII类型 | 实体标识 | 识别方式 | 优先级 | 说明 |
|---|---|---|---|---|
| 手机号 | CN_PHONE_NUMBER |
正则表达式 | P0 | 支持11位手机号、带国际区号(+86/0086)、带分隔符格式 |
| 身份证号 | CN_ID_CARD |
正则表达式 | P0 | 支持18位身份证号、OCR错误容错(19位修复) |
| 银行卡号 | CN_BANK_CARD |
正则表达式 | P0 | 支持16-19位银行卡号、Luhn算法校验、BIN码识别 |
| 护照号 | CN_PASSPORT |
正则表达式 | P0 | 支持中国护照格式(E/G开头+8位数字) |
| 邮箱地址 | CN_EMAIL |
正则表达式 | P1 | 标准邮箱格式识别 |
| 详细地址 | CN_ADDRESS |
信息抽取(IE) | P2 | 基于PaddleNLP信息抽取模型 |
| 个人姓名 | CN_NAME |
信息抽取(IE) | P2 | 基于PaddleNLP信息抽取模型,支持allow_list/deny_list配置 |
文本脱敏功能
- 掩码替换: 将敏感信息替换为星号(*),支持保留前N位和后N位
- 假名替换: 使用Faker生成逼真的假数据替换敏感信息
- 自定义配置: 为不同PII类型配置不同的脱敏策略
图像脱敏功能
- 像素块马赛克: 将识别区域划分为像素块并取平均色
- 高斯模糊: 对识别区域应用高斯模糊效果
- 纯色填充: 用指定颜色覆盖识别区域
技术特点
- 基于Microsoft Presidio框架,成熟稳定
- 使用PaddleNLP进行中文NLP处理
- 使用PaddleOCR进行图像文字识别
- 支持GPU加速(可选)
- 单例模式设计,资源高效利用
- 完整的API服务支持
安装指南
环境要求
- Python >= 3.12
- 操作系统: Windows / Linux / macOS
通过源码安装
# 克隆项目
git clone https://github.com/neednlab/cn_pii_anonymization.git
cd cn_pii_anonymization
# 同步所有依赖
uv sync
通过PyPI安装
# Windows必须。添加uv配置:由于paddlenlp引用了tool-helpers,但其未提供Windows版本Wheel,必须添加uv配置避免安装失败
[tool.uv]
override-dependencies = [
"paddle2onnx; sys_platform != 'win32'",
"tool-helpers; sys_platform != 'win32'",
"onnxoptimizer; sys_platform != 'win32'",
]
# 从PyPI安装
uv add cn-pii-anonymization
初始化配置
重要提示:首次使用必须执行初始化配置脚本,避免遇到模型加载错误。
# 如果从源码安装,运行以下脚本
uv run .\src\cn_pii_anonymization\init_install.py
# 如果从PyPI安装,运行以下脚本
from cn_pii_anonymization.init_install import main
main()
Python库使用示例
文本处理
from cn_pii_anonymization import TextProcessor
# 创建处理器
processor = TextProcessor()
# 处理包含PII的文本
text = "张三的手机号是13812345678,身份证号是110101199001011234"
result = processor.process(text)
print(f"原始文本: {result.original_text}")
print(f"脱敏文本: {result.anonymized_text}")
print(f"发现PII: {len(result.pii_entities)}个")
for entity in result.pii_entities:
print(f" - {entity.entity_type}: {entity.original_text} -> {entity.anonymized_text}")
图像处理
from PIL import Image
from cn_pii_anonymization.processors.image_processor import ImageProcessor
# 创建图像处理器
processor = ImageProcessor()
# 加载图像
image = Image.open("document.png")
# 处理图像
result = processor.process(
image=image,
mosaic_style="pixel", # 可选: pixel, blur, fill
entities=["CN_PHONE_NUMBER", "CN_ID_CARD"]
)
# 保存处理后的图像
result.save_processed_image("redacted_document.png")
# 查看识别到的PII
for entity in result.pii_entities:
print(f"类型: {entity.entity_type}")
print(f"文本: {entity.text}")
print(f"位置: {entity.bbox}")
print(f"置信度: {entity.score}")
完整示例
更多完整示例请参考 examples 目录。
API服务
启动API服务
# 使用uv运行
uv run python main.py
# 或直接运行
python main.py
服务启动后访问:
- API服务: http://localhost:8000
- API文档(Swagger UI): http://localhost:8000/docs
- ReDoc文档: http://localhost:8000/redoc
- OpenAPI规范: http://localhost:8000/openapi.json
API端点列表
| 端点 | 方法 | 描述 |
|---|---|---|
/ |
GET | API基本信息 |
/health |
GET | 健康检查 |
/api/v1/text/anonymize |
POST | 文本匿名化 |
/api/v1/text/analyze |
POST | 文本分析(仅识别PII) |
/api/v1/text/entities |
GET | 获取支持的实体类型 |
/api/v1/image/anonymize |
POST | 图像脱敏 |
/api/v1/image/analyze |
POST | 图像分析(仅识别PII) |
/api/v1/image/mosaic-styles |
GET | 获取支持的马赛克样式 |
API调用示例
文本匿名化
curl -X POST "http://localhost:8000/api/v1/text/anonymize" \
-H "Content-Type: application/json" \
-d '{
"text": "张三的手机号是13812345678,身份证号是110101199001011234",
"entities": ["CN_PHONE_NUMBER", "CN_ID_CARD"],
"operators": {
"CN_PHONE_NUMBER": {
"type": "mask",
"masking_char": "*",
"keep_prefix": 3,
"keep_suffix": 4
},
"CN_ID_CARD": {
"type": "mask",
"masking_char": "*",
"keep_prefix": 6,
"keep_suffix": 4
}
}
}'
响应示例:
{
"code": 200,
"message": "success",
"data": {
"original_text": "张三的手机号是13812345678,身份证号是110101199001011234",
"anonymized_text": "张三的手机号是138****5678,身份证号是110101********1234",
"pii_entities": [
{
"entity_type": "CN_PHONE_NUMBER",
"start": 7,
"end": 18,
"score": 1.0,
"original_text": "13812345678",
"anonymized_text": "138****5678"
},
{
"entity_type": "CN_ID_CARD",
"start": 24,
"end": 42,
"score": 1.0,
"original_text": "110101199001011234",
"anonymized_text": "110101********1234"
}
]
}
}
文本分析(仅识别)
curl -X POST "http://localhost:8000/api/v1/text/analyze" \
-H "Content-Type: application/json" \
-d '{
"text": "联系方式:13812345678,邮箱:test@example.com"
}'
响应示例:
{
"code": 200,
"message": "success",
"data": {
"pii_entities": [
{
"entity_type": "CN_PHONE_NUMBER",
"start": 5,
"end": 16,
"score": 1.0,
"original_text": "13812345678",
"anonymized_text": ""
},
{
"entity_type": "CN_EMAIL",
"start": 21,
"end": 37,
"score": 1.0,
"original_text": "test@example.com",
"anonymized_text": ""
}
],
"has_pii": true
}
}
图像脱敏
curl -X POST "http://localhost:8000/api/v1/image/anonymize" \
-F "image=@document.png" \
-F "mosaic_style=pixel" \
-F 'entities=["CN_PHONE_NUMBER", "CN_ID_CARD"]' \
--output redacted_document.png
图像分析(返回元数据)
curl -X POST "http://localhost:8000/api/v1/image/anonymize" \
-F "image=@document.png" \
-F "mosaic_style=pixel" \
-F "return_metadata=true"
响应示例:
{
"code": 200,
"message": "success",
"data": {
"pii_entities": [
{
"entity_type": "CN_PHONE_NUMBER",
"text": "13812345678",
"bbox": {
"left": 100,
"top": 200,
"width": 150,
"height": 30
},
"score": 1.0
}
],
"ocr_text": "联系方式:13812345678",
"ocr_confidence": 0.95
}
}
获取支持的实体类型
curl -X GET "http://localhost:8000/api/v1/text/entities"
响应示例:
{
"code": 200,
"message": "success",
"data": {
"entities": [
"CN_PHONE_NUMBER",
"CN_ID_CARD",
"CN_BANK_CARD",
"CN_PASSPORT",
"CN_EMAIL",
"CN_ADDRESS",
"CN_NAME"
]
}
}
获取支持的马赛克样式
curl -X GET "http://localhost:8000/api/v1/image/mosaic-styles"
响应示例:
{
"code": 200,
"message": "success",
"data": {
"styles": [
{
"name": "pixel",
"description": "像素块马赛克 - 将区域划分为像素块并取平均色"
},
{
"name": "blur",
"description": "高斯模糊 - 对区域应用高斯模糊效果"
},
{
"name": "fill",
"description": "纯色填充 - 用指定颜色覆盖区域"
}
]
}
}
OpenAPI文档
完整的OpenAPI规范文档可通过以下方式访问:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- OpenAPI JSON: http://localhost:8000/openapi.json
配置说明
环境变量配置
创建.env文件进行配置:
# 应用配置
APP_NAME=CN PII Anonymization
APP_VERSION=0.1.0
DEBUG=false
# API服务配置
API_HOST=0.0.0.0
API_PORT=8000
# 日志配置
LOG_LEVEL=INFO
LOG_FILE=logs/app.log
# NLP配置
NLP_MODEL=lac
NLP_USE_GPU=false
# OCR配置
OCR_LANGUAGE=ch
OCR_USE_GPU=false
OCR_USE_ANGLE_CLS=true
OCR_DET_THRESH=0.3
OCR_DET_BOX_THRESH=0.5
OCR_DET_LIMIT_SIDE_LEN=960
# 图像处理配置
MAX_IMAGE_SIZE=10485760
MOSAIC_BLOCK_SIZE=10
MOSAIC_BLUR_RADIUS=15
# 识别器置信度阈值配置
SCORE_THRESHOLD_DEFAULT=0.35
SCORE_THRESHOLD_NAME=0.3
SCORE_THRESHOLD_ADDRESS=0.3
SCORE_THRESHOLD_PHONE=0.5
SCORE_THRESHOLD_ID_CARD=0.5
SCORE_THRESHOLD_BANK_CARD=0.5
SCORE_THRESHOLD_PASSPORT=0.5
SCORE_THRESHOLD_EMAIL=0.5
# 姓名识别器自定义列表
NAME_ALLOW_LIST=张三,李四
NAME_DENY_LIST=王五
置信度阈值说明
不同类型的识别器有不同的置信度特点:
| 识别器类型 | 推荐阈值 | 说明 |
|---|---|---|
| 正则类(手机、身份证等) | 0.5 | 置信度固定为1.0,阈值影响较小 |
| IE类(姓名、地址) | 0.3 | 信息抽取模型置信度通常较低(0.3-0.6) |
开发指南
运行测试
# 运行所有测试
uv run pytest
# 运行特定测试
uv run pytest tests/unit/test_recognizers.py
# 运行测试并生成覆盖率报告
uv run pytest --cov=src/cn_pii_anonymization
代码检查
# 运行ruff检查
uv run ruff check .
# 运行ruff格式化
uv run ruff format .
# 运行mypy类型检查
uv run mypy src/
性能指标
当前NLP模型识别性能仍在优化中
| 指标 | 目标值 |
|---|---|
| 单张图片处理时间 | < 100秒(1080p图片) |
| 文本处理时间 | < 5秒 |
| PII识别准确率 | > 95% |
依赖说明
核心依赖
| 组件 | 版本 | 用途 |
|---|---|---|
| presidio-analyzer | >=2.2 | PII识别引擎 |
| presidio-anonymizer | >=2.2 | PII匿名化引擎 |
| presidio-image-redactor | >=0.0.50 | 图像PII处理 |
| PaddleNLP | >=2.8.1 | 中文NLP处理 |
| PaddleOCR | >=3.1.1 | OCR引擎 |
| PaddlePaddle | >=3.3.0 | 底层框架 |
| FastAPI | >=0.109 | API服务框架 |
| uvicorn | >=0.27 | ASGI服务器 |
许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。
限制
- 未实现API身份认证
- 未实现API并发处理和接口限流
- 上述可考虑采用FaaS云函数部署,无需在项目中实现
致谢
本项目基于以下优秀开源项目
- Microsoft Presidio: 整体PII识别框
- PaddleNLP: 中文NLP处理库
- PaddleOCR: 中文OCR引擎
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cn_pii_anonymization-0.1.6.tar.gz.
File metadata
- Download URL: cn_pii_anonymization-0.1.6.tar.gz
- Upload date:
- Size: 58.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
404c729a38fb3fe0d2b95319b4593358838e9f0c706f2dfa7141d20e07a83e49
|
|
| MD5 |
a199ae3ed3198b5acb988ae4f4854336
|
|
| BLAKE2b-256 |
3791b3f7b55191804c7560cc354931450980d8adc0f3d01c477b004a955d8e81
|
File details
Details for the file cn_pii_anonymization-0.1.6-py3-none-any.whl.
File metadata
- Download URL: cn_pii_anonymization-0.1.6-py3-none-any.whl
- Upload date:
- Size: 84.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d68513b6290261ceb690c79d8910a238fd6fa2e367db7e86b2ca9522fdd4f3d
|
|
| MD5 |
86c28ec31fcf3bcbd8c724fc1f831f08
|
|
| BLAKE2b-256 |
d7bfee501ea5bbb972d9c85ccaf676f884a994da332615c0c5d6b83cd71af460
|