老王的快递分拣中心来了个新人小王。第一天上班,老王指着传送带说:“你看,包裹一件件流过来。你得在它们经过眼前的几秒里判断:这件是寄件人件、那件是目的地件、那边那件是公司件,剩下的都是普通包裹。”小王盯着流水线犯了难——包裹外形都差不多,到底怎么分?老王笑了:“这活儿,在咱们这行叫命名实体识别——从一大串文字里,精准找出人名、地名、组织名,并给它们贴上正确的标签。” 后来小王慢慢发现,光看单个包裹远远不够:“北京”在“我爱北京”里是地名,在“北京烤鸭店”里又是店名的一部分。老师傅教他:看一眼包裹,还要看它前后的邻居——这就是上下文;再翻一翻分拣手册:人名标签后面永远不可能紧跟一个地名内部标签——这就是标签约束。再后来,公司来了一位在总部干了十年的老员工“伯特”,他扫一眼运单就知道包裹大概是什么——这就是预训练模型。这篇文章,就跟着小王把这套“神经网络分拣系统”的前前后后完整学一遍:从BiLSTM-CRF到BERT-NER,从嵌套实体到细粒度识别。
对于AI从业者而言,NER是信息抽取的第一道闸门。掌握从经典到前沿的建模与实战技巧,意味着你为搜索、问答、知识图谱等上层应用打下了最扎实的底座——这是NLP工程师的核心竞争力之一。
目录
可视化演示
动态演示NER深度学习模型实战进阶的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
NER深度学习模型实战进阶:命名实体 命名实体识别NER概述 命名实体识别NER原理 核心机制可视化 NER深度学习模型实战进阶整体架构与关键组件
认识NER任务:包裹分拣台
老王是快递分拣中心的主管。这天,新人小王第一天上班,老王指着传送带说:“你看,包裹一件件过来了。你得在它们经过眼前的几秒里判断:这件是寄件人件、那件是目的地件、那几件是公司件,剩下的都是普通包裹。”小王盯着包裹犯了难——它们长得都差不多,怎么分得出来?老王笑了:“这活儿,我们这儿叫'命名实体识别'。”
把场景翻译成NLP:包裹是句子里的词,“寄件人件、目的地件”是实体类别,贴标签就是给每个词标注。比如“我爱北京”这句话,模型要输出“我/O、爱/O、北京/B-LOC”,其中O表示非实体,B-LOC表示地名实体的开始。命名实体识别(Named Entity Recognition,NER)的任务,就是从一段文本中找出人名、地名、组织名等实体,同时标出它们的边界和类别。
NER通常被建模为序列标注问题:输入一个词序列X,输出一个等长的标签序列Y。常用的标签体系是BIO(Begin, Inside, Outside):B标记实体的第一个词,I标记实体内部的词,O标记非实体。训练阶段,模型学习条件概率P(Y|X)——也就是在给定句子时,整条标签序列出现的概率。有了这个概率,预测时就能挑出最可能的标签序列。
所以,第一步不是急着上复杂模型,而是像分拣新人先背熟“包裹分类手册”一样,吃透任务定义、标注体系和评估方式。后面所有神经网络技巧——无论是双向扫描还是规则约束——都是在帮“贴标签”这个动作做得更快更准。
- 输入与输出X 代表整句话的词序列(包裹序列),Y 代表对应的标签序列(贴纸序列),n 是句子长度。有多少个包裹,就要有多少张贴纸。
- 上下文表示h_i 是第 i 个词经过编码器(如BiLSTM或BERT)后得到的向量,它不只看自己,还“听过”前后邻居的信息。
- 逐词概率P(y_i | h_i) 表示看到第 i 个词的表示后,模型认为它该贴标签 y_i 的概率。
- 联合概率把所有词的概率乘起来,得到整句话标签序列的联合概率。训练时最大化这个概率,预测时寻找令它最大的 Y。
BiLSTM编码层:左右张望的安检员
干了几天,小王发现光看单个包裹不靠谱。“北京”这个词,在“我爱北京”里是地名,但在“北京烤鸭店”里,它是店名的一部分。老王点拨他:“你看包裹时,得顺便看看它左边是什么,右边是什么。”于是分拣中心加装了两条扫描带:一条从左往右扫,一条从右往左扫。两条线的信息在小王脑中汇合,他看包裹的“视野”一下子开阔了。
LSTM(长短期记忆网络)就是一条能“记住重点”的扫描带。它通过输入门、遗忘门、输出门三个门控,决定保留哪些历史信息、丢弃哪些信息,从而缓解普通循环网络的长距离遗忘问题。在NER里,我们通常用两层LSTM:一层前向LSTM从左到右读句子,一层后向LSTM从右到左读句子,合起来就是BiLSTM(双向LSTM)。
BiLSTM把两个方向在位置 i 的隐藏状态拼接起来,得到词 i 的上下文表示 h_i。这个向量既包含左边所有词的信息,也包含右边所有词的信息。对实体识别来说,上下文是决定性线索:看到“市长 张三”时,“张三”更像人名;看到“飞往 北京”时,“北京”更像地名。
两条扫描带的效果立竿见影。小王再也不会因为“北京”单独出现就乱贴标签了。对他而言,每条扫描带是一条记忆线,两条线相交的位置,就是判断包裹身份的最佳视角——这,就是BiLSTM的直觉。
- 前向隐藏状态\overrightarrow{h}_i 表示从左向右扫描到第 i 个词时,模型记住的“从左边的历史”——它知道第 i 个词之前出现过什么。
- 后向隐藏状态\overleftarrow{h}_i 表示从右向左扫描到第 i 个词时,模型记住的“从右边的将来”——它知道第 i 个词之后会出现什么。
- 向量拼接用分号把两个方向的特征向量首尾相连,得到一个新的、维度翻倍的向量。
- 单向与双向差异单向LSTM得到的 \overrightarrow{h}_i 只关心左侧信息,拼接后 h_i 同时携带左右两侧信息,因此叫“双向上下文”。
CRF解码层:分拣规则手册
扫描带解决了一半问题,但小王还是偶尔贴出离谱的标签:前一个包裹贴了“人名内部I-PER”,后一个包裹却贴着“地名内部I-LOC”——就像同一句话里,一个人名还没结束,就突然蹦出一个地名尾巴。老王拿出《分拣规则手册》:“标签之间的顺序是有规矩的,不能乱来。”
BiLSTM的输出是每个词属于每个标签的“发射分数”,它单独看每个词,却不保证整条标签序列合法。CRF(条件随机场)层补上这一环:它引入一个可学习的转移矩阵A,其中 A_{i,j} 表示从标签 i 转移到标签 j 的分数。合法的转移(如B-PER→I-PER)分数高,非法的转移(如I-PER→I-LOC)经过训练自动学出低分。
解码时,CRF不在每个位置单独取最大概率标签,而是在整条序列上找总分数最高的路径,这个搜索由维特比算法完成。维特比用动态规划逐步递推,把指数级的序列搜索压缩到多项式时间,既保证全局最优,又足够高效。
《分拣规则手册》上线后,荒唐的组合消失了。转移矩阵相当于把“标签顺序经验”编码成一张可学习的查表,维特比则是翻表求最优路径的老助手。小王的标签序列,终于像模像样。
- 转移矩阵A_{i,j} 是CRF层要学习的参数,表示标签 i 后面紧跟标签 j 的“顺眼程度”。人名开头后面跟人名内部分数高,跟地名内部分数低。
- 发射分数B_j(x_t) 来自BiLSTM的输出,表示第 t 个词 x_t 被贴上标签 j 的当前得分。
- 递推关系到达位置 t 标签 j 的最优分数,等于前一步所有标签 i 的最优分数加上转移分数,取最大,再加当前的发射分数。
- 全局最优从 t=1 一直递推到句尾,最后回溯每一步选择的 i,就得到整条序列上分数最高的标签路径,保证“全局最优”而不只是“每步贪心”。
BiLSTM-CRF实战:组装分拣流水线
把双向扫描带和规则手册装进同一条流水线,就是经典的BiLSTM-CRF模型。这个2015年前后成为序列标注主流的架构,至今仍是许多生产系统的基线——不花哨,但扎实耐用。
模型分三层:第一层是词嵌入,把每个词变成稠密向量;第二层是BiLSTM,输出每个词的上下文表示;第三层是线性分类器,把表示映射成发射分数;最后接CRF完成全局解码。训练时,损失函数是整条序列的负对数似然:它要求正确标签序列的分数尽量高,同时让所有错误序列的分数总和尽量低。
工程细节不容忽视:词向量通常用Word2Vec或GloVe预训练;训练要配合学习率衰减、梯度裁剪和早停;数据标注质量直接决定上限。推理阶段则简单许多——加载模型,把句子喂进去,维特比吐出一串标签。
流水线完整了:条形码扫描(词嵌入)、双向扫描带(BiLSTM)、规则手册(CRF)、培训考卷(损失函数)。小王从只懂看单件包裹,升级成能指挥一整条分拣流水线的合格工人。
- 路径分数score(X, Y) 是句子 X 沿着标签序列 Y 走完整条路径时,所有发射分数与转移分数之和。
- 分子\exp(\mathrm{score}) 把路径总分映射成正数,分数越高权重越大。
- 配分函数分母对一切可能的标签序列 Y' 求指数和,用于把路径分数归一化成概率。序列总数随长度指数增长,所以用前向算法动态规划高效计算。
- 负对数取负对号后,最小化损失等价于最大化正确序列的概率。训练时对每个样本求这个损失的梯度来更新参数。
BERT-NER微调:十年经验老师傅
分拣中心迎来一位老员工——伯特。他在总部仓库干了十年,见过成千上万种运单,眼神一瞄就能猜出包裹类型。老王让他带小王:“你俩配合,伯特负责看,小王负责贴。”这就是预训练模型的理念:模型已经在大规模文本上学过语言知识,下游任务只需微调即可上岗。
BERT(Bidirectional Encoder Representations from Transformers)用Transformer做双向编码,训练时用WordPiece把词拆成子词。比如“北京”通常是一个词,但遇到“北京大学”,BERT会切成“北京”和“大学”两个子词。做NER时,取每个子词对应的最后一层隐藏状态(或后几层加权融合)作为特征。
这些token级向量经过一个线性加softmax的分类器,就得到每个位置的标签概率。相比BiLSTM-CRF,BERT-NER在多个基准上能提升数个点F1,尤其擅长细粒度和低资源类型。代价是显存和推理速度。业界常让两种路线并存:速度敏感场景用BiLSTM-CRF,精度敏感场景用BERT-NER,也可以BERT编码后再接CRF。
老员工“伯特”的上岗让分拣中心质变:他的语言先验相当于十年经验,你的少量标注数据只是“新式运单样例”。这就是预训练+微调的范式——用一个强大的基础模型,加一点场景数据,快速完成迁移。
- BERT表示h_i 是第 i 个词(或子词)经过BERT编码器得到的上下文向量,带上了整个句子的双向语义。
- 线性变换W 和 b 是分类层可学习的参数,把高维的BERT向量映射到“标签类别数”维度的分数向量。
- softmax归一化对分数向量做softmax,得到每个标签的概率,所有标签概率相加为1。
- 取最大概率取概率最大的标签作为该词的预测,完成单步分类;整句话每个词各取一个,形成标签序列。
嵌套实体处理:套娃包裹难题
分拣中心来了个难缠的包裹:“北京大学”是一个组织件,可打开一看,里面还套着“北京”这个地名件——套娃包裹!原来的扁平标签系统只能贴一张标签,遇到这种嵌套就抓瞎。小王挠头:“难道只能拆了外面、扔了里面?”
当然不行。处理嵌套实体主要有三条技术路线。一是层级标注:为不同层级分别建标注层,外层标组织,内层标地名。二是序列生成:把NER变成序列到序列任务,像翻译一样逐个“说出”所有实体,天然支持任意嵌套。三是多头选择:预测每个实体头对应的实体尾和类型,允许一个token同时参与多个实体。
三条路线各有取舍:层级标注实现直观但深度受限于预设;序列生成灵活度高但要处理解码顺序和重复输出;多头选择在实体长度和重叠结构上需要精细调参。工程上,小规模嵌套用层级标注够用,大规模开放场景推荐序列生成或多头选择。下面的公式对应序列生成方案:
套娃包裹的启示是:信息藏在细节里,内层实体往往比外层实体更有业务价值。把“一件一签”升级成“一件多签”,分拣系统才算真正经历过实战考验。
- 自回归生成把NER从“一次性给所有词贴标签”改成“像写句子一样逐个生成标签”,t 从 1 走到 T。
- 历史标签y_{<t} 表示已经生成的前 t-1 个标签,模型每步都能看到自己刚才生成了什么。
- 条件概率每一步根据原文 X 和已生成的历史标签,决定下一个标签是什么。
- 链式相乘所有步骤的概率乘起来得到整条标签序列的概率,训练时最大化它。生成时可以自由地先产出外层再产出内层,所以支持任意嵌套深度。
细粒度实体识别:把标签贴得更细
入门级NER只分“人名、地名、组织名”,就像分拣中心只分人件、地件、公司件。但真实业务要求更细:体育网站要区分“球员”与“教练”,电商客服要识别“品牌”与“型号”。这就是细粒度NER——把标签体系从几个粗类扩展成几十上百个细类。
细粒度系统天然面临三个问题:类型多、样本少、边界模糊。常用的解法是构建层次化类型体系(人物→运动员→篮球运动员),让模型先学粗粒度再学细粒度;类别不均衡则用类别加权损失或Focal Loss;样本不足靠远程监督、半监督和文本数据增强来补充。
评估细粒度NER时,通常要求实体边界和类型都判对才算一个真阳性。F1值——精确率与召回率的调和平均——是业界最常看的主指标。精确率回答“贴的标签有多少是对的”,召回率回答“真正的实体有多少被找回来了”,两者兼顾才是好模型。
精细分拣是分拣中心的高级形态:同样是“人件”,进一步分成球员件、教练件、裁判件。类型越细,下游的搜索、推荐、知识图谱越能物尽其用。到这里,小王从新手到能带队伍的进阶之路,完整闭环。
- 四类计数TP是模型预测为正且实际也为正的实体数,FP是预测为正但实际为负的实体数,FN是实际为正但没被找出来的实体数。
- 精确率P = TP/(TP+FP),衡量预测出来的实体里有多少是真正正确的——“贴的标签有多少贴对了”。
- 召回率R = TP/(TP+FN),衡量真实存在的实体里有多少被找回来了——“真正的包裹有多少没漏掉”。
- 调和平均F1 = 2PR/(P+R),当P和R都高时F1才高。细粒度NER还要求类型层级判断正确,难度进一步提升。
AI 应用场景
金融新闻实体抽取
阶段:信息抽取 / 知识图谱构建
解决的问题:金融研报和公告每天产生海量文本,人工抽取公司名、高管名、金额需要大量时间,且容易漏抽、错抽。用BERT-NER自动识别文本中的金融实体,速度快、召回高,还能把结果直接回填到结构化事件库中。
具体案例:某券商用BERT-NER识别上市公司公告里的“公司名/高管名/金额”三类实体,再配合规则抽取时间戳,将每份公告自动拆成“某日、某公司、某人、涉及金额多少”的事件记录,供投研人员检索。
医疗文本嵌套实体识别
阶段:医疗数据结构化
解决的问题:电子病历里“左肺上叶鳞癌”同时包含解剖部位、病理类型等多个嵌套实体,扁平标注会丢失关键信息。采用层级标注或多头选择方案,可以同时保留外层病灶描述和内层具体部位。
具体案例:某三甲医院信息科用层级BIO标注训练嵌套NER模型,将CT报告中的病灶位置、大小、形态逐层抽取成结构化字段,辅助医生快速浏览历史影像结论。
电商客服细粒度识别
阶段:对话理解 / 商品检索
解决的问题:用户咨询“iPhone 15 Pro 256G 多少钱”,需要识别品牌、型号、容量等细粒度实体,才能匹配商品库。传统关键词匹配无法区分“15 Pro“和”15”,细粒度NER能把口语化咨询转成结构化查询条件。
具体案例:某电商智能客服使用细粒度NER,标签体系包括“品牌/型号/容量/颜色/价格”,从用户一句话中抽取出商品属性三元组,直接对接数据库检索并返回结果。
Python 演示
"""极简 BiLSTM-CRF:用 4 个玩具句子演示 NER 训练与维特比解码"""import torchimport torch.nn as nnimport torch.optim as optim # ---------- 1. 玩具数据集(人名 / 地名) ----------SENTS = [["我", "爱", "北京"], ["张三", "去", "上海"], ["北京", "是", "首都"], ["李四", "在", "北京"]]TAGS = [["O", "O", "B-LOC"], ["B-PER", "O", "B-LOC"], ["B-LOC", "O", "O"], ["B-PER", "O", "B-LOC"]] WORD2ID = {"<pad>": 0, "我": 1, "爱": 2, "北京": 3, "张三": 4, "去": 5, "上海": 6, "是": 7, "首都": 8, "李四": 9, "在": 10}TAG2ID = {"O": 0, "B-PER": 1, "I-PER": 2, "B-LOC": 3, "I-LOC": 4}ID2TAG = {i: t for t, i in TAG2ID.items()} Xs = [torch.tensor([WORD2ID[w] for w in s]) for s in SENTS]Ys = [torch.tensor([TAG2ID[t] for t in y]) for y in TAGS] # ---------- 2. BiLSTM + CRF 模型 ----------class TinyBiLSTMCRF(nn.Module): def __init__(self, vocab_size, tag_size, hidden=32): super().__init__() self.emb = nn.Embedding(vocab_size, 16, padding_idx=0) self.lstm = nn.LSTM(16, hidden, batch_first=True, bidirectional=True) self.fc = nn.Linear(hidden * 2, tag_size) self.trans = nn.Parameter(torch.randn(tag_size, tag_size)) # 转移矩阵 A def _emit(self, x): """BiLSTM 编码 + 线性层,输出发射分数 [L, T]""" h, _ = self.lstm(self.emb(x).unsqueeze(0)) return self.fc(h.squeeze(0)) def _logZ(self, emit): """CRF 前向算法:动态规划求对数配分函数""" dp = emit[0] for t in range(1, emit.size(0)): dp = torch.logsumexp( dp.unsqueeze(1) + self.trans + emit[t].unsqueeze(0), dim=0) return torch.logsumexp(dp, dim=0) def compute_loss(self, x, y): """整条序列的负对数似然损失""" emit = self._emit(x) real = emit[0, y[0]] + self.trans[0, y[0]] for t in range(1, x.size(0)): real = real + emit[t, y[t]] + self.trans[y[t - 1], y[t]] return self._logZ(emit) - real def decode(self, x): """维特比解码:回溯得到最优标签序列""" emit = self._emit(x) L, T = emit.size() dp, back = emit[0].clone(), [] for t in range(1, L): scores = dp.unsqueeze(1) + self.trans + emit[t].unsqueeze(0) back.append(scores.argmax(dim=0)) dp = scores.max(dim=0).values best = [dp.argmax().item()] for b in reversed(back): best.append(b[best[-1]].item()) return [ID2TAG[i] for i in best[::-1]] # ---------- 3. 训练 ----------model = TinyBiLSTMCRF(len(WORD2ID), len(TAG2ID))opt = optim.Adam(model.parameters(), lr=0.02)for epoch in range(60): total_loss = 0.0 for x, y in zip(Xs, Ys): opt.zero_grad() loss = model.compute_loss(x, y) loss.backward() opt.step() total_loss += loss.item() if epoch % 20 == 0: print(f"epoch {epoch:2d} loss {total_loss / len(Xs):.3f}") # ---------- 4. 预测演示 ----------for s, x in zip(SENTS, Xs): pred = model.decode(x) print(" ".join(s), "->", " ".join(pred))
self.trans = nn.Parameter(torch.randn(tag_size, tag_size))定义CRF的转移矩阵,这是“分拣规则手册”h, _ = self.lstm(self.emb(x).unsqueeze(0))词嵌入后经过双向LSTM,得到每个词的上下文表示dp = torch.logsumexp(dp.unsqueeze(1) + self.trans + emit[t].unsqueeze(0), dim=0)CRF前向算法,动态规划求配分函数real = real + emit[t, y[t]] + self.trans[y[t - 1], y[t]]计算真实标注路径的总分数return self._logZ(emit) - real负对数似然损失,最小化它等于最大化正确路径概率scores = dp.unsqueeze(1) + self.trans + emit[t].unsqueeze(0)维特比递推,对每个当前标签计算所有前驱的总分back.append(scores.argmax(dim=0))记录每个当前标签的最优前驱,供之后回溯best.append(b[best[-1]].item())从末尾向前回溯,一步步还原整条最优标签序列
常见误区
误区BiLSTM已经能建模上下文了,CRF不就是加一个全局约束吗?去掉它模型更简单,跑得还快,效果差别应该不大。
正解CRF的转移矩阵显式保证了标签序列的合法性。没有CRF,模型可能输出“B-LOC后面跟着I-PER”这种非法序列,就像分拣流水线上前一个包裹贴了“人名件”,后一个却按“地名内部件”处理。在实体边界严格的任务上,去掉CRF会导致F1显著下降,尤其对长实体和相邻实体。
为何常见:人的直觉是BiLSTM输出已经是概率分布,看起来“应该够用了”;但局部归一化与全局最优是两个概念,单个位置概率最大并不能保证整条序列合法。
误区BERT的[CLS]向量不是号称包含整个句子的语义吗?那拿它来做句子里每个词的分类应该最合适。
正解[CLS]是句子级的汇聚表示,适合情感分类、句子对匹配这类任务;但NER要求每个词一个标签,必须取每个token对应的hidden state。用[CLS]做NER等于只看整条传送带而不看单个包裹,边界信息全部丢失。
为何常见:[CLS]在众多句子级任务中是标配,容易让人误以为它是“万能向量”,忽略了token级任务与句子级任务的本质差异。
误区出现“北京大学”和“北京”这种嵌套,把内层实体忽略掉,只标最长的实体不就行了?反正外层括住了内层。
正解应用中内层实体往往同样重要——“北京大学”里的“北京”是地名信息,“左肺上叶”里的“肺”是器官信息。压平标注会永久丢失这些信息。需要采用层级标注、序列生成或多头选择等方案才能同时保留内外层实体。
为何常见:大多数人第一次接触BIO标注都是扁平标注,遇到嵌套时习惯性想用“取最长”的启发式,没有意识到信息丢失的代价。
误区BERT这么强,给我几百条标注数据,多跑几个epoch不就收敛了吗?反正它“啥都见过”。
正解BERT参数量以亿计,数据太少会严重过拟合——模型把训练集背下来,测试集上泛化很差。实践上应采用预训练+微调的迁移学习范式,配合数据增强、早停、分层学习率(BERT层用小学习率,分类层用大学习率)。老师傅虽然经验丰富,也需要几条真实的“新式运单”样例才能学会新规则。
为何常见:预训练模型的“强”容易让人误以为不再需要数据,忽略了少量标注数据下的过拟合风险。
面试题
Q1. BIO标注体系中“B“和”I”分别代表什么?
- A.实体开始和实体内部← 正确答案
- B.正向记忆和反向记忆
- C.句子开头和句子结尾
- D.嵌套外层和内层实体
答案:A。B代表Begin(实体开始),I代表Inside(实体内部),是BIO序列标注体系的基石。B和I是标签,不是LSTM方向,也不是句子边界概念,更与嵌套内外层无关。
Q2. NER任务的核心目标是什么?
- A.标注实体的边界和类别← 正确答案
- B.将句子翻译成另一种语言
- C.生成句子的人工摘要
- D.判断文档整体情感极性
答案:A。命名实体识别要从文本中找出实体并标注边界和类别,就像分拣员判断包裹种类并贴标签。翻译、摘要、情感分析都属于其他NLP任务。
Q3. BiLSTM相比单向LSTM的主要优势是什么?
- A.同时利用前后双向上下文← 正确答案
- B.模型结构更简单易实现
- C.完全不需要任何词嵌入
- D.参数量大幅减少一半
答案:A。BiLSTM由前向和后向两个LSTM组成,拼接后的向量同时包含左右两侧信息。它比单向LSTM结构更复杂、参数更多,而且仍然需要词嵌入输入。
Q4. CRF层相比逐词Softmax的关键区别是什么?
- A.显式建模标签间转移约束← 正确答案
- B.不再需要任何输入特征
- C.推理速度大幅提高一倍
- D.只能处理二分类的任务
答案:A。CRF通过转移矩阵显式建模相邻标签的依赖关系,保证整条标签序列合法。它仍然需要输入特征,推理速度通常更慢,且天然支持多分类,而非只做二分类。
Q5. 输入一个句子做NER预测时,维特比解码需要哪些信息?
- A.每个位置的发射概率分数← 正确答案
- B.标签间的转移概率矩阵← 正确答案
- C.每个词的拼音特征信息
- D.句子的依存句法树结构
答案:AB。维特比解码需要两类分数:发射分数(每位置各标签得分)和转移分数(标签间转移矩阵),两者相加递推找最优路径。拼音和句法树既不是必需输入,也不在传统CRF解码的公式里。
Q6. 下列哪些属于NER中常见的实体类型?
- A.人名、地名和组织名← 正确答案
- B.时间、日期和具体数值← 正确答案
- C.商品名称与品牌名称← 正确答案
- D.形容词、副词等词性
答案:ABC。人名、地名、组织名是NER三大经典类型,时间、日期、数值属于常见扩展类型,商品名和品牌名在电商场景中也被当作实体。词性是语法属性,不是命名实体。
Q7. BERT做NER时通常使用哪个向量做分类?
- A.各token对应位置的隐层向量← 正确答案
- B.仅取整个句子的CLS向量
- C.所有词向量加和平均
- D.随机初始化并固定的向量
答案:A。NER是token级任务,需要每个词或子词的表示来预测标签;[CLS]是句子级表示,适合句子分类。逐词加和平均也会抹掉边界信息,而随机固定向量完全没有语义。
Q8. 处理嵌套实体通常采用哪些方案?
- A.层级式标注分别识别内外层← 正确答案
- B.用序列生成模型自回归解码← 正确答案
- C.多头选择机制同时标记实体← 正确答案
- D.只保留最长实体丢弃内部实体
答案:ABC。层级标注、序列生成、多头选择是处理嵌套实体的三条主流路线。只保留最长实体会丢失内层信息,等于拆了套娃扔了最里面的小包裹,不可取。
Q9. BiLSTM-CRF训练时采用的损失函数是?
- A.整条序列的负对数似然← 正确答案
- B.词向量间的均方误差
- C.逐位置交叉熵取平均
- D.模型参数的L2正则化
答案:A。CRF的损失是整条序列的负对数似然,需要对所有可能标签序列归一化。逐位置交叉熵忽略标签依赖,无法替代CRF的全局约束;均方误差和L2正则化都不是序列标注的训练目标。
Q10. 维特比算法在最坏情况下的时间复杂度是(n为序列长度,T为标签数)?
- A.O(n×T²) 随标签数平方增长← 正确答案
- B.O(n×T) 随序列长度线性增长
- C.O(T²) 与序列长度完全无关
- D.O(n²×T) 与序列长度平方相关
答案:A。每个位置要枚举T个当前标签与T个前驱标签的组合,共n个位置,所以复杂度为O(n×T²)。它比穷举所有T的n次方条路径高效得多,这也是维特比能实用的原因。