如何基于 CRF 模型识别中文姓名、手机号、身份证并替换?

解读

面试官并非想听“调包跑个 CRF”这么简单的答案,而是考察候选人能否把序列标注特征工程中文文本清洗合规脱敏工程落地五个维度串成一条可工业落地的闭环。
CRF 只是核心算法,真正的难点在:

  1. 中文姓名没有显式词边界,且存在单姓复姓、少数民族姓名、生僻字
  2. 手机号有165/191/197等新号段,且文本里常带空格、短横、括号;
  3. 身份证末位可能是X,且存在15 位升 18 位行政区划码过期等脏数据;
  4. 替换环节必须满足**《个人信息保护法》**的“去标识化”要求,不能简单截断;
  5. 百亿参数大模型场景下,CRF 一般作为小模型兜底知识插件,需要与 LLM 推理链路同构部署, latency 预算通常 < 20 ms。

知识点

  1. CRF 原理:线性链条件随机场,通过全局归一化解决标注偏置,适合小样本、高精确、可解释场景。
  2. 特征模板
    • Uni-gram 字特征:当前字、前后 2 窗口字符、字符类型(汉字/数字/字母/标点);
    • Bi-gram 特征:连续两字组合,解决“欧阳”、“司马”等复姓;
    • 词典特征:外挂全国公民姓名库最新手机号段表行政区划码,命中则打标;
    • 正则特征:用零宽断言预筛身份证号里的出生日期与校验位,降低 CRF 搜索空间。
  3. 标注体系:采用 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
  4. 模型训练
    • 语料来源:公开人民日报 1998+自爬裁判文书网 20 万段,人工复核 5 千段;
    • 采用置信学习清洗误标,用交叉验证 + 一致性检验保证 99%+ 标注一致率;
    • 使用CRF++python-crfsuite,L-BFGS 迭代 200 次,L2 正则系数 1.0。
  5. 推理加速
    • 将 CRF 权重转成稀疏矩阵,用Cython 写维特比,单核 CPU 1 万字符 < 8 ms;
    • 若部署在 GPU,可用TorchCRF 与 LLM 共享显存,batch 推理减少 kernel launch 开销。
  6. 合规替换
    • 姓名:保留首字,其余用替代,如“”;
    • 手机号:保留前三后二,中间用****,如“138****5678”;
    • 身份证:保留前 1 位与后 1 位,中间用 16 个*,如“1****************4”;
    • 生成审计日志,记录偏移量、原文长度、替换策略版本号,满足可追溯要求。
  7. LLM 链路集成
    • CRF 作为前置过滤器,先对 prompt 做脱敏,再送入大模型;
    • 若大模型输出含新增敏感片段,用后校验正则 + 二次 CRF 再扫一遍,形成双保险
    • 通过Prometheus 上报“脱敏延迟”、“误杀率”、“漏杀率”三项黄金指标,持续监控。

答案

整体分四步:数据准备 → 特征&训练 → 推理加速 → 合规替换

  1. 数据准备:爬取 20 万段中文文本,用正则粗标 + 人工精修得到 50 万实体,统一成 BIOES 标签。
  2. 特征&训练:
    • 模板示例(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
      
  3. 推理加速:
    • Cython 将维特比写成 int16 稀疏矩阵乘法,在 Intel 8260 2.4 GHz 单核实测 1 万字符 7.8 ms;
    • 若放在 GPU,把 CRF 转移矩阵转成 csr格式,batch=32 时 latency 降至 2.3 ms。
  4. 合规替换:
    • 识别到实体后,用零拷贝切片在原文本缓冲区直接替换,避免正则二次扫描;
    • 替换后生成脱敏映射表(offset, original_len, mask_pattern),写进Kafka 供下游审计;
    • 对命中“身份证+姓名”同一句的场景,采用联合掩码策略,防止通过交叉信息反推。

最终线上 A/B 测试:

  • 精确率 99.1%召回 98.7%F1 98.9%
  • 脱敏模块整体 latency P99 14 ms,满足大模型推理链路 20 ms 预算;
  • 连续运行 30 天,零漏报经人工抽检 5000 条,零合规投诉

拓展思考

  1. 小模型 vs 大模型:当 LLM 通过指令微调+LoRA 也能抽实体时,CRF 的价值在于可解释、可定点修复、无需 GPU。线上可采用**“大模型为主,CRF 兜底”级联框架**,当 LLM 置信 < 阈值时自动降级到 CRF,实现成本与效果的最佳平衡。
  2. 持续学习:新号段、新复姓、少数民族姓名会不断出现,可设计弱监督自训练流程:
    • 用 LLM 生成含新实体的合成语料 → CRF 重新训练 → 人工抽检 5% 纠错 → 模型热更新;
    • 通过特征重要性分析,动态裁剪 30% 低频特征,保持模型体积 < 2 MB,方便边缘部署
  3. 隐私计算:若业务方要求可用不可见,可将 CRF 封装成可信执行环境(TEE)so 文件,对外只提供脱敏句子和映射表加密分片,实现原文不出域的合规共享。