【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(yx) 进行建模

  • 输入 (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(yx)=Z1exp i,jλjtj(yi1,yi,x,i)+i,kμksk(yi,x,i)

别被吓到了,我们把它拆解成三个部分来理解:

  1. ∑λt+∑μs\sum \lambda t + \sum \mu sλt+μs(核心得分项)
    这是公式的灵魂。它把两种特征的分数加在一起,算出总分。
    • ttt (Transition Feature,转移特征):负责“看规矩”。衡量相邻标签之间的关系。
    • sss (State Feature,状态特征):负责“看字”。衡量字和标签的对应关系。
  2. exp⁡\expexp (指数函数)
    把算出来的分数变成正数,并放大高分和低分的差距。
  3. 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(yi1=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)

算法核心:步步为营,优胜劣汰

你可以把它想象成走迷宫,但我们在每一步都“剪枝”:

  1. 第一步:算出“老”字对应 B/M/E/S 的四个分数。
  2. 第二步(关键):走到“王”字时,我们计算通向“王(E)”的四条路,只保留分数最高的那一条,其他的直接扔掉!
  3. 循环:每走一步,都只保留到达当前节点的最优路径。
  4. 回溯:走到终点后,顺着留下的最优路径往回找,就得到了一条唯一的红线(全局最优解)。

如图所示,最终我们找到了最佳路径:B-E-B-E(老王/上课)。

在这里插入图片描述

五、 总结

  1. 序列标注:把分词问题变成了给每个字打标签(BMES)的问题。
  2. CRF 模型:比 HMM 强,因为它不仅看字,还看标签之间的逻辑关系(通过转移特征 ttt)。
  3. 核心公式:就是一个巨大的打分器,总分 = 状态特征得分 + 转移特征得分。
  4. 维特比算法:不走冤枉路,通过动态规划快速找到得分最高的标签序列。

希望这篇文章能帮你快速理解 CRF!如果你在做医疗问答系统或知识图谱构建,CRF 可是实体识别(NER)阶段必不可少的好帮手。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注三连!有任何疑惑和问题,请在评论区留言!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐