零数据也能训练:tanaos-text-anonymizer-v1 把姓名地址一键打码

核心问题:没有标注样本,如何把文本里的姓名、地址、电话、日期、地点五类隐私信息一次性抹掉?
一句话答案:用 tanaos-text-anonymizer-v1,一条命令生成 1 万条合成语料,10 分钟微调,推理阶段自动输出带 [MASKED] 占位符的安全文本。


本文欲回答的核心问题

  1. 这款“小”模型到底能识别哪些实体?
  2. “零数据训练”是噱头还是真能用?
  3. 实际落地时,选 Artifex 还是 Transformers?
  4. 多语言、垂直领域怎么玩?
  5. 作者踩了哪些坑,值得直接抄作业?

一、模型定位:轻量却专精的 PII 剃须刀

维度 数值 备注
基座 FacebookAI/roberta-base 110 M 参数,体积 440 MB
任务 Token 级分类(NER) 输出 B-I-O 标签
实体类别 5 类 PERSON / LOCATION / DATE / ADDRESS / PHONE_NUMBER
训练样本 1 万条合成段落 Artifex 库自动生成
推理延迟 CPU≈30 ms/句 GPU≈5 ms/句(T4)

一句话总结:把 14 类通用 NER 蒸馏成 5 类“最高危”隐私实体,模型体积不变,精度反而更稳。


二、5 类实体长什么样?场景化速览

实体类型 原文示例 识别后输出
PERSON John Doe 致电客服 [MASKED] 致电客服
LOCATION 公司总部在 New York 公司总部在 [MASKED]
DATE 合同签署于 2023-12-25 合同签署于 [MASKED]
ADDRESS 寄到 123 Main St, Springfield 寄到 [MASKED]
PHONE_NUMBER 手机 (555) 123-4567 手机 [MASKED]

场景 1:客服日志脱敏
客服中心每晚批量导出 10 万条对话,直接丢给模型,第二天给数据分析师的只有“干净”文本, GDPR 审计一次过。

场景 2:医疗病历云共享
医院把西班牙语病历 documentos medicos en Español 微调 20 分钟,就能在院内 SaaS 里自动打码患者姓名与就诊日期,医生科研团队拿到手即可放心做 NLP。


三、零数据训练真相:合成语料的黑盒里发生了什么?

核心问题:没有人工标注,1 万条样本从哪来?
Artifex 内置“模板+词典”引擎:

  1. 预置 5 类实体词典(西方常见人名、城市、电话格式、日期格式、地址模板)。
  2. 按语法模板随机组合,生成“看起来像人写”的句子。
  3. 自动给每个 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

平均延迟 吞吐量 (句/秒) 是否自动打码
Artifex 28 ms ≈35
Transformers 31 ms ≈32

结论:单核就能扛 30+ QPS,小型离线系统足够用;高并发场景加一层 FastAPI + GPU,可线性扩展到 500 QPS 以上。


七、常见踩坑与作者血泪建议

  1. 日期格式别只写 YYYY-MM-DD,把 Mar 12, 202312/03/23昨天上午 都加进模板,否则召回率哭给你看。
  2. 地址模板不要只放“数字+街道+城市”,把“Room 305, Building 7”这种写字楼写法也扩进去。
  3. 如果只想识别不打码,千万别用 Artifex 的默认接口,它默认把原文全遮死,产品经理会抓狂。
  4. 合成数据≠魔法,实体词典必须自己再清洗一次。作者把城市词典里的“Portland”放成 Maine 和 Oregon 两个州,结果模型把“Portland Cement”也当 LOCATION 打码,precision 当场掉 5 个点。

八、结论:什么时候选它,什么时候绕道

适合


  • 内部日志、客服对话、医疗病历、法律文书等通用格式文本

  • 缺少标注团队,却急需合规脱敏的初创公司;

  • 需要离线部署、对第三方 SaaS 零容忍的隐私场景。

不适合


  • 高度专业黑话,比如化学分子式里出现苯环 C6H6 被误当 DATE;

  • 需要识别银行 IBAN、社保号、车牌等超出 5 类实体的场景;

  • 追求 SOTA 竞赛分数,而非落地吞吐。

九、实用摘要 / 操作清单

  1. 装好 pip install artifex
  2. 写三行代码加载模型 → 输入原文 → 拿到 [MASKED] 文本。
  3. 若要多语言/垂直领域,一句 ta.train(domain="你的描述") 自动生成 1 万条样本,30 分钟微调。
  4. 生产环境加一层 REST 封装,单核 30 QPS 起步。
  5. 记得清洗实体词典,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% 即可上线。