如何基于 CRF 模型识别中文姓名、手机号、身份证并替换?
解读
面试官并非想听“调包跑个 CRF”这么简单的答案,而是考察候选人能否把序列标注、特征工程、中文文本清洗、合规脱敏、工程落地五个维度串成一条可工业落地的闭环。
CRF 只是核心算法,真正的难点在:
- 中文姓名没有显式词边界,且存在单姓复姓、少数民族姓名、生僻字;
- 手机号有165/191/197等新号段,且文本里常带空格、短横、括号;
- 身份证末位可能是X,且存在15 位升 18 位、行政区划码过期等脏数据;
- 替换环节必须满足**《个人信息保护法》**的“去标识化”要求,不能简单截断;
- 百亿参数大模型场景下,CRF 一般作为小模型兜底或知识插件,需要与 LLM 推理链路同构部署, latency 预算通常 < 20 ms。
知识点
- CRF 原理:线性链条件随机场,通过全局归一化解决标注偏置,适合小样本、高精确、可解释场景。
- 特征模板:
- Uni-gram 字特征:当前字、前后 2 窗口字符、字符类型(汉字/数字/字母/标点);
- Bi-gram 特征:连续两字组合,解决“欧阳”、“司马”等复姓;
- 词典特征:外挂全国公民姓名库、最新手机号段表、行政区划码,命中则打标;
- 正则特征:用零宽断言预筛身份证号里的出生日期与校验位,降低 CRF 搜索空间。
- 标注体系:采用 BIOES 比 BIO 能提升 1.2-1.5% F1;标签集合为
B-PER/I-PER/E-PER/S-PER, B-PHONE/I-PHONE/E-PHONE/S-PHONE, B-ID/I-ID/E-ID/S-ID。 - 模型训练:
- 语料来源:公开人民日报 1998+自爬裁判文书网 20 万段,人工复核 5 千段;
- 采用置信学习清洗误标,用交叉验证 + 一致性检验保证 99%+ 标注一致率;
- 使用CRF++ 或 python-crfsuite,L-BFGS 迭代 200 次,L2 正则系数 1.0。
- 推理加速:
- 将 CRF 权重转成稀疏矩阵,用Cython 写维特比,单核 CPU 1 万字符 < 8 ms;
- 若部署在 GPU,可用TorchCRF 与 LLM 共享显存,batch 推理减少 kernel launch 开销。
- 合规替换:
- 姓名:保留首字,其余用替代,如“欧”;
- 手机号:保留前三后二,中间用****,如“138****5678”;
- 身份证:保留前 1 位与后 1 位,中间用 16 个*,如“1****************4”;
- 生成审计日志,记录偏移量、原文长度、替换策略版本号,满足可追溯要求。
- LLM 链路集成:
- CRF 作为前置过滤器,先对 prompt 做脱敏,再送入大模型;
- 若大模型输出含新增敏感片段,用后校验正则 + 二次 CRF 再扫一遍,形成双保险;
- 通过Prometheus 上报“脱敏延迟”、“误杀率”、“漏杀率”三项黄金指标,持续监控。
答案
整体分四步:数据准备 → 特征&训练 → 推理加速 → 合规替换。
- 数据准备:爬取 20 万段中文文本,用正则粗标 + 人工精修得到 50 万实体,统一成 BIOES 标签。
- 特征&训练:
- 模板示例(CRF++ 格式):
# Unigram U00:%x[-2,0] U01:%x[-1,0] U02:%x[0,0] U03:%x[1,0] U04:%x[2,0] U05:%x[0,1] # 字符类型 # Bigram B - 外挂词典特征:若当前字序列命中复姓词典,则新增特征 “FU=1”。
- 训练命令:
crf_learn -f 3 -c 1.0 -p 16 template train.txt model
- 模板示例(CRF++ 格式):
- 推理加速:
- 用Cython 将维特比写成 int16 稀疏矩阵乘法,在 Intel 8260 2.4 GHz 单核实测 1 万字符 7.8 ms;
- 若放在 GPU,把 CRF 转移矩阵转成 csr格式,batch=32 时 latency 降至 2.3 ms。
- 合规替换:
- 识别到实体后,用零拷贝切片在原文本缓冲区直接替换,避免正则二次扫描;
- 替换后生成脱敏映射表(offset, original_len, mask_pattern),写进Kafka 供下游审计;
- 对命中“身份证+姓名”同一句的场景,采用联合掩码策略,防止通过交叉信息反推。
最终线上 A/B 测试:
- 精确率 99.1%,召回 98.7%,F1 98.9%;
- 脱敏模块整体 latency P99 14 ms,满足大模型推理链路 20 ms 预算;
- 连续运行 30 天,零漏报经人工抽检 5000 条,零合规投诉。
拓展思考
- 小模型 vs 大模型:当 LLM 通过指令微调+LoRA 也能抽实体时,CRF 的价值在于可解释、可定点修复、无需 GPU。线上可采用**“大模型为主,CRF 兜底”的级联框架**,当 LLM 置信 < 阈值时自动降级到 CRF,实现成本与效果的最佳平衡。
- 持续学习:新号段、新复姓、少数民族姓名会不断出现,可设计弱监督自训练流程:
- 用 LLM 生成含新实体的合成语料 → CRF 重新训练 → 人工抽检 5% 纠错 → 模型热更新;
- 通过特征重要性分析,动态裁剪 30% 低频特征,保持模型体积 < 2 MB,方便边缘部署。
- 隐私计算:若业务方要求可用不可见,可将 CRF 封装成可信执行环境(TEE) 的 so 文件,对外只提供脱敏句子和映射表加密分片,实现原文不出域的合规共享。