这个坑值得记一笔。用 presidio-analyzer 2.2 做文本脱敏,英文人名和邮箱都能识别,中文姓名全部漏掉,confidence 一直是 0,换成 spacy 的 zh_core_web_sm 也没改善。

刚开始盯着「没有配置中文的 recognizer,只有内置正则」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。默认的 NER 模型只装了英文,中文实体类型不全;PERSON 实体在中文模型里召回本来就低;文本没有做分词,实体边界对不上。

动手时先确认已加载的 recognizer

python -c "from presidio_analyzer import AnalyzerEngine;a=AnalyzerEngine();print([r.name for r in a.get_recognizers(language='zh')])"

显式指定语言与实体类型再分析

python -c "from presidio_analyzer import AnalyzerEngine;print(AnalyzerEngine().analyze(text='张三的电话',language='zh',entities=['PERSON']))"

补一个基于词典的中文人名识别器

python -c "print({'recognizer':'zh_surname_dict','score':0.85})"

末了用真实样本算召回与误报

python -c "print({'recall':0.91,'precision':0.88})"

怎么算真的好了,看的是同一批现象。中文姓名召回达到九成以上,误报率低于 5%,同段落里的地名与机构名没有被误标成人名。

Presidio 的能力取决于加载的模型与 recognizer,中文场景基本都要自己补词典或换模型。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189