You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python代码将IOB标签组中无前导B-的首个I-标签改为B-

IOB标签修正方案

原代码问题说明

原代码逻辑存在缺陷:遍历过程中只要遇到相邻的两个I标签就将前一个改为B,没有判断当前I是否属于新子组的首个元素,导致连续I序列中会被错误修改出多个B标签。

修正思路

只需要在遇到I开头的标签时,判断该标签是否是同类型实体子组的首个元素:

  • 若当前标签是列表第一个元素且为I开头,直接改为B开头
  • 若前一个标签是O,或前一个标签的实体类型与当前I标签的实体类型不一致,说明当前I是新子组的首个元素,改为B开头
  • 其余情况保持原标签不变

修正后代码

def fix_iob_tags(iobTags):
    # 复制原列表避免修改原始输入数据
    fixed_tags = iobTags.copy()
    for i in range(len(fixed_tags)):
        current = fixed_tags[i]
        # 跳过非I开头的标签
        if not current.startswith('I-'):
            continue
        # 拆分获取实体类型
        _, entity_type = current.split('-')
        # 处理列表首个元素为I的情况
        if i == 0:
            fixed_tags[i] = f'B-{entity_type}'
            continue
        prev = fixed_tags[i-1]
        # 前一个标签是O,或前一个标签实体类型不匹配,说明是新子组开头
        if prev == 'O' or not prev.endswith(f'-{entity_type}'):
            fixed_tags[i] = f'B-{entity_type}'
    return fixed_tags

效果验证

  • 测试输入1:['O', 'O', 'O', 'O', 'I-INS', 'I-INS', 'I-INS', 'B-PER', 'I-PER']
    输出:['O', 'O', 'O', 'O', 'B-INS', 'I-INS', 'I-INS', 'B-PER', 'I-PER'],符合要求
  • 测试输入2:['I-INS','I-INS','I-INS']
    输出:['B-INS','I-INS','I-INS'],符合要求
  • 测试输入3:['I-INS','O','I-INS','I-PER']
    输出:['B-INS','O','B-INS','B-PER'],跨实体、O分隔场景均处理正确

内容的提问来源于stack exchange,提问作者BlueBlue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:39:05