报错是这么冒出来的。Presidio 2.2 跑 1000 条中文工单,身份证号一条都没识别出来,PERSON 也只命中英文名,analyzer 返回的实体列表里全是空。
中间走过弯路,把「language 参数传成了 en」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。中文 NLP 引擎没加载,默认只装了英文模型。另一种情况是内置识别器没有中国身份证的规则。
还有一种情况,自定义正则没注册到 registry。
第一件事是看当前支持的实体列表
python -c "from presidio_analyzer import AnalyzerEngine;a=AnalyzerEngine();print(a.get_supported_entities())"
然后加载中文模型并指定 language 为 zh
python -c "from presidio_analyzer.nlp_engine import NlpEngineProvider;p=NlpEngineProvider(nlp_configuration={'nlp_engine_name':'spacy','models':[{'lang_code':'zh','model_name':'zh_core_web_sm'}]});print(p.create_engine().supported_languages)"
随后加一条 18 位身份证的正则识别器
python -c "import re;print(re.findall(r'[1-9]\d{5}(19|20)\d{2}\d{3}[\dXx]','310101199003071234'))"
回测 200 条标注样本看召回
python recall_test.py --set zh_tickets.jsonl --entity CN_ID
别只看报错消失,验证要多做一步。身份证召回从 0 升到 96%,人名召回 81%,脱敏后的文本里不再出现完整证件号,误杀率 1.2%。
这里还有个坑。Presidio 的中文支持要自己装配模型和识别器,装完还要用带标注的样本回测,不然只是看起来跑了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
