NOAI 2025 复赛第1题 | 逐字判断:序列标注是怎么回事

NOAI 2025 复赛第1题 | 逐字判断:序列标注是怎么回事

本文核心观点
NOAI 2025 复赛第 1 题知识拆解:用德语组合词分割,讲清序列标注问题、BiLSTM 的双向理解能力、字符级建模思路。

NOAI 2025 复赛第1题 | 逐字判断:序列标注是怎么回事

序列标注 BiLSTM

用NOAI复赛真题,构建孩子的AI知识图谱

每个知识点后续都会单独展开讲解,欢迎先关注收藏

这道题在做什么

德语有大量组合词——把几个短词拼成一个长词。比如Fussball = Fuss(脚)+ Ball(球)。给你9万多个这样的组合词,你要训练一个模型,判断每个字符是不是某个短词的结尾,从而把组合词拆开。

约束:GPU训练+测试总时间不超过10分钟。

知识全景

这道题和2024年第3题(新闻文本分类)都属于NLP,但任务类型完全不同。2024年第3题是"给整个句子一个标签"(文本分类),这道题是"给每个字符一个标签"(序列标注)。

阶段 知识点
认识任务 ① 序列标注
文字编码 ② 字符级编码
模型设计 ③ 双向LSTM   ④ 一维卷积(1D CNN)
处理数据 ⑤ 序列填充与截断   ⑥ 类别不均衡
评估方式 ⑦ 精确匹配与F1

① 序列标注

第3题是文本分类:读完一整段文字,输出一个标签。模型只需要在最后给出一个判断。

这道题是序列标注:对序列中的每个位置,都要输出一个标签。模型需要在每个字符上都做一个判断。

序列标注在NLP中非常常见:

中文分词:判断每个字符是词的开头、中间还是结尾

命名实体识别:判断每个词是不是人名、地名、机构名的一部分

词性标注:判断每个词是名词、动词还是形容词

区别于分类任务,序列标注的关键挑战是:每个位置的标签不是独立的,它受上下文影响。一个字符是不是分割点,取决于它前面和后面的字符是什么。

② 字符级编码

2024年第3题把文本按"词"来处理(word-level),这道题按"字符"来处理(character-level)。

字符级编码的好处:

词表极小。德语字母只有几十个(a-z加上ä、ö、ü、ß等),而词表可能有几万个。小词表意味着Embedding层参数少、训练快。

没有未知词问题。word-level编码中,测试集可能出现训练集没见过的词(OOV问题)。字符级编码不存在这个问题——字母表是固定的。

能捕捉拼写模式。"ung""heit""keit"是德语常见的词尾后缀,字符级模型能直接学到这些模式。

字符级编码的劣势是序列更长(一个词变成了好多个字符),但德语组合词通常不超过30个字符,所以这里不是问题。

③ 双向LSTM

2024年第3题用LSTM处理序列,最后只取最终隐藏状态做分类。这道题也用LSTM,但需要取每个位置的隐藏状态做标注。

更重要的是,这道题几乎必须用双向LSTM(BiLSTM)

为什么?判断一个字符是不是分割点,需要同时看它"前面的字符"和"后面的字符"。比如字母"h",如果前面是"c"后面是"b"(Sprach|bereich),那它是分割点;如果前面是"s"后面是"a"(share),它不是。

单向LSTM只能从前往后读,看到"h"时不知道后面是什么。双向LSTM同时从两个方向读,每个位置都有完整的上下文信息。

BiLSTM的输出维度是单向的两倍(前向隐藏状态 + 后向隐藏状态拼接),后面的线性层维度要相应调整。

④ 一维卷积(1D CNN)

第2题介绍了二维卷积(2D CNN),用于图像——卷积核在图片的宽和高两个方向上滑动。

这道题中也可以用一维卷积(1D CNN)——卷积核只在序列方向上滑动,每次覆盖若干个连续字符。

比如一个kernel_size=3的一维卷积核,每次看3个相邻字符。如果它学会了"ung"这个模式,那每当这3个字符连续出现,它就会输出一个高响应。

一维卷积的优势:

擅长捕捉局部模式。"ung""heit"这些固定长度的后缀,正是卷积核最擅长的

训练速度快。CNN的并行度比LSTM高,在GPU和CPU上都更快

可以叠加不同尺寸。kernel_size=3看3字符模式,kernel_size=5看5字符模式,多个尺寸并用可以覆盖不同长度的词缀

一种有效的策略是:先用一维卷积提取局部模式,再用BiLSTM捕捉全局上下文——两者互补。

⑤ 序列填充与截断

batch训练要求每个样本长度相同,但不同的词长度不同。解决办法和2024年第3题一样:填充(Padding)截断(Truncation)

设定一个最大长度max_len,比如40个字符。长度不足的词用<PAD>补到40,超过的截断到40。

但序列标注有一个细节:标签数组也要做同样的填充。填充位置的标签通常设为0,但在计算损失时需要忽略填充位置,否则模型会被大量的"填充=0"标签误导。

PyTorch的nn.BCEWithLogitsLoss可以通过mask参数来忽略特定位置,或者用pack_padded_sequence让LSTM跳过填充部分。

⑥ 类别不均衡

在一个组合词中,大部分字符的标签是0(不是分割点),只有少数几个是1(分割点)。比如一个20字符的词可能只有2个分割点,0和1的比例是9:1

如果模型学会了"全部预测0",它的准确率能到90%——但对这道题毫无用处,因为一个分割点都没找到。

应对类别不均衡的方法:

加权损失:给标签1更高的权重,让模型在漏掉1时受到更大的惩罚

过采样:复制含有更多分割点的样本

评价指标选择:用F1而非Accuracy来评估(这道题的评分正是F1)

类别不均衡是机器学习中的常见问题。几乎所有涉及"检测异常""识别少数类"的任务都会遇到,比如欺诈检测、疾病诊断、缺陷检测。

⑦ 精确匹配与F1

这道题的F1计算方式有一个重要细节:按分词(segment)而不是按字符来算

假设真实分割是"Sprach|bereich",你预测成"Sprac|hbereich"。虽然只有一个字符的差异,但两个分词都不对——"Sprac"和"Sprach"不匹配,"hbereich"和"bereich"也不匹配。Precision和Recall都是0。

这叫精确匹配:预测的分词起止位置必须和真实完全一致才算正确。

精确匹配比逐字符评估严格得多。它要求模型不仅要"大致对",还要"完全对"。这对模型在分割点附近的精度提出了很高的要求。

这道题展示了NLP中"逐位置预测"的任务类型。序列标注的核心思想是:每个位置的决策不是孤立的,它需要结合上下文信息——而BiLSTM和一维卷积就是获取上下文的两种互补方式。

微信二维码

扫码备注【NOAI】加交流群