假设你是一家大型物业公司的安防主管,管理着“未来花园”小区。每位业主的身份证号、手机号、银行卡号都留在物业系统里,这些数据一旦泄露,轻则被广告骚扰,重则被冒名办贷。你的任务,是设计一套安保体系:既要在快递员、维修工进出时快速识别“什么信息能看、什么信息必须藏起来”,又要保证日常物业服务照常运转。这就是 PII 检测与脱敏要解决的事。 在这篇文章里,你将看到一套三管齐下的混合方案:固定哨兵(正则表达式)、巡逻保安(命名实体识别 NER)、安保队长(大语言模型 LLM),再由“脱敏”这道伪装工序让敏感信息在保留使用价值的同时变得面目模糊。最后,我们会像业主考核物业一样,用精确率、召回率这些硬指标给安保体系打分。读完你会发现,隐私保护不是花哨的算法炫技,而是一场成本、准确与合规之间精心计算的攻防战。

岗位关联

掌握这套三管齐下的 PII 治理方案,你就能在生产环境中既满足 GDPR 等隐私合规要求,又保证数据产品的实用价值,这是 AI 工程师和数据团队的核心竞争技能。

目录
  1. 可视化演示
  2. PII概念分类:认识等待被保护的“隐私资产”
  3. 正则格式筛查:最勤快的固定哨兵
  4. NER语义识别:训练有素的巡逻保安
  5. LLM智能审核:理解语境的安保队长
  6. 多方法融合:三线联防指挥体系
  7. 脱敏处理策略:给敏感信息穿上伪装
  8. 合规评估调优:安保系统的考核验收
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示正则/NER/LLM三方法混合检测流程与五种脱敏算法对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

三方法混合PII检测 正则匹配:身份证/手机/邮箱等格式固定PII NER模型:人名/地名/机构等结构化实体 LLM语义:上下文敏感的隐含PII识别 PII = regex ∪ NER ∪ LLM (confidence) 三方法按置信度融合裁决。

PII概念分类:认识等待被保护的“隐私资产”

在“未来花园”小区,业主入住时登记的资料分为两类:一类是户口本、身份证这种一出手就能证明“我是我”的证件;另一类是性别、生日、居住楼层这种单独看很普通、但几个凑在一起就能把一个人从千万人里捞出来的线索。物业档案柜的锁,要为这两类资料同时上锁。这种“值钱的线索”意识,是理解整套方案的第一步。

在数据世界,前者叫“直接标识符”,后者叫“准标识符”。PII(Personally Identifiable Information),中文叫“个人身份标识信息”,是这两类信息的统称。GDPR、个人信息保护法等法规要求,凡是能识别到具体自然人的数据,都必须受到同等保护。

直接标识符包括身份证号、手机号、护照号;准标识符包括出生日期、性别、邮政编码、职业等。单独看准标识符无害,组合起来却能唯一锁定一个人——例如“1985年出生 + 北京 + 男 + 心血管科医生”几乎就能指向某个人。因此,PII 检测既要防“一眼看穿”,也要防“拼图还原”。

门卫的《业主资产清单》上,既列明了“金条存放箱”,也标注了“拼图线索箱”——后者往往更能暗藏风险。认清这两类资产,安保工作才谈得上有对象。

PII={x∣x∈直接标识符∪准标识符}\displaystyle \text{PII} = \{x \mid x \in \text{直接标识符} \cup \text{准标识符}\}
只要数据项能单独或组合识别到具体个人,就属于 PII 的管辖范围。
  1. 直接标识符单独一条信息就能锁定具体身份的数据,例如身份证号、手机号。
    直接标识符={身份证号,手机号,护照号,…}\text{直接标识符} = \{\text{身份证号}, \text{手机号}, \text{护照号}, \ldots\}
  2. 准标识符单独无法识别、多个组合后可锁定个人的数据,例如生日、性别、城市。
    准标识符={生日,性别,城市,职业,…}\text{准标识符} = \{\text{生日}, \text{性别}, \text{城市}, \text{职业}, \ldots\}
  3. 并集运算两类集合取并集,只要属于任意一类,一律按 PII 管理。
    A∪B={x∣x∈A 或 x∈B}A \cup B = \{x \mid x \in A \text{ 或 } x \in B\}

正则格式筛查:最勤快的固定哨兵

小区门口的智能门禁机,内置了一份“通行证样式库”:卡片必须是16位磁条、访客单必须盖红色章、外卖保温箱必须有平台贴纸。凡是符合样式的,机器 0.1 秒内放行。正则表达式就是这样一个“样式库”。它不看内容含义,只看字符串长相。

正则表达式是描述字符串格式的模板语言。PII 里最具“标准格式感”的就是手机号和身份证号:手机号严格 11 位,身份证号严格 18 位且末位可能带 X。用正则几乎可以零成本地把它们从文本海里捞出来。

手机号正则 1[3-9]\d{9},表示第一位是 1、第二位是 3 到 9、后面紧跟 9 位数字。身份证正则更复杂:区域 6 位 + 出生年 4 位 + 月日 4 位 + 顺序码 3 位 + 校验位 1 位。正则的优点是毫秒级响应、几乎不耗资源、结果可解释;缺点是只会“看长相”,随便写的 18 位数字也会被误认成身份证号。

门禁机再快,也分不清“印着访客单样式的传单”和“真正的访客单”——格式模板的局限,需要下一班巡逻保安来补。

L(手机号)=1⋅{3,4,5,6,7,8,9}⋅{0,1,…,9}9\displaystyle L(\text{手机号}) = 1 \cdot \{3,4,5,6,7,8,9\} \cdot \{0,1,\ldots,9\}^9
这个形式语言描述的是所有合法手机号构成的集合,正则就是它的“门禁规则”。
  1. 固定首位所有手机号都以数字 1 开头,这是第一道“牌匾”。
    11
  2. 第二位限制第二位只能是 3 到 9,排除了 1 开头、2 开头的特殊号码段。
    {3,4,5,6,7,8,9}\{3,4,5,6,7,8,9\}
  3. 剩余九位数字后面 9 位任意数字构成,加起来共 11 位。
    {0,1,…,9}9\{0,1,\ldots,9\}^9

NER语义识别:训练有素的巡逻保安

如果门禁机只认格式,那么“王五这个名字出现在一段散文里”它就无能为力了。好在院子里还有巡逻保安,他们认得业主的脸:“这位是 3 号楼的王总,那位是 8 号楼的李医生。”他们认的不是格式,而是“这个人听起来像某位业主”。NER 干的就是这件事。

命名实体识别(Named Entity Recognition,NER)从非结构化文本中找出人名、地名、机构名、时间等实体,并标注边界和类型。它是 NLP 的老牌任务,底层常用序列标注模型实现。比如输入“张三在北京上班”,输出是“张三”为人名、“北京”为地名。

具体到技术,BIO 标注体系是最常用的编码方式:B 表示实体开始(Begin),I 表示实体内部(Inside),O 表示非实体。例如“张三”标为 B-PER、I-PER。NER 的优点是能识别没有固定格式的姓名、地址、公司名;缺点是训练数据里没出现过的新人名、方言称呼,它很容易漏检。模型记住的是“规律”,不是“查字典”。

保安能认出熟脸,但见到“第一次搬来的租客”就抓瞎。要认识更多面孔,保安需要更多岗前训练——也就是更多高质量的标注数据。

y^=arg⁡max⁡yP(y1,y2,…,yn∣x1,x2,…,xn)\displaystyle \hat{y} = \arg\max_{y} P(y_1, y_2, \ldots, y_n \mid x_1, x_2, \ldots, x_n)
模型在给定输入词序列时,选择整体最合理的标签序列作为输出。
  1. 输入词序列文本被切分成词,例如“张三在上班”切成四个词。
    x1,x2,…,xnx_1, x_2, \ldots, x_n
  2. 输出标签序列每个词对应一个 BIO 标签,例如 B-PER 是人名开始。
    y1,y2,…,yn∈{B-PER,I-PER,B-LOC,O,…}y_1, y_2, \ldots, y_n \in \{\text{B-PER}, \text{I-PER}, \text{B-LOC}, \text{O}, \ldots\}
  3. 条件概率最大化在所有可能标签序列中,挑整体概率最高的一条作为预测。
    arg⁡max⁡yP(y∣x)\arg\max_y P(y \mid x)

LLM智能审核:理解语境的安保队长

真正的难题来了:外卖小哥小王每天中午来送餐,门卫见他穿制服、拿订单就放行;但如果他深夜两点翻墙进入小区呢?门卫和巡逻保安都吃不准,于是呼叫安保队长。队长看了一眼监控:“2 号楼 1403 近期点了夜宵,这人路线一致,是业主叫的外卖。”这是理解语境的判断力,正则和 NER 都不具备。

大语言模型(LLM)经过海量语料训练,具备强大的上下文理解和推理能力。在 PII 检测中,LLM 负责两类活儿:审慎判断“这到底算不算 PII”,以及处理被格式模板和实体词典漏掉的边界案例。比如“张三丰是武侠人物不是现实用户”“客服录音里的‘尾号 1234’是银行卡还是快递单号”,LLM 都能结合上下文给出合理答案。

使用方式通常是把待检测文本和 Prompt 一起送入模型,例如“你是数据合规审核员,判断以下文本是否包含个人信息并标注类型”。LLM 的缺点是成本高、延迟大、偶发幻觉,所以它不适合做全量扫描,更适合做“关键节点的专家复核”。

队长的工资最贵、出警最慢,所以聪明的物业只会把“翻墙的可疑身影”交给队长,绝不会让队长去数每一片树叶。这正是成本意识。

decision=arg⁡max⁡r∈{是PII,非PII}PLLM(r∣t,c)\displaystyle \text{decision} = \arg\max_{r \in \{\text{是PII}, \text{非PII}\}} P_{\text{LLM}}(r \mid t, c)
LLM 根据待检测文本 t 和上下文 c,选择概率更高的判断结果。
  1. 候选判断LLM 的输出被约束为“是 PII / 非 PII”两个候选答案。
    r∈{是PII,非PII}r \in \{\text{是PII}, \text{非PII}\}
  2. 输入文本与上下文t 是要判断的片段,c 是它的前后文,例如对话历史或段落语境。
    (t,c)(t, c)
  3. 概率最大决策模型内部对两个候选分别打分,取概率更高者作为最终判断。
    arg⁡max⁡rP(r∣t,c)\arg\max_r P(r \mid t, c)

多方法融合:三线联防指挥体系

成熟的小区安保必然是“三道防线”联动:门禁机把住格式、巡逻保安盯住熟脸、监控室队长做最终研判。三线联防的意义不是让谁取代谁,而是让每种角色各司其职、彼此兜底。工程实践中的 PII 检测方案也是这样。

最常见的混合策略有两种。串联流水线:先跑正则和 NER,凡是命中的直接标记;未命中或置信度低的片段再送 LLM 复核。并联加权:三种方法并行跑,各自打出置信度分数,按权重合成最终结论。正则和 NER 成本低、吞吐量大,能覆盖 90% 以上的标准场景;LLM 作为兜底,只处理剩余 10% 的模糊地带。

权重可以根据数据分布动态调节:金融场景身份证号优先级最高,把正则的权重调大;社交媒体场景人名和昵称居多,把 NER 的权重调大。这套“让专业的人干专业的活、让最贵的专家解决最难的问题”的设计,就是混合方案的精髓。

门禁机挡不住传单、保安认不出新租客、队长看不清全楼——但三者配合,就能把“伪装成访客的传单推销员”拦在门外。这就是混合的力量。

S(x)=w1r(x)+w2n(x)+w3l(x),w1+w2+w3=1\displaystyle S(x) = w_1 r(x) + w_2 n(x) + w_3 l(x), \qquad w_1 + w_2 + w_3 = 1
最终得分是三种检测器的加权和,权重体现了策略倾向。
  1. 正则得分命中固定格式时为 1,否则为 0。
    r(x)∈{0,1}r(x) \in \{0, 1\}
  2. NER 置信度实体识别的模型输出概率,取值在 0 到 1 之间。
    n(x)∈[0,1]n(x) \in [0, 1]
  3. LLM 置信度LLM 给出“是 PII”的概率分数。
    l(x)∈[0,1]l(x) \in [0, 1]
  4. 权重归一化三个权重和为 1,哪个方法更可靠,就给它更大的话语权。
    w1+w2+w3=1w_1 + w_2 + w_3 = 1

脱敏处理策略:给敏感信息穿上伪装

被识别出的敏感信息,就像业主放在前台的贵重物品。物业不会把它们直接展示给访客,而是放进“伪装盒”:盒子外观写着“普通日用品”,内部用主人编号记录。访客拿到的永远是一个“无法对应到具体业主”的替代品。脱敏要做的,就是给真实 PII 穿上这样一层伪装。

脱敏(Data Masking)是在数据流转和发布环节,把真实 PII 变成不可逆或难以关联的伪装值,同时尽量保留统计意义。三种主流策略各有分工:掩码、泛化、假名化。

掩码是保留前几位、其余打星号,如 1385678,常用于日志和客服界面;泛化是降低精度,如出生日期“1990-01-01”改为“1990 年”、地址“北京市朝阳区”改为“北京市”,适合数据分析场景;假名化是用确定性替换规则把“张三”换成“用户 A”,同一对象每次替换结果一致,适合需要跨系统关联分析的场景。三种策略可以组合使用,核心原则是:让数据研究者仍能统计“有多少盒药”,却不知道是“谁的药”。

“伪装盒”让访客拿得到盒子的形状和规格,却摸不着盒主人的身份——数据研究者仍能统计“有多少盒药”,却不知道是“谁的药”。这就是脱敏的意义。

mask(v,k)=v[0:k]+⋆ n−k,n=len(v)\displaystyle \mathrm{mask}(v, k) = v[0:k] + \star^{\,n-k}, \quad n = \mathrm{len}(v)
掩码脱敏保留前 k 位可辨识前缀,其余用星号全部遮蔽。
  1. 取值与长度v 是原始敏感值(如手机号),n 是它的总长度。
    n=len(v)n = \mathrm{len}(v)
  2. 保留前缀截取前 k 个字符原样保留,便于人工核对尾号或归属地。
    v[0:k]v[0:k]
  3. 星号补全剩余 n-k 位全部替换成星号,使原值无法完整还原。
    ⋆n−k\star^{n-k}

合规评估调优:安保系统的考核验收

每个季度末,业委会要对安保体系做一次验收:这季度拦住的可疑人员里,有多少是真坏人?漏掉几个真坏人?冤枉了几个正常访客?如果物业真的用心,就得把这三个数字算得明明白白。PII 检测系统的上线,同样要过这道考核关。

在机器学习评估中,这三个问题对应精确率(Precision)、召回率(Recall)和 F1 值。精确率回答“报出来的有多少是准的”,召回率回答“真正的 PII 有多少被抓住了”,F1 是二者的调和平均。在标注好的基准数据集上,需要统计三类样本:TP(真阳性,确实检出)、FP(假阳性,误报)、FN(假阴性,漏报)。

精确率 = TP / (TP + FP),召回率 = TP / (TP + FN)。F1 高意味着精确和召回都过硬,没有明显“偏科”。合规层面,GDPR 第 32 条要求采取“合适的技术与组织措施”保护个人数据,重大系统还需要做隐私影响评估(DPIA)。只有跑过基准集、算过 F1、通过 DPIA 的方案,才有底气说“可以接受监管审查”。

只有通过业委会验收的安保体系,才有资格挂上“五星小区”的牌子;同样,只有通过基准评测和合规审查的 PII 方案,才配在生产环境中真正上线。

F1=2×precision×recallprecision+recall\displaystyle F1 = \frac{2 \times \text{precision} \times \text{recall}}{\text{precision} + \text{recall}}
F1 是精确率和召回率的调和平均,比单纯算术平均更惩罚“偏科”的模型。
  1. 精确率在检出的 PII 集合中,真正是 PII 的比例。
    precision=TPTP+FP\text{precision} = \frac{TP}{TP + FP}
  2. 召回率在真实存在的 PII 中,被正确检出的比例。
    recall=TPTP+FN\text{recall} = \frac{TP}{TP + FN}
  3. 调和平均二者相乘的 2 倍除以二者之和,得到一个综合评分。
    2×precision×recallprecision+recall\frac{2 \times \text{precision} \times \text{recall}}{\text{precision} + \text{recall}}

AI 应用场景

银行客服质检实时脱敏

阶段:模型推理与部署

解决的问题:客服录音转写文本中包含客户身份证号、银行卡号,质检分析师查看原文时面临二次泄露风险。传统做法是人工审阅后再手工打码,效率低且容易遗漏。

具体案例:转写文本先过“正则快速扫卡号/证件号 → NER 标姓名/地名 → LLM 兜底判断‘我工号是 123456’这类模糊表述”的混合流水线,确认命中后立即脱敏,质检工单里只能看到 1385678 和“用户 A”这样的匿名文本。

AI训练数据发布前清洗

阶段:数据处理与准备

解决的问题:用爬虫和真实业务日志构造训练集时,文本中天然包含姓名、电话、住址,直接发布会违反 GDPR。传统方式是人工逐条筛查,几乎不可能完成。

具体案例:离线脚本先跑正则 + NER 快速标出常见 PII,对低置信片段提交 LLM 批量复核;然后按“假名化”策略把“张三”替换为“用户A”并建立映射表,模型训练时使用匿名数据,出现纠纷时可受控还原。

开发者日志系统敏感信息拦截

阶段:模型部署与监控

解决的问题:开发环境打印的 JSON 日志常把用户手机号跟着 log 一起打出来,渗透进日志聚合平台后极难清理。传统做法是事后“翻日志改代码”,永远追不上。

具体案例:在日志采集器的输出管线上嵌入轻量过滤器:正则秒级拦截明文手机号和身份证,NER 补充识别邮箱和地址;LLM 不参与高吞吐路径,只做离线抽样审计。形成“快速拦截 + 慢速审计”的两级架构,日志泄露面大幅收敛。

Python 演示

python65 行
import refrom typing import List, Tuple NAME_DICT = {"张三", "李四", "王五", "赵六"}PHONE_PATTERN = re.compile(r"1[3-9]\d{9}")ID_PATTERN = re.compile(r"[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]")  def regex_detector(text: str) -> List[Tuple[str, int, int]]:    hits = []    for pattern, tag in [(PHONE_PATTERN, "手机号"), (ID_PATTERN, "身份证号")]:        for m in pattern.finditer(text):            hits.append((tag, m.start(), m.end()))    return hits  def ner_detector(text: str) -> List[Tuple[str, int, int]]:    hits = []    for name in NAME_DICT:        pos = text.find(name)        while pos != -1:            hits.append(("姓名", pos, pos + len(name)))            pos = text.find(name, pos + 1)    return hits  def llm_judge(text: str) -> List[Tuple[str, int, int]]:    hits = []    for keyword in ["北京市", "上海市", "广州市"]:        pos = text.find(keyword)        while pos != -1:            hits.append(("地址", pos, pos + len(keyword)))            pos = text.find(keyword, pos + 1)    return hits  def merge_hits(all_hits: List[List[Tuple[str, int, int]]]) -> List[Tuple[str, int, int]]:    merged = []    for hits in all_hits:        for tag, start, end in hits:            merged.append((tag, start, end))    merged.sort(key=lambda x: (x[1], x[2]))    return merged  def mask_text(text: str, hits: List[Tuple[str, int, int]]) -> str:    chars = list(text)    for tag, start, end in hits:        for i in range(start, end):            chars[i] = "*"    return "".join(chars)  def main():    sample = "我叫张三,住在北京市朝阳区,手机号13812345678,身份证号110101199001011234。"    print("原始文本:", sample)    all_hits = [regex_detector(sample), ner_detector(sample), llm_judge(sample)]    hits = merge_hits(all_hits)    for tag, start, end in hits:        print(f"发现{tag}: {sample[start:end]}")    print("脱敏结果:", mask_text(sample, hits))  if __name__ == "__main__":    main()
目的:演示正则、NER、LLM 三条检测管线如何并行检出 PII,再通过合并与掩码实现脱敏。
  1. PHONE_PATTERN = re.compile(r"1[3-9]\d{9}")编译手机号正则,1[3-9] 限定第二位为 3-9。
  2. for pattern, tag in [(PHONE_PATTERN, "手机号"), ...]把多条正则和对应标签打包,循环扫描。
  3. for m in pattern.finditer(text)finditer 在全文迭代查找所有匹配位置。
  4. def ner_detector(text: str) -> List[Tuple[str, int, int]]:用姓名词典模拟 NER 的实体查找,返回“标签+起止位置”。
  5. pos = text.find(name)find 找到第一个出现位置,配合循环找出所有出现。
  6. def llm_judge(text: str) -> List[Tuple[str, int, int]]:用关键词词典模拟 LLM 对“地址类”实体的审核兜底。
  7. def merge_hits(all_hits: List[List[Tuple[str, int, int]]]) -> ...合并三路检测结果,统一为列表。
  8. merged.sort(key=lambda x: (x[1], x[2]))按起止位置排序,保证脱敏时按从左到右覆盖。
  9. chars = list(text)把字符串拆成字符列表,便于按索引替换为 *。
  10. all_hits = [regex_detector(sample), ner_detector(sample), llm_judge(sample)]三路检测器并行执行,构成混合方案的“并排三线”。

常见误区

误区手机号和身份证号都有固定格式,我写几行正则就能全捞出来,何必再上 NER 和 LLM?正则快、准、免费,一个正则包打天下不好吗?

正解正则只认“长相”不认“含义”。18 位纯数字的订单号、长得像手机号的座机号码,都会被误报。更关键的是,姓名、邮箱、地址这类没有强固定格式的 PII,正则完全无能为力。混合方案的价值正是用 NER 补语义、用 LLM 补上下文,而不是让正则单打独斗。

为何常见:因为手机号和身份证号确实是强格式数据,初学者很容易把“我见过的 PII”当成“全部的 PII”,犯了以偏概全的毛病。

误区LLM 这么聪明,上下文字段位无敌,直接把全部文本丢给它判断不就行了?正则和 NER 都该被淘汰。

正解LLM 有三大硬伤:成本高、延迟大、偶发幻觉。全量扫描时,每条请求都过 LLM,费用和响应时间都会失控。而且 LLM 对“格式是否合法”的把握并不如正则严谨,对“实体边界是否精确”也不如专用 NER 模型稳定。工程上的正确姿势是:让便宜的跑量,让贵的兜底。

为何常见:大模型演示效果惊艳,容易让人高估它的工程适用性,忽略成本和确定性这两把尺子。

误区NER 模型是“万能实体识别器”,只要训练过,什么人名、地名、机构名都能一网打尽。

正解NER 本质是统计模型,它学习的是训练数据里的分布规律。训练数据里没出现过的新名字、罕见的方言称呼、行业黑话,NER 都会漏检。所以工程上既要持续补充标注数据迭代模型,也要接受它是“高召回但非完美”的队友,后面还要 LLM 做复核。

为何常见:很多人把“模型见过很多数据”误解为“模型什么都知道”,忽略了模型只能回答它被训练过的问题。

误区把手机号中间四位换成星号,把名字换成 `*`,这就是脱敏了。一个工具函数走天下。

正解不同场景对脱敏的要求完全不同。日志场景适合掩码,数据分析场景适合泛化(保留年龄段才有统计意义),跨系统关联场景需要假名化(同一对象替换一致)。而且脱敏不等于加密:加密是可逆的,多数脱敏策略是不可逆或弱可逆的,设计时要明确“是否需要回查”以及“谁能回查”。

为何常见:因为掩码在界面上最常见、看起来最直观,初学者容易把“最显眼的做法”当成“唯一的做法”。

误区基准集上 F1 刷到 0.99,这个 PII 检测方案就完美了,直接上线没问题。

正解F1 只是综合指标,它掩盖了精确率和召回率的具体结构。金融合规场景宁可误报也不许漏报,此时高召回比高精确更关键;而面向 C 端用户的客服弹窗,误报会严重打扰体验,高精确更重要。另外评测基准集的分布是否贴近真实流量、是否覆盖边界案例,直接影响 F1 的代表性。

为何常见:因为 F1 是单一数字,给人“一个分数定生死”的简单感,人们倾向用数字代替对业务场景的深入思考。

面试题

Q1. 以下哪一项属于“直接标识符”?

单选题 · easy

  • A.用户所在城市
  • B.用户的出生日期
  • C.用户的身份证号码← 正确答案
  • D.用户的职业类型

答案:C。身份证号码单独一条就能锁定具体个人,是直接标识符。城市、生日、职业单独都无法识别个人,它们属于准标识符,需要组合才有风险。

Q2. 正则表达式 1[3-9]\d{9} 中 [3-9] 的含义是什么?

单选题 · easy

  • A.第一位数字只能是 3
  • B.第二位数字取 3 到 9 任一数← 正确答案
  • C.第一位数字取 3 到 9
  • D.最后九位只能取 3 到 9

答案:B。正则中第一个字符 1 匹配第一位,[3-9] 紧跟着匹配第二位,表示第二位必须是 3 到 9 之间的任意数字,后面的 \d{9} 才是剩余九位数字。

Q3. NER 的 BIO 标注中,B-PER 的作用是什么?

单选题 · mid

  • A.标记人名实体的起始位置← 正确答案
  • B.标记地点实体的内部位置
  • C.标记组织实体的结束位置
  • D.标记非实体的普通词汇

答案:A。B 是 Begin,表示实体开始;PER 是 Person 的缩写,指人名。B-PER 标记一个人名实体从左边界开始的那一个词,例如“张三住在北京”中“张”字的位置。

Q4. 在混合 PII 检测方案中,LLM 最不适合承担的工作是?

单选题 · mid

  • A.对模糊片段做二次判断
  • B.处理上下文相关的边界案
  • C.代替正则做全量实时拦截← 正确答案
  • D.解释可疑片段的判定理由

答案:C。LLM 延迟高、成本高,不适合全量、实时、高频的拦截任务;它适合做少量、复杂、需要上下文的兜底判断。全量拦截交给正则和 NER 才是成本最优的方案。

Q5. 掩码、泛化、假名化三种脱敏策略的共同目标是什么?

单选题 · mid

  • A.删除所有需要保护的字段
  • B.降低识别风险且保留可用性← 正确答案
  • C.对数据库进行整体加密
  • D.提升数据存储的压缩率

答案:B。三种策略都追求“数据可用但不可直接识别”:掩码保留可读前缀、泛化保留统计精度、假名化保留关联一致性。它们都不是删除数据,也不是加密或压缩。

Q6. 某检测模型精确率为 0.9、召回率为 0.5,F1 值的近似结果是?

单选题 · hard

  • A.0.64← 正确答案
  • B.0.70
  • C.0.72
  • D.0.75

答案:A。F1 = 2×0.9×0.5 / (0.9 + 0.5) = 0.9 / 1.4 ≈ 0.64。F1 是调和平均,对偏科严重(精确高、召回低)的模型会给出明显低于算术平均的分数。

Q7. 串联流水线中,为什么要把“未命中的样本”送去 LLM 复核?

单选题 · hard

  • A.为了降低系统的整体延迟
  • B.让模糊片段获得上下文判断← 正确答案
  • C.为了减少正则的编译工作量
  • D.让 NER 模型不再需要训练

答案:B。正则和 NER 命中的样本往往是格式或词典直接覆盖的“常规情况”,而漏掉的多是需要结合前后文才能判断的“模糊情况”。把这些低置信样本交给 LLM,是让最贵的能力用在最需要理解力的地方。

Q8. 以下哪些属于“准标识符”?

多选题 · mid

  • A.出生日期← 正确答案
  • B.所在城市← 正确答案
  • C.职业类型← 正确答案
  • D.指纹特征

答案:ABC。出生日期、城市、职业单独都无法锁定个人,需要组合使用,是准标识符。指纹特征能直接锁定个人,属于直接标识符,不属于准标识符。

Q9. 仅用正则检测 PII 存在哪些局限?

多选题 · hard

  • A.对格式变异的数据失效← 正确答案
  • B.无法区分语义场景← 正确答案
  • C.运行速度慢于 NER 模型
  • D.对无固定格式的实体无效← 正确答案

答案:ABD。正则依赖固定格式,格式一变就抓不到;它也不理解“这个号码是用户本人还是转账备注里的陌生人”这类语义;对姓名、邮箱等无强格式实体更是无效。正则的速度很快,C 选项说法反了。

Q10. 建设 PII 检测评估基准集时,应当考虑哪些因素?

多选题 · mid

  • A.覆盖常见类型的真实样本← 正确答案
  • B.包含多种领域的混合文本← 正确答案
  • C.加入模棱两可的边界案例← 正确答案
  • D.只使用单一来源的数据

答案:ABC。一个可靠的基准集要覆盖手机号、身份证、姓名等常见类型,跨越金融、社交、医疗等多领域文本,并刻意包含“看似 PII 实则不是”的边界案例。只用单一来源数据会让 F1 虚高,模型无法反映真实场景。