想象你是小镇套娃集市上的鉴宝掌柜。清晨来了一车货,最大的那只红裙农妇躺在箱顶,可买家却问:“她肚子里的绿衣少女呢?再里面的婴儿呢?”收货手册写着“每件藏品都要登记”,但你从前只在货架最外层贴一张标签——这是“扁平标注”,只看得见最外面的大套娃,里面的宝贝全被吞没了。 嵌套NER(Nested Named Entity Recognition)要解决的,正是“套娃里还有套娃”的问题。一段文字里,“北京中医药大学”(学校)肚子里藏着“北京”(地点);医疗病历中,病灶描述往往包着更细的解剖部位。传统方法一个位置只允许一个标签,遇到套娃就束手无策。这篇文章带你学会“打开套娃”的三套手艺:超图标注(给每层娃娃戴不同颜色的识别环)、跨度边界方法(先量出娃娃的轮廓)、Biaffine模型(把娃娃的头脚拼起来打分)。学完你就能在医疗、法律、学术文本的集市里,把每一层宝贝登记得明明白白。

岗位关联

嵌套实体在病历、法律文书、论文摘要中无处不在,掌握嵌套NER是高级信息抽取工程师的必备技能,也是电子病历结构化、法律要素抽取等工业项目的关键一环。

目录
  1. 可视化演示
  2. 嵌套实体认知
  3. 超图标注方法
  4. 跨度边界方法
  5. Biaffine模型
  6. 训练优化策略
  7. 场景落地应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示嵌套命名实体识别中实体层层包含的结构,对比扁平NER、超图标注与Biaffine模型的识别差异。

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

扁平NER模式 仅识别最外层实体北京大学和信息科学技术学院,忽略嵌套关系 P(span)=argmax s(i,j) 扁平模型无法处理实体包含实体的情况

嵌套实体认知

套娃集市上,掌柜把货架上的娃娃挨个登记。体型最大的红裙农妇登记完正要盖戳,买家却问:“肚子里的绿衣少女呢?再里面的婴儿呢?”掌柜这才明白,一件藏品里可能藏着好几件藏品——文本里的实体也有同样的脾气。

当一个实体的字符区间完整落在另一个实体内部,就叫“嵌套实体”。比如“北京中医药大学”(学校 ORG)里住着“北京”(地点 GPE);“北京大学信息科学技术学院”里住着“信息科学技术学院”。传统扁平NER(命名实体识别)像只登记货架最外侧的标签,里面的宝贝一律看不见,这正是它最大的局限。

形式化地说,实体的“跨度”就是它在句子中占用的起止位置区间。嵌套约束要求:只要两个实体跨度有交集,就必然一个完全包含另一个,绝不允许“你插在我左边、我插在你右边”的交叉。这条性质是所有嵌套处理方法的设计根基。

理解了套娃的脾气,接下来要解决两件事:怎么“标注”层层叠叠的宝贝(超图),以及怎么“找到”每层宝贝(跨度与Biaffine)。先把货架摆满再说。

∀ ei,ej∈E:span⁡(ei)∩span⁡(ej)≠∅  ⇒  span⁡(ei)⊂span⁡(ej) 或 span⁡(ej)⊂span⁡(ei)\displaystyle \forall\, e_i, e_j \in \mathcal{E}:\quad \operatorname{span}(e_i) \cap \operatorname{span}(e_j) \neq \varnothing \;\Rightarrow\; \operatorname{span}(e_i) \subset \operatorname{span}(e_j) \ \text{或} \ \operatorname{span}(e_j) \subset \operatorname{span}(e_i)
嵌套的核心就一句话:位置重叠可以,但只允许“完全包含”,不允许“交叉”。
  1. 实体集合$\mathcal{E}$ 表示句子中所有待识别实体的集合,就像集市上所有大小套娃的集合。
    E\mathcal{E}
  2. 跨度$\operatorname{span}(e)$ 表示实体 $e$ 在句子中占用的字符区间,如同套娃在货架上占据的格子范围。
    span⁡(e)\operatorname{span}(e)
  3. 交集非空两个跨度有重叠,说明两只套娃的位置撞到了一起,它们之间必有关系。
    span⁡(ei)∩span⁡(ej)≠∅\operatorname{span}(e_i) \cap \operatorname{span}(e_j) \neq \varnothing
  4. 真包含重叠只允许一种情形——一只完全套在另一只里面,这才是合法嵌套。
    span⁡(ei)⊂span⁡(ej)\operatorname{span}(e_i) \subset \operatorname{span}(e_j)

超图标注方法

掌柜想出一招:给每层娃娃戴不同颜色的识别环——最外层挂红环,里层挂绿环,婴儿挂金环。帽子可以叠戴,标签也就不会打架。这套“叠环”的记账法,就是超图标注的雏形。

普通序列标注(如 BIO)给每个字贴一个标签,本质是“一个位置只准挂一件货”;超图标注则允许同一个位置同时属于多个实体的跨度,每个跨度携带自己的类别标签。于是“北京中医药大学”挂上 ORG 环,“北京”也能在同一位置挂上 GPE 环,互不冲突。

具体实现时,用一个三维张量来记录所有起止区间与类别的匹配关系:句子长度为 $n$、类别数为 $|\mathcal{C}|$ 时,张量形状是 $n \times n \times |\mathcal{C}|$。某个跨度 $(i,j)$ 属于类别 $c$,就把对应位置置为 1。嵌套实体不再是“选谁不选谁”,而是全部并存、按层解码。

识别环戴好,掌柜的货架一览无余。不过环不会自己戴上——还需要算法去预测每一处该不该套环,下一节看“量轮廓”的办法。

L∈{0,1} n×n×∣C∣,Li,j,c=1  ⟺  跨度 (i,j) 的类别为 c\displaystyle \mathbf{L} \in \{0,1\}^{\,n \times n \times |\mathcal{C}|}, \qquad L_{i,j,c} = 1 \iff \text{跨度 } (i,j) \text{ 的类别为 } c
超图标注 = 给每个可能的娃娃区间准备一个标签格位,层与层之间互不挤占。
  1. 序列长度$n$ 是句子的字符个数,决定货架上有多少个候选位置。
    nn
  2. 起止组合$n \times n$ 表示从第 $i$ 个字到第 $j$ 个字的所有起止跨度组合。
    n×nn \times n
  3. 类别数量$|\mathcal{C}|$ 是实体类别总数(ORG / GPE / DEPT……),对应识别环的颜色种类。
    ∣C∣|\mathcal{C}|
  4. 置位表示$L_{i,j,c}=1$ 说明区间 $(i,j)$ 确实标成了 $c$ 类,这只娃娃戴上了相应的环。
    Li,j,c=1L_{i,j,c} = 1

跨度边界方法

集市里淘货,掌柜习惯先弯腰打量宝贝的轮廓:头顶在哪、脚底在哪。轮廓对了,再细看肚皮上的花纹是不是真品。跨度边界方法就是这套“先量轮廓、再鉴定”的两段式手艺。

第一步是生成候选跨度——把句子所有可能的(起点,终点)区间都列出来;第二步训练分类器,判断每个区间是实体还是空盒子,若是实体又属于哪一类。比起逐字打标签,它以“区间”为基本单位,天然能同时容纳内外层。

更精细的做法是分别预测“起点概率”和“终点概率”:用 sigmoid 函数把打分压成 0 到 1 之间的概率,起点概率与终点概率同时超过阈值的起止配对,才构成候选跨度;之后再交给跨度分类器做最终判决。这样可以把理论上的 $O(n^2)$ 种组合剪掉大量明显不可能的区间。

轮廓量好,还得鉴定花纹。掌柜说,光量轮廓不够,关键要“头脚相认”——下一节的天平就派上用场了。

pstart(i)=σ ⁣(ws⊤hi),pend(j)=σ ⁣(we⊤hj)\displaystyle p_{\mathrm{start}}(i) = \sigma\!\left(\mathbf{w}_s^{\top} \mathbf{h}_i\right), \qquad p_{\mathrm{end}}(j) = \sigma\!\left(\mathbf{w}_e^{\top} \mathbf{h}_j\right)
边界预测先把“头在哪儿、尾在哪儿”分别定出来,再配对成候选,最后才分类。
  1. 字符向量$\mathbf{h}_i$ 是第 $i$ 个字符经过编码后的语义向量,相当于娃娃的“证件照”。
    hi\mathbf{h}_i
  2. 起点打分$p_{\mathrm{start}}(i)$ 表示第 $i$ 个位置作为实体起点的概率,判断“这里像不像头顶”。
    pstart(i)=σ(ws⊤hi)p_{\mathrm{start}}(i) = \sigma(\mathbf{w}_s^{\top} \mathbf{h}_i)
  3. 终点打分$p_{\mathrm{end}}(j)$ 表示第 $j$ 个位置作为实体终点的概率,判断“这里像不像脚底”。
    pend(j)=σ(we⊤hj)p_{\mathrm{end}}(j) = \sigma(\mathbf{w}_e^{\top} \mathbf{h}_j)
  4. sigmoid 函数$\sigma$ 把任意实数压缩到 0~1,变成可比较的百分比。
    σ\sigma

Biaffine模型

掌柜有杆祖传天平:鉴定一个跨度时,把起点的“头”放左盘、终点的“尾”放右盘,中间横梁刻着密密麻麻的旋钮(矩阵)。头和尾配合默契,天平就亮出高分。这杆天平,就是 Biaffine(双仿射)打分器。

Biaffine 不一刀切地把“头向量 + 尾向量”拼起来过一层网络,而是让两个向量通过一个矩阵发生双线性交互——头向量的每个分量都能与尾向量的每个分量相乘,再按矩阵权重求和。这样“头字与尾字之间”的关系被充分刻画,比简单的拼接或点积丰富得多。

数学上,对类别 $c$,跨度 $(i,j)$ 的打分由三部分组成:头向量转置乘矩阵 $\mathbf{W}_c$ 再乘尾向量(双线性项);头尾拼接向量与 $\mathbf{U}_c$ 的内积(线性项);以及偏置 $b_c$。所有类别各打一遍分,经过 softmax 得到该跨度的类别分布。由于每个嵌套实体的“头尾”位置不同,它们可以同时被各自的打分区分出来。

天平在手,层层娃娃皆可称量。可掌柜很快发现:空盒子太多,称到手软也找不全真品——训练也要讲究章法。

s(i,j,c)=hi⊤Wc hj+Uc⊤[hi;hj]+bc\displaystyle s(i,j,c) = \mathbf{h}_i^{\top} \mathbf{W}_c\, \mathbf{h}_j + \mathbf{U}_c^{\top} [\mathbf{h}_i ; \mathbf{h}_j] + b_c
Biaffine 的精髓:头尾向量不光是“拼在一起”,而是通过矩阵做乘法级的深度交互。
  1. 双线性项$\mathbf{h}_i^{\top} \mathbf{W}_c \mathbf{h}_j$ 是头向量与尾向量经矩阵 $\mathbf{W}_c$ 的二次交互,相当于天平两端合力称重。
    hi⊤Wchj\mathbf{h}_i^{\top} \mathbf{W}_c \mathbf{h}_j
  2. 拼接向量$[\mathbf{h}_i ; \mathbf{h}_j]$ 把头尾向量首尾相连,保留各自的独立信息。
    [hi;hj][\mathbf{h}_i ; \mathbf{h}_j]
  3. 线性项$\mathbf{U}_c^{\top} [\mathbf{h}_i ; \mathbf{h}_j]$ 给拼接向量的每个分量单独加权,像给天平两端各加砝码。
    Uc⊤[hi;hj]\mathbf{U}_c^{\top} [\mathbf{h}_i ; \mathbf{h}_j]
  4. 偏置$b_c$ 是类别 $c$ 的零点校准,让天平在不同类别上有不同的起步值。
    bcb_c

训练优化策略

集市仓库里,真娃娃只占一小撮,空盒子和碎木片堆成小山。掌柜若一视同仁地逐个细看,眼光很快被满天飞的空盒子带偏。嵌套NER训练正是这个道理:所有候选跨度里,“非实体”的负样本占了绝大多数。

直接拿普通交叉熵训练,模型会发现“把所有跨度都判成非实体”就能把损失压到很低,于是偷懒躺平。为此业界常用三招:加权交叉熵给正样本更高权重;焦点损失(Focal Loss)让模型把注意力从“已轻松判对的样本”转移到“怎么也拿不准的难例”上;难例挖掘则只挑最像实体的负样本进训练。

焦点损失的公式在普通交叉熵前乘了一个调制因子:模型对真实类别越有把握,$(1-p_t)^{\gamma}$ 越小,该样本的损失贡献被压低;越是没把握的难样本,贡献越大。同时工程上还要限制最大跨度长度,把 $O(n^2)$ 的候选规模砍到可控范围,否则推理时间会随句长急剧膨胀。

训练有素的掌柜,终于能在自家集市把每一层娃娃登记得又快又准。接下来,他准备带着手艺走四方。

L=− αt (1−pt)γ log⁡pt\displaystyle \mathcal{L} = -\,\alpha_t\,(1 - p_t)^{\gamma}\,\log p_t
焦点损失 = 给“轻松判断”的样本降权,逼模型死磕那些难辨真伪的套娃。
  1. 真实类别概率$p_t$ 是模型对真实类别的预测概率,即掌柜对一件真品的信心值。
    ptp_t
  2. 对数损失$-\log p_t$ 是普通的交叉熵项,预测越准损失越小。
    −log⁡pt-\log p_t
  3. 调制因子$(1-p_t)^{\gamma}$ 是焦点损失的关键,信心越高权重越低,避免易分负样本淹没梯度。
    (1−pt)γ(1-p_t)^{\gamma}
  4. 类别权重$\alpha_t$ 为稀有类别(真实体)配更高权重。
    αt\alpha_t

场景落地应用

掌柜挑着工具箱走出小镇:不同集市的货品千奇百怪,但“层层鉴定”的道理不变。医疗、法律、学术三大集市,是嵌套实体最密集的地方。

医疗病历是最典型的嵌套宝库:“右肺上叶前段磨玻璃结节”里,解剖部位(右肺)、肺叶分段(上叶前段)、影像征象(磨玻璃结节)层层相套,扁平抽取只能取到最外层,结构化后就丢了从属关系。法律文书里,“北京市朝阳区人民法院”内嵌“北京”“朝阳区”,机构层级与管辖信息要一层层剥开。学术摘要里,“基于深度学习的命名实体识别方法”内嵌着“深度学习”和“命名实体识别”两个方法实体。

落地优化集中在三处:数据标注阶段用超图标注工具保证多层标签不丢失;推理阶段限制最大跨度并及时剪枝,保证长文吞吐;评测阶段用逐实体 F1——精确率(Precision)与召回率(Recall)缺一不可,任何一层宝贝漏掉都算召回损失,任何一层误报都拉低精确率。

三个集市跑下来,掌柜的名号传开了——“套娃掌柜,层层分明”。你学到的,正是这套层层分明的本事。

F1=2×Precision×RecallPrecision+Recall\displaystyle \mathrm{F1} = \frac{2 \times \mathrm{Precision} \times \mathrm{Recall}}{\mathrm{Precision} + \mathrm{Recall}}
F1 是精确率与召回率的调和平均:既不许漏判内层,也不许误报空盒。
  1. 精确率$\mathrm{Precision}$ 是鉴定出的宝贝里真品的比例,衡量“报得准不准”。
    Precision\mathrm{Precision}
  2. 召回率$\mathrm{Recall}$ 是所有真品里被鉴定出来的比例,衡量“找得全不全”。
    Recall\mathrm{Recall}
  3. 调和平均$\dfrac{2PR}{P+R}$ 对两个指标取均衡,任何一个拖后腿,F1 都会明显下降。
    2×Precision×RecallPrecision+Recall\frac{2 \times \mathrm{Precision} \times \mathrm{Recall}}{\mathrm{Precision} + \mathrm{Recall}}

AI 应用场景

医疗病历实体与征象分层抽取

阶段:数据标注与模型训练

解决的问题:病历中“右肺上叶前段磨玻璃结节”同时包含解剖部位(右肺、右肺上叶)、分段(前段)与影像征象(磨玻璃结节)。传统扁平抽取只能取最外层,结构化报告会丢失“部位—征象”的从属关系,就像只登记最外面的大套娃。

具体案例:某三甲医院影像科引入超图标注工具,对 5 万份胸部 CT 报告做双层标注,再用 Biaffine 跨度打分模型训练。入院记录结构化从人工每份约 5 分钟降到模型平均 0.8 秒,随访查询“右肺上叶的结节”能直接命中嵌套层。

法律文书法院名称与管辖层级抽取

阶段:模型推理与知识图谱构建

解决的问题:裁判文书里“北京市朝阳区人民法院”内嵌“北京”“朝阳区”。抽取机构名时若只取外层,地域与法院层级信息丢失,管辖归属分析就会出错。

具体案例:某法律科技公司用嵌套 NER 解析 20 万份裁判文书,一次性还原“省—市—区—法院”层级,案由与管辖地关联的准确率从 78% 提升到 93%,为类案检索提供了扎实的机构知识图谱。

学术文本方法实体抽取

阶段:模型推理与后处理

解决的问题:论文摘要“基于深度学习的命名实体识别方法”里,“深度学习”“命名实体识别”都是方法实体,嵌套在标题实体内部;扁平抽取会漏掉这些关键技术词,热点分析就会失真。

具体案例:某科研情报平台对每年 30 万篇 AI 论文标题做嵌套抽取,技术热点图谱中“预训练模型”这类嵌套子实体被完整还原,按技术词检索论文的命中率显著提升。

Python 演示

python77 行
# -*- coding: utf-8 -*-"""嵌套NER演示:Biaffine 双仿射打分识别套娃式嵌套实体""" import numpy as np  def make_spans(n):    """枚举句子中所有候选跨度 [s, e]"""    return [(s, e) for s in range(n) for e in range(s, n)]  class BiaffineNestedNER:    def __init__(self, vocab_size, dim=8, num_labels=3, seed=7):        rng = np.random.default_rng(seed)        self.dim = dim        self.num_labels = num_labels        self.E = rng.normal(0, 0.1, (vocab_size, dim))        self.W = rng.normal(0, 0.05, (num_labels, dim, dim))        self.U = rng.normal(0, 0.05, (num_labels, 2 * dim))        self.b = rng.normal(0, 0.05, (num_labels,))     def logits(self, h, t):        """头向量 h 与尾向量 t 的组合打分"""        pair = np.concatenate([h, t])        out = np.zeros(self.num_labels)        for k in range(self.num_labels):            out[k] = h @ self.W[k] @ t + self.U[k] @ pair + self.b[k]        return out     def train(self, sents, golds, steps=800, lr=0.03):        for _ in range(steps):            for sent, gold in zip(sents, golds):                emb = np.array([self.E[i] for i in sent])                for s, e in make_spans(len(sent)):                    logits = self.logits(emb[s], emb[e])                    q = np.exp(logits - logits.max())                    q = q / q.sum()                    y = gold.get((s, e), 0)                    delta = q.copy()                    delta[y] -= 1.0                    dh = np.zeros(self.dim)                    dt = np.zeros(self.dim)                    for k in range(self.num_labels):                        dh += delta[k] * (self.W[k] @ emb[e] + self.U[k][:self.dim])                        dt += delta[k] * (self.W[k].T @ emb[s] + self.U[k][self.dim:])                    for k in range(self.num_labels):                        self.W[k] -= lr * delta[k] * np.outer(emb[s], emb[e])                        self.U[k] -= lr * delta[k] * np.concatenate([emb[s], emb[e]])                        self.b[k] -= lr * delta[k]                    self.E[sent[s]] -= lr * dh                    self.E[sent[e]] -= lr * dt     def decode(self, sent, labels, threshold=0.5):        emb = np.array([self.E[i] for i in sent])        hits = []        for s, e in make_spans(len(sent)):            logits = self.logits(emb[s], emb[e])            k = int(np.argmax(logits))            if k != 0 and logits[k] > threshold:                hits.append((s, e, labels[k], round(float(logits[k]), 3)))        return hits  def main():    vocab = list("北京中医药大学东直门医院")    idx = {w: i for i, w in enumerate(vocab)}    s1 = [idx[w] for w in "北京中医药大学"]    s2 = [idx[w] for w in "东直门医院"]    golds = [{(0, 1): 1, (0, 6): 2}, {(0, 4): 2}]  # 0=O, 1=GPE, 2=ORG    model = BiaffineNestedNER(vocab_size=len(vocab))    model.train([s1, s2], golds, steps=800)    for sent, name in [(s1, "北京中医药大学"), (s2, "东直门医院")]:        print(name, "=>", model.decode(sent, ["O", "GPE", "ORG"]))  if __name__ == "__main__":    main()
目的:用 30 行核心逻辑实现一个可训练的 Biaffine 嵌套 NER,在迷你数据集上演示“北京 ⊂ 北京中医药大学”这类嵌套实体的识别机制。
  1. def make_spans(n):枚举句子所有候选跨度,对应“先量轮廓”的候选生成步骤。
  2. out[k] = h @ self.W[k] @ t + self.U[k] @ pair + self.b[k]Biaffine 核心:双线性项 + 线性项 + 偏置。
  3. delta[y] -= 1.0交叉熵对 logits 的梯度,模型靠它知道“该往哪个方向校准”。
  4. self.E[sent[s]] -= lr * dh反向更新起点字符向量,让“头”学会与“尾”配合。
  5. golds = [{(0, 1): 1, (0, 6): 2}, {(0, 4): 2}]标注数据里 0 号跨度是 GPE、6 号跨度是 ORG,两者重叠即嵌套。
  6. model.decode(sent, ["O", "GPE", "ORG"])解码时逐个跨度取最高分标签,超过阈值才算实体。

常见误区

误区嵌套实体是中文特有的现象,英文单词之间天然有空格,不会出现一层套一层,所以做英文项目不用考虑嵌套。

正解嵌套在英文中同样普遍。例如 “University of California, Berkeley“ 整体是大学实体,内部还包含地名实体 ”California“ 与 ”Berkeley“;医疗英文缩写 ”COVID-19 pneumonia“ 里也常嵌套病毒名与疾病名。套娃不分语言,只要文本里存在”整体—部分”的包含关系,就可能产生嵌套。

为何常见:教材与教程偏爱用中文机构名举例,而英文公开数据集长期采用扁平标注,掩盖了嵌套现象,容易让人误以为英文没有嵌套。

误区嵌套实体就是外层包内层,那我训练前把内层实体单独抽出来、和句子一起拼成两遍数据,再把任务“打平”成普通 BIO 不就行了?

正解BIO 给每个 token 分配唯一标签,打平只能二选一:要么这一遍标外层、下一遍标内层。但同一句话里多个实体共享字符,被拆成多个副本后,模型无法感知“这些标签属于同一个位置的不同层次”,信息已经丢失。超图标注或跨度分类存在的意义,就是让多层标签在同一位置共存。

为何常见:BIO 流程在普通 NER 里过于深入人心,遇到嵌套时第一反应是“改造数据”而不是“改造标注范式”。

误区Biaffine 名字里带“仿射”,听起来就是把头向量和尾向量分别过一层线性层,再做点积或者拼起来算个相似度。

正解点积只有一次交互($\mathbf{h}_i \cdot \mathbf{h}_j$),拼接也只保留各自信息;Biaffine 的核心是 $\mathbf{h}_i^{\top} \mathbf{W}_c \mathbf{h}_j$ 这种带矩阵的二次型,头向量的每个分量都会与尾向量的每个分量交叉相乘。它比“点积 + 拼接”多了整整一阶的交互复杂度,这也是它能量化“头尾是否严丝合缝”的原因。

为何常见:很多人只记住了“用两个向量打分”的粗印象,忽略了中间那个矩阵 $\mathbf{W}_c$ 才是双线性交互的灵魂。

误区跨度方法要把所有可能的起止区间都列出来,那我把最大跨度设得很大、枚举得越全,模型看到的候选越多,效果自然更好。

正解跨度数量是 $O(n^2)$ 量级,其中超过九成是负样本。全量枚举会造成两类问题:训练时正负样本极度失衡,模型偏向“全部判负”;推理时每多一个跨度就多一次打分,长文本吞吐急剧恶化。限制最大跨度、设置边界概率阈值剪枝,是工程标配。

为何常见:在小数据集上暴力枚举“看起来没毛病”,但样本量和句子长度放大后,失衡与性能问题才会集中爆发。

面试题

Q1. 下列哪种情况属于典型的“嵌套实体”?

单选题 · easy

  • A.“北京”与“上海”两个城市名称并列出现
  • B.“北京”被包含在“北京中医药大学”内部← 正确答案
  • C.一段话中出现多个互不相邻的人名
  • D.同一个实体名称在文章里反复出现

答案:B。嵌套实体的核心是“实体内部还包含实体”。B 中“北京”的区间完整落在“北京中医药大学”区间内,构成套娃式包含;并列、分散、重复都不满足“一个包含另一个”的约束。

Q2. 传统 BIO 序列标注难以处理嵌套实体的根本原因是?

单选题 · easy

  • A.BIO 标签的总数量太少导致模型欠拟合
  • B.每个字在同一时刻只能被赋予一个标签← 正确答案
  • C.序列模型根本无法读取中文句子的顺序
  • D.嵌套实体在英文语料中几乎不出现

答案:B。BIO 给每个 token 打一个标签,而嵌套意味着同一个字既属于外层实体又属于内层实体,一个位置需要同时挂多个标签。问题出在“一位置一标签”的标注范式,与标签数量、语序或语言种类无关。

Q3. 下列哪些说法符合超图标注的思想?

多选题 · easy

  • A.只保留最外层实体并删除所有内部实体
  • B.允许同一个字符位置叠加多个实体标签← 正确答案
  • C.所有实体共用同一层解码器输出序列
  • D.用多层标签同时记录层层嵌套的实体← 正确答案

答案:BD。超图标注像叠戴识别环,同一个位置可以同时属于多个跨度,多层标签并存互不冲突。A 是典型的扁平思路;C 中的“同一层输出”无法表达多层并存,只有 B、D 符合超图的多标签特性。

Q4. 采用跨度边界方法识别嵌套实体时,第一步通常是?

单选题 · mid

  • A.训练一个用于实体分类的全连接网络
  • B.生成句子中所有候选跨度的起止区间← 正确答案
  • C.计算相邻两个实体之间的语义相似度
  • D.对整句话进行一次完整句法依存分析

答案:B。“先量轮廓、再鉴定”:第一步把句子所有可能的(起点,终点)区间列出来作为候选,之后才做边界概率预测与跨度分类。分类网络、相似度、依存分析都不是第一步要做的事。

Q5. 关于 Biaffine 打分器,下列说法正确的是?

单选题 · mid

  • A.只将头字向量与尾字向量做简单点积
  • B.用矩阵刻画头尾向量间的双线性交互← 正确答案
  • C.同一句话只能打出一个总体的分数
  • D.无法同时对多个候选跨度进行打分

答案:B。Biaffine 的核心是 $\mathbf{h}_i^{\top}\mathbf{W}_c\mathbf{h}_j$ 这种带矩阵的双线性项,比点积多一阶交叉交互。它对每个(头,尾)组合都能独立打分,天然适合多个跨度并行评估,C、D 明显错误。

Q6. 暴力枚举全部候选跨度时,跨度数量随句长 n 增长的量级是?

单选题 · mid

  • A.与句长 n 保持线性关系同步增长
  • B.与句子长度 n 的平方成正比增长← 正确答案
  • C.与句子长度 n 的立方成正比增长
  • D.与 2 的 n 次方成正比地爆炸增长

答案:B。所有起点 × 所有终点的组合约为 $n(n+1)/2$,即 $O(n^2)$ 量级。线性、立方、指数都不准确,这也是工程上必须限制最大跨度来削减候选数量的原因。

Q7. 在跨度分类训练中,“非实体”负样本通常处于什么状态?

单选题 · hard

  • A.数量极少,正样本占绝对主导地位
  • B.数量众多,远多于真正的正样本数← 正确答案
  • C.数量与正样本恰好保持一比一
  • D.因为无法统计所以在训练中忽略

答案:B。候选跨度里超过九成是空盒子,负样本远多于正样本。直接训练模型会偏向“全部判负”来降低损失,因此需要加权交叉熵、焦点损失或难例挖掘来平衡。

Q8. F1 分数衡量的是哪两个指标的综合表现?

单选题 · hard

  • A.模型参数量与单次推理耗时之比
  • B.精确率与召回率的调和平均值← 正确答案
  • C.训练集大小与验证集大小之比
  • D.实体类别数量与句子长度之比

答案:B。F1 是 Precision 与 Recall 的调和平均。漏判一层内层实体,召回率下降;误报一个空盒子,精确率下降。两个指标都重要,F1 取平衡,是嵌套 NER 评测的核心指标。

Q9. 下列哪些技术路线可以用来处理嵌套实体?

多选题 · mid

  • A.超图标注让多层实体标签互相叠加← 正确答案
  • B.片段分类逐个判断每个候选跨度← 正确答案
  • C.Biaffine 对头尾向量组合进行打分← 正确答案
  • D.传统 BIO 标签直接做到层层还原

答案:ABC。超图标注、片段分类、Biaffine 打分都能表达或识别重叠跨度;传统 BIO 每个位置只有一个标签,先天无法层层还原,所以 D 错误。

Q10. 关于嵌套 NER 的训练与部署优化,下列说法正确的有?

多选题 · hard

  • A.焦点损失可以缓解正负样本严重失衡← 正确答案
  • B.限制最大跨度能显著降低候选数量← 正确答案
  • C.难例挖掘引导模型关注模糊的候选← 正确答案
  • D.负样本越充足模型效果必然越好

答案:ABC。焦点损失给易分负样本降权、难例挖掘强化难样本、限长剪枝控制 $O(n^2)$ 候选规模,三者都是实用优化手段。负样本过多本身会加剧失衡,D 的说法不成立。