【NLP入门】一文读懂序列标注与CRF:从原理到公式的通俗解读
【NLP入门】一文读懂序列标注与CRF:从原理到公式的通俗解读
摘要:自然语言处理(NLP)中,如何让机器学会“断句”?CRF(条件随机场)为什么是序列标注的神器?本文将避开晦涩的数学推导,用通俗的语言带你理解序列标注的任务定义、CRF 的核心思想、打分公式以及维特比解码算法。
一、 什么是“序列标注”?
在 NLP 领域,序列标注(Sequence Labeling) 是最基础也是最重要的任务之一。最典型的应用场景就是 中文分词 和 命名实体识别(NER)。
1. 任务定义
想象一下,古人写字是没有标点符号的:“下雨天留客天留人不留”。机器读这句话时也是一样,它不知道哪里是一个词的开始,哪里是结束。
序列标注的任务,就是给句子里的每一个字打上一个标签,通过标签序列来告诉机器怎么切分。
2. BMES 标注法
最常用的标签集是 BMES:
- B (Begin):词语的开始。
- M (Middle):词语的中间。
- E (End):词语的结束。
- S (Single):单字成词。
3. 举个栗子
根据经典的序列标注案例:
- 输入:
昨天,小明... - 输出:
昨/B 天/E ,/S 小/B 明/E ...
只要机器能把标签标对(识别出 B 和 E 是一对),我们就能把“昨天”这个词切分出来。
二、 为什么要用 CRF(条件随机场)?
核心定义:
CRF 是一种判别式概率模型,主要用于对条件概率 P(y∣x)P(y|x)P(y∣x) 进行建模
- 输入 (xxx):称为观测序列(如一句话的文字序列)
- 输出 (yyy):称为状态序列或标签序列(如对应的 BMES 标签)
在 CRF 出现之前,我们有 HMM(隐马尔可夫模型)。但 HMM 有个大毛病:目光短浅。它遵循“独立输出假设”,即给当前字打标签时,只看当前字,不看上下文。
CRF 的出现解决了这个问题。它是一个“纵观全局”的模型:
3. 看上下文:它不仅看当前的字,还看周围的字。
4. 看规矩(关键):它重点观察标签与标签之间的依赖关系。
* 比如:标签 B(开始)后面绝不能直接跟 S(单字),这不合逻辑。CRF 能捕捉到这种约束。
三、 硬核部分:CRF 的核心公式与“打分机制”
很多人看到 CRF 的公式就头大,但其实它就是在做一个**“打分系统”**。
CRF 的工作逻辑是:给定一句话,它会评估所有可能的标签组合(路径),给它们打分。分数最高的那个组合,就是正确答案。
1. 总分公式
P(y∣x)=1Zexp(∑i,jλjtj(yi−1,yi,x,i)+∑i,kμksk(yi,x,i))P(y|x) = \frac{1}{Z} \exp \left( \sum_{i,j} \lambda_j t_j(y_{i-1}, y_i, x, i) + \sum_{i,k} \mu_k s_k(y_i, x, i) \right)P(y∣x)=Z1exp i,j∑λjtj(yi−1,yi,x,i)+i,k∑μksk(yi,x,i)
别被吓到了,我们把它拆解成三个部分来理解:
- ∑λt+∑μs\sum \lambda t + \sum \mu s∑λt+∑μs(核心得分项):
这是公式的灵魂。它把两种特征的分数加在一起,算出总分。- ttt (Transition Feature,转移特征):负责“看规矩”。衡量相邻标签之间的关系。
- sss (State Feature,状态特征):负责“看字”。衡量字和标签的对应关系。
- exp\expexp (指数函数):
把算出来的分数变成正数,并放大高分和低分的差距。 - 1Z\frac{1}{Z}Z1 (归一化):
ZZZ 是个分母,负责把最终的得分转换成 0~1 之间的概率值。
2. 特征函数详解
机器是怎么具体打分的?依靠以下两种“指示函数” I(⋅)I(\cdot)I(⋅):
| 特征类型 | 例子 | 含义解读 |
|---|---|---|
| 转移特征 (ttt) | I(yi−1=B,yi=E)I(y_{i-1}=B, y_i=E)I(yi−1=B,yi=E) | 看规矩:如果前一个标签是 B,当前是 E,符合双字词规范,加分! |
| 状态特征 (sss) | I(xi="天",yi=E)I(x_i="天", y_i=E)I(xi="天",yi=E) | 看习惯:如果当前字是“天”,并且标签是 E,符合“昨天/今天/蓝天”的习惯,加分! |
注意:这些特征对应的权重(λ\lambdaλ 和 μ\muμ)是在训练阶段通过学习大量已标注数据得到的。
四、 怎么预测?(维特比解码 Viterbi)
模型训练好了,权重也有了。现在来了一句新话:“老王上课”。
每个字都有 B/M/E/S 四种可能,组合起来有 44=2564^4 = 25644=256 种路径。如果句子有 100 个字,路径数量就是天文数字。我们不可能把所有路都走一遍。
这就需要 维特比算法(Viterbi Decoding)。
算法核心:步步为营,优胜劣汰
你可以把它想象成走迷宫,但我们在每一步都“剪枝”:
- 第一步:算出“老”字对应 B/M/E/S 的四个分数。
- 第二步(关键):走到“王”字时,我们计算通向“王(E)”的四条路,只保留分数最高的那一条,其他的直接扔掉!
- 循环:每走一步,都只保留到达当前节点的最优路径。
- 回溯:走到终点后,顺着留下的最优路径往回找,就得到了一条唯一的红线(全局最优解)。
如图所示,最终我们找到了最佳路径:B-E-B-E(老王/上课)。
—
五、 总结
- 序列标注:把分词问题变成了给每个字打标签(BMES)的问题。
- CRF 模型:比 HMM 强,因为它不仅看字,还看标签之间的逻辑关系(通过转移特征 ttt)。
- 核心公式:就是一个巨大的打分器,总分 = 状态特征得分 + 转移特征得分。
- 维特比算法:不走冤枉路,通过动态规划快速找到得分最高的标签序列。
希望这篇文章能帮你快速理解 CRF!如果你在做医疗问答系统或知识图谱构建,CRF 可是实体识别(NER)阶段必不可少的好帮手。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注三连!有任何疑惑和问题,请在评论区留言!
更多推荐



所有评论(0)