零数据也能训练:tanaos-text-anonymizer-v1 把姓名地址一键打码
“
核心问题:没有标注样本,如何把文本里的姓名、地址、电话、日期、地点五类隐私信息一次性抹掉?
一句话答案:用 tanaos-text-anonymizer-v1,一条命令生成 1 万条合成语料,10 分钟微调,推理阶段自动输出带[MASKED]占位符的安全文本。
本文欲回答的核心问题
-
这款“小”模型到底能识别哪些实体? -
“零数据训练”是噱头还是真能用? -
实际落地时,选 Artifex 还是 Transformers? -
多语言、垂直领域怎么玩? -
作者踩了哪些坑,值得直接抄作业?
一、模型定位:轻量却专精的 PII 剃须刀
一句话总结:把 14 类通用 NER 蒸馏成 5 类“最高危”隐私实体,模型体积不变,精度反而更稳。
二、5 类实体长什么样?场景化速览
场景 1:客服日志脱敏
客服中心每晚批量导出 10 万条对话,直接丢给模型,第二天给数据分析师的只有“干净”文本, GDPR 审计一次过。
场景 2:医疗病历云共享
医院把西班牙语病历 documentos medicos en Español 微调 20 分钟,就能在院内 SaaS 里自动打码患者姓名与就诊日期,医生科研团队拿到手即可放心做 NLP。
三、零数据训练真相:合成语料的黑盒里发生了什么?
核心问题:没有人工标注,1 万条样本从哪来?
Artifex 内置“模板+词典”引擎:
-
预置 5 类实体词典(西方常见人名、城市、电话格式、日期格式、地址模板)。 -
按语法模板随机组合,生成“看起来像人写”的句子。 -
自动给每个 token 打上 B-I-O 标签,产出带标注的 JSON。
作者反思
第一次跑 num_samples=1000 结果召回率掉 8 个点,后来发现电话格式模板太少,把 (xxx) xxx-xxxx 扩展成 6 种国际格式后,召回直接拉回 96%。模板多样性比纯堆数量更值钱。
四、30 分钟上手:安装到推理的完整路径
4.1 环境准备
# 建议 Python≥3.8
pip install artifex # 一键自动换皮 & 打码
# 或者
pip install transformers torch # 仅识别,不打码
4.2 最快打码路线(Artifex)
from artifex import Artifex
ta = Artifex().text_anonymization
dirty = "John Doe lives at 123 Main St, New York. His phone number is (555) 123-4567."
clean = ta(dirty)[0]
print(clean)
# >>> [MASKED] lives at [MASKED]. His phone number is [MASKED].
一行代码,输出即脱敏。
如果你想把 [MASKED] 换成自定义占位符,只需:
ta.mask_token = "<REDACTED>"
4.3 仅识别、自写红标逻辑(Transformers)
from transformers import pipeline
ner = pipeline(
task="token-classification",
model="tanaos/tanaos-text-anonymizer-v1",
aggregation_strategy="first"
)
raw = "John Doe lives at 123 Main St, New York. His phone number is (555) 123-4567."
entities = ner(raw)
print(entities)
# >>> [{'entity_group': 'PERSON', 'word': 'John Doe', ...}, ...]
适合需要“高亮”而不是“删除”的合规场景,比如律师要在原文里标红再人工复核。
五、垂直领域微调:以西班牙语医疗病历为例
核心问题:不会写西班牙语标注,也能微调?
把领域描述写成自然语言即可,Artifex 会自动生成对应模板与词典。
from artifex import Artifex
ta = Artifex().text_anonymization
ta.train(
domain="documentos medicos en Español", # 一句话描述
num_samples=10000, # 再生成 1 万
output_path="./es_medical/"
)
ta.load("./es_medical/")
texto = "El paciente John Doe visitó Nueva York el 12 de marzo de 2023 a las 10:30 a. m."
print(ta(texto)[0])
# >>> El paciente [MASKED] visitó [MASKED] el [MASKED] a las [MASKED].
作者反思
用英文模板直接跑西班牙语,precision 掉 14%。把 domain= 写成西班牙语提示后,precision 拉回 94%,提示语言与目标语言一致很关键。
六、性能基准:小模型能不能扛大流量?
测试环境:Intel i7-12700 / 32 GB / 单核
句子长度:平均 32 token
结论:单核就能扛 30+ QPS,小型离线系统足够用;高并发场景加一层 FastAPI + GPU,可线性扩展到 500 QPS 以上。
七、常见踩坑与作者血泪建议
-
日期格式别只写 YYYY-MM-DD,把Mar 12, 2023、12/03/23、昨天上午都加进模板,否则召回率哭给你看。 -
地址模板不要只放“数字+街道+城市”,把“Room 305, Building 7”这种写字楼写法也扩进去。 -
如果只想识别不打码,千万别用 Artifex 的默认接口,它默认把原文全遮死,产品经理会抓狂。 -
合成数据≠魔法,实体词典必须自己再清洗一次。作者把城市词典里的“Portland”放成 Maine 和 Oregon 两个州,结果模型把“Portland Cement”也当 LOCATION 打码,precision 当场掉 5 个点。
八、结论:什么时候选它,什么时候绕道
适合
- •
内部日志、客服对话、医疗病历、法律文书等通用格式文本; - •
缺少标注团队,却急需合规脱敏的初创公司; - •
需要离线部署、对第三方 SaaS 零容忍的隐私场景。
不适合
- •
高度专业黑话,比如化学分子式里出现苯环 C6H6被误当 DATE; - •
需要识别银行 IBAN、社保号、车牌等超出 5 类实体的场景; - •
追求 SOTA 竞赛分数,而非落地吞吐。
九、实用摘要 / 操作清单
-
装好 pip install artifex。 -
写三行代码加载模型 → 输入原文 → 拿到 [MASKED]文本。 -
若要多语言/垂直领域,一句 ta.train(domain="你的描述")自动生成 1 万条样本,30 分钟微调。 -
生产环境加一层 REST 封装,单核 30 QPS 起步。 -
记得清洗实体词典,precision 立刻+5。
十、一页速览(One-page Summary)
- •
模型:tanaos-text-anonymizer-v1,roberta-base 微调,110 M 参数。 - •
实体:人名、地址、电话、日期、地点。 - •
数据:零标注,Artifex 合成 1 万样本。 - •
速度:CPU 单句 30 ms,吞吐 35 句/秒。 - •
接口:Artifex 自动打码;Transformers 仅识别。 - •
扩展:一句话描述领域即可再微调。 - •
落地:客服脱敏、医疗病历、法律文档,GDPR 合规一次过。
十一、FAQ
Q1:模型开源吗?商用收费吗?
A:权重托管在 Hugging Face,采用 Apache-2.0 协议,可商用。
Q2:中文效果怎样?
A:原文仅提供英文 checkpoint,中文需自己用 domain="中文客服日志" 微调,合成数据阶段把中文人名、地址模板喂给 Artifex 即可。
Q3:可以识别护照号码、银行卡号吗?
A:不在预设 5 类实体里,需要你把正则或词典接入后处理,或自行微调新增实体标签。
Q4:打码占位符能换成 UUID 吗?
A:Artifex 目前只支持单 token 占位符,你可以在后处理阶段把 [MASKED] 再映射成 UUID。
Q5:合成数据会泄露真实用户隐私吗?
A:模板+词典方式生成的句子与真实用户无关,理论上零泄露风险。
Q6:模型会更新吗?
A:关注 Hugging Face 仓库,作者团队未公布明确迭代节奏;你可以随时用 Artifex 拉最新基座再微调。
Q7:GPU 显存要求?
A:推理阶段 FP16 只需 1.2 GB;微调阶段 batch=8 时 8 GB 显存足够。
Q8:如何评估自己的微调效果?
A:Artifex 会自动划分 10% 合成数据做验证集,你也可以额外准备 100 条人工标注做盲测,precision/recall 都≥90% 即可上线。

