用一盘宫保鸡丁理解CRFBIO标注中的发射与转移分数实战想象你正在教一个完全不懂烹饪的朋友做宫保鸡丁。你不会一上来就讲火候控制中的热力学传导原理而是会说油温六成热下鸡肉看到表面变白就捞出来。同样地理解条件随机场CRF最有效的方式不是从马尔可夫性开始而是拿起一个真实的BIO标注案例看看每个字的标签是怎么被打分和选择的。1. 从BIO标注看CRF的思维方式在命名实体识别任务中B-实体开头/I-实体内部/O-非实体的标注方式就像给每个字贴标签。以北京烤鸭为例理想的标注序列是B I I。但CRF不会直接输出这个结果而是会计算每个字作为B/I/O的发射分数就像评估鸡肉块适合炸还是炒考虑标签之间的转移分数就像知道腌之后应该接炸而不是直接蒸找出全局分数最高的标签组合就像设计最优烹饪流程关键区别与HMM等模型不同CRF会同时考虑所有可能的标签序列而不是贪心地选择每一步最优。就像好厨师不会单独优化每道工序而是追求整个烹饪流程的协调性。2. 发射分数当前字的标签偏好发射分数衡量的是当前输入字对应某个标签的合理性。假设我们有个微型标注任务——识别句子中的菜品名# 示例文本宫保鸡丁怎么做 # 可能的标签B(菜品开头) I(菜品延续) O(其他) # 发射分数示意数值越大越可能 发射分数 { 宫: {B: 8.2, I: 1.1, O: 0.7}, # 明显倾向B 保: {B: 0.3, I: 7.9, O: 1.8}, # 前字是B时倾向I 怎: {B: 0.1, I: 0.2, O: 9.7} # 明显非菜品 }这些分数通常由神经网络生成就像厨师凭经验知道鸡胸肉适合炸鸡腿更适合炖。在实际CRF实现中你会看到这样的代码逻辑def get_emission_scores(word): # 实际中这里会调用神经网络模型 if word in dish_name_words: return {B: high_score, I: medium_score, O: low_score} else: return {B: 0.1, I: 0.1, O: 0.8}3. 转移分数标签间的语法规则转移分数决定了标签之间的转换可能性就像烹饪中腌制→油炸合理但油炸→腌制就很奇怪。在BIO标注中前一个标签 \ 当前标签BIOB-∞8.23.1I1.27.54.0O6.3-∞9.0注-∞表示禁止转移如O后面不能直接跟I这个转移矩阵告诉我们B后面接I很合理8.2分但接另一个B不可能-∞O后面接O很常见9.0分但接I不合法-∞I后面可以接I7.5分表示实体继续实际应用中转移矩阵会被初始化为可学习参数但会通过约束保证非法转移的分数极低4. 综合计算找到最优标签序列现在我们把发射分数和转移分数结合起来计算整个序列的得分。以宫保鸡丁为例计算单路径分数假设标注序列为B I I I分数 trans(Start→B) emit(B|宫) trans(B→I) emit(I|保) trans(I→I) emit(I|鸡) trans(I→I) emit(I|丁)考虑所有可能路径对于4个字有3^481种可能的BIO组合实际会更少因为有些转移非法选择最优路径使用维特比算法高效地找出分数最高的路径就像厨师会规划最省时的烹饪顺序# 简化的维特比算法伪代码 def viterbi(words, emission_scores, transition_scores): # 初始化 dp [{B: score1, I: score2, O: score3}, ...] # 递推计算 for i in range(1, len(words)): for current_tag in [B, I, O]: max_score -inf for prev_tag in [B, I, O]: score dp[i-1][prev_tag] transition[prev_tag][current_tag] if score max_score: max_score score dp[i][current_tag] max_score emission[current_tag][words[i]] # 回溯得到最优路径 return best_path5. 为什么CRF比简单分类器更好普通分类器就像让多个厨师独立做一道菜而CRF是协调整个厨房团队。具体优势体现在处理依赖O→I的转移分数为-∞确保不会产生非法标注全局最优会选择虽然单个标签分数不是最高但整体最合理的序列可解释性可以通过分析转移矩阵发现数据中的模式如有限公司总是B I I I在实际项目中CRF层通常接在BiLSTM等神经网络之后原始文本 → 词嵌入 → BiLSTM → 全连接层 → CRF → 预测标签这种组合既利用了深度学习的特征提取能力又保留了CRF对标签关系的建模优势。
别再死记硬背CRF公式了!用BIO实体标注的例子,5分钟搞懂发射分数和转移分数
发布时间:2026/5/31 13:33:52
用一盘宫保鸡丁理解CRFBIO标注中的发射与转移分数实战想象你正在教一个完全不懂烹饪的朋友做宫保鸡丁。你不会一上来就讲火候控制中的热力学传导原理而是会说油温六成热下鸡肉看到表面变白就捞出来。同样地理解条件随机场CRF最有效的方式不是从马尔可夫性开始而是拿起一个真实的BIO标注案例看看每个字的标签是怎么被打分和选择的。1. 从BIO标注看CRF的思维方式在命名实体识别任务中B-实体开头/I-实体内部/O-非实体的标注方式就像给每个字贴标签。以北京烤鸭为例理想的标注序列是B I I。但CRF不会直接输出这个结果而是会计算每个字作为B/I/O的发射分数就像评估鸡肉块适合炸还是炒考虑标签之间的转移分数就像知道腌之后应该接炸而不是直接蒸找出全局分数最高的标签组合就像设计最优烹饪流程关键区别与HMM等模型不同CRF会同时考虑所有可能的标签序列而不是贪心地选择每一步最优。就像好厨师不会单独优化每道工序而是追求整个烹饪流程的协调性。2. 发射分数当前字的标签偏好发射分数衡量的是当前输入字对应某个标签的合理性。假设我们有个微型标注任务——识别句子中的菜品名# 示例文本宫保鸡丁怎么做 # 可能的标签B(菜品开头) I(菜品延续) O(其他) # 发射分数示意数值越大越可能 发射分数 { 宫: {B: 8.2, I: 1.1, O: 0.7}, # 明显倾向B 保: {B: 0.3, I: 7.9, O: 1.8}, # 前字是B时倾向I 怎: {B: 0.1, I: 0.2, O: 9.7} # 明显非菜品 }这些分数通常由神经网络生成就像厨师凭经验知道鸡胸肉适合炸鸡腿更适合炖。在实际CRF实现中你会看到这样的代码逻辑def get_emission_scores(word): # 实际中这里会调用神经网络模型 if word in dish_name_words: return {B: high_score, I: medium_score, O: low_score} else: return {B: 0.1, I: 0.1, O: 0.8}3. 转移分数标签间的语法规则转移分数决定了标签之间的转换可能性就像烹饪中腌制→油炸合理但油炸→腌制就很奇怪。在BIO标注中前一个标签 \ 当前标签BIOB-∞8.23.1I1.27.54.0O6.3-∞9.0注-∞表示禁止转移如O后面不能直接跟I这个转移矩阵告诉我们B后面接I很合理8.2分但接另一个B不可能-∞O后面接O很常见9.0分但接I不合法-∞I后面可以接I7.5分表示实体继续实际应用中转移矩阵会被初始化为可学习参数但会通过约束保证非法转移的分数极低4. 综合计算找到最优标签序列现在我们把发射分数和转移分数结合起来计算整个序列的得分。以宫保鸡丁为例计算单路径分数假设标注序列为B I I I分数 trans(Start→B) emit(B|宫) trans(B→I) emit(I|保) trans(I→I) emit(I|鸡) trans(I→I) emit(I|丁)考虑所有可能路径对于4个字有3^481种可能的BIO组合实际会更少因为有些转移非法选择最优路径使用维特比算法高效地找出分数最高的路径就像厨师会规划最省时的烹饪顺序# 简化的维特比算法伪代码 def viterbi(words, emission_scores, transition_scores): # 初始化 dp [{B: score1, I: score2, O: score3}, ...] # 递推计算 for i in range(1, len(words)): for current_tag in [B, I, O]: max_score -inf for prev_tag in [B, I, O]: score dp[i-1][prev_tag] transition[prev_tag][current_tag] if score max_score: max_score score dp[i][current_tag] max_score emission[current_tag][words[i]] # 回溯得到最优路径 return best_path5. 为什么CRF比简单分类器更好普通分类器就像让多个厨师独立做一道菜而CRF是协调整个厨房团队。具体优势体现在处理依赖O→I的转移分数为-∞确保不会产生非法标注全局最优会选择虽然单个标签分数不是最高但整体最合理的序列可解释性可以通过分析转移矩阵发现数据中的模式如有限公司总是B I I I在实际项目中CRF层通常接在BiLSTM等神经网络之后原始文本 → 词嵌入 → BiLSTM → 全连接层 → CRF → 预测标签这种组合既利用了深度学习的特征提取能力又保留了CRF对标签关系的建模优势。