将含真实当事人信息的法律文书脱敏后安全提交 AI 分析,分析结果可一键还原为真实姓名。完全本地运行,数据不出本机。
通用 PII 工具(如 OpenAI Privacy Filter)处理中文法律文书时存在结构性缺陷:
| 问题 | 通用工具 | LegalMask |
|---|---|---|
第87条 被误判为数字删除 |
❌ 删除 → 法律分析失效 | ✅ 自动保护,完整保留 |
案号 (2023)京0105民初12345号 |
❌ 无法识别 | ✅ 完整捕获并编号 |
| 18位统一社会信用代码 | ❌ 漏检 | ✅ 含校验位校验 |
| 同一人多处出现不一致替换 | ❌ 每处独立mask | ✅ 指代消解,全文一致 |
| 原告/被告等角色+姓名组合 | ❌ 拆散识别 | ✅ 整体捕获 |
| DOCX 格式被破坏 | ❌ 返回纯文本 | ✅ Run-by-run 格式保留 |
| 脱敏不可逆 | ❌ 无法还原 | ✅ JSON mapping 精确还原 |
pip install -r requirements.txt
streamlit run app.py浏览器自动打开 http://localhost:8501
Layer 0 — 法条保护 第X条/第X款 → __LAW_N__ 占位,处理后还原
Layer 0.5 — 指代消解 扫描姓名 → 分配甲方/乙方/丙方,全文统一替换
Layer 1 — 唯一标识 身份证号、手机号、统一社会信用代码
Layer 2 — 金额 万元/亿元/元,含百分比
Layer 3 — 案号 (YYYY)X民初XXXXX号,含 mapping 还原
Layer 4 — 机构名称 法院、金融机构、政府部门
Layer 5 — 当事人姓名 基于 Layer 0.5 构建的 surname→code 映射
Layer 6 — 日期与地址
Layer 7 — 其他 车牌、邮箱、URL、社交账号
Layer 8 — 清理 去除多余空白
Layer 9 — 还原法条 __LAW_N__ → 原始法条引用
- DOCX:Run-by-run 处理,保留字体、加粗、颜色等格式
- PDF:Block-by-block 处理(需含文字层)
原始文件 → [脱敏] → 脱敏文件 + mapping.json
↓
提交 AI 分析
↓
AI 返回文本 → [还原] → 含真实姓名的分析结论
| 格式 | 脱敏 | 格式保留 |
|---|---|---|
.docx |
✅ | ✅ Run-by-run |
.pdf(文字层) |
✅ | ✅ Block-by-block |
.txt / .md |
✅ | 纯文本 |
| 扫描版 PDF | ❌ 需先 OCR | — |
from core.processor import process_document, restore_text, load_mapping
# 脱敏单个文件
result = process_document("contract.docx", output_dir="./out")
# result.output_file → 脱敏后文件路径
# result.mapping_file → mapping JSON 路径
# result.entity_count → 脱敏实体数量
# 还原 AI 分析结果
mapping = load_mapping(result.mapping_file)
restored = restore_text(ai_analysis_text, mapping)- 扫描版 PDF(图片型)暂不支持,需含可选中文字层
- 建议人工核查脱敏结果,确认无遗漏实体
- 极复杂嵌套法条引用(如"第87条第2款第3项")可能需要手动校验
- Python 3.10+
- Streamlit(UI)
- python-docx(DOCX 处理)
- PyMuPDF / pdfplumber(PDF 处理)