AI 文档脱敏可以减少不必要的个人信息流出,但不能靠一句“请保护隐私”完成。本文先讲如何缩小输入范围,再提供一个只在本机处理 TXT 的 Python 示例。脚本识别部分常见中国大陆手机号和邮箱格式,不处理身份证、姓名、地址、图片和 Office 隐藏内容,因此不能把输出称为完全匿名化文件。

一、先判断是否需要上传
很多任务只需要字段结构或少量样本。例如请 AI 帮你写清洗脚本,可以提供虚构的五行数据,不需要整个客户表。先删掉与任务无关的列,通常比把敏感列打星号更稳妥。
如果文件受组织保密要求限制,先使用组织批准的处理环境。本地模型也需要管理账号权限、日志和备份;“本地运行”不意味着任何文件都适合随意放进去。
二、准备独立测试目录
安装 Python 后建立一个空目录,放入 sample.txt 和 redact.py。先用下面的虚构示例测试,不要拿真实通讯录验证脚本。
以下为虚构测试记录,不对应真实业务联系人。
联系邮箱:demo@example.com
测试号码:13800000000
请确认样本字段,不包含真实姓名或地址。
运行前保留原始资料只读副本。不要在文件夹上直接执行批量覆盖,先检查一个输出文件。
三、创建本地替换脚本
from pathlib import Path
import re
source = Path("sample.txt")
target = Path("sample.redacted.txt")
if target.exists():
raise SystemExit("Output exists; rename it before another run.")
text = source.read_text(encoding="utf-8-sig")
patterns = [
("EMAIL", re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")),
("PHONE", re.compile(r"(?<!\d)(?:\+86[- ]?)?1[3-9]\d{9}(?!\d)")),
]
counts = {}
for label, pattern in patterns:
text, count = pattern.subn(f"[{label}]", text)
counts[label] = count
target.write_text(text, encoding="utf-8")
print("Replacement counts:", counts)
print("Output:", target)
此脚本使用 Python 标准库,不调用网络,也不把原始值打印到日志。所有同类字段使用同一个占位符,因此适合做结构示例;如果任务需要区分联系人,应该另设计稳定编号,但编号映射必须单独保护。
四、执行与验收
在脚本目录的 PowerShell 运行:
py redact.py
示例应该显示 EMAIL 和 PHONE 各替换 1 次。打开 sample.redacted.txt,应看到 [EMAIL] 和 [PHONE],原文件保持不变。再次运行时,脚本会拒绝覆盖输出,这是为了避免把上一版检查结果悄悄改掉。
不要只看替换次数。逐段阅读输出,检查“某学校唯一的财务负责人”这样的上下文是否仍能识别人。必要时把机构、职位、日期和金额区间一起泛化,或干脆用虚构样本替代。
五、这份脚本覆盖不了什么
| 情况 | 风险 | 处理方式 |
|---|---|---|
| 带空格或特殊写法的号码 | 正则可能漏检 | 人工抽查,增加测试样本 |
| PDF 图片、截图 | 没有直接处理 | 先核对 OCR 或使用专门打码工具 |
| Word 修订与批注 | TXT 示例不涵盖 | 使用合规流程清除隐藏内容并复核 |
| 地址与姓名 | 没有自动识别 | 按任务需要人工替换或删除 |
用矩形盖住文字也不一定真正删除 PDF 底层内容。导出后尝试选中、搜索和复制相关文字,确认敏感内容没有继续留在文件里。
六、常见问题与排错
替换后还要人工检查吗?
要。正则只覆盖预先定义的形式,无法理解全部个人信息和业务背景。
同一个人都变成 PHONE,会不会影响分析?
会。如果要分析重复联系人,应使用稳定的本地编号,并保护映射表;不要为了保留关联而直接上传原始号码。
编码错误怎么办?
先确认源文件是 UTF-8。不要用忽略解码错误的方式悄悄丢字符;转换副本后重新验证数量和内容。
接着可用表格清洗方法处理演示数据,或部署本地文档知识库。正则能力和文件读取接口见 Python re与pathlib 官方文档。