赞
踩
BIO标注方法和IOB标注方法是用于命名实体识别(Named Entity Recognition,NER)任务的常用标注方法。
BIO是一种简单直观的标注方法。在BIO标注中,每个词被标记为以下三个类别之一:
- 苹果公司 B-ORG
- 的 O
- 创始人 O
- 是 O
- 史蒂夫 B-PER
- · I-PER
- 乔布斯 I-PER
- 。 O
而在IOB中,标签B仅用于两个连续的同类型命名实体的边界区分,不用于命名实体的起始位置。而I和O含义BIO方法相同。
上述例子中,IOB标注方法结果如下:
- 苹果公司 I-ORG
- 的 O
- 创始人 O
- 是 O
- 史蒂夫 I-PER
- · I-PER
- 乔布斯 I-PER
- 。 O
IOB因为缺少B-tag作为实体标注的头部表示,丢失了部分标注信息,导致很多任务上的效果不佳,因此出现了IOB-2,约定了所有命名实体均以B tag开头。这样IOB-2其实与BIO的标注方式是等价的。
由于大部分模型均以BIO方法标注训练,因此下面以一个示例代码展示如何将IOB数据标注修改为BIO数据。
首先使用一个循环来迭代IOB标记列表。我们首先将当前标记初始化为'O',然后检查每个标记。
- bio_tags = []
- current_tag = 'O'
如果标记为'O',我们直接将'O'添加到BIO标记列表中,并将当前标记更新为'O'。
- for iob_tag in labels:
- if iob_tag == 'O':
- bio_tags.append('O')
- current_tag = 'O'
如果标记不是'O',我们使用split()函数将其拆分为实体类别(label)和标记(tag)。
- else:
- label, tag = iob_tag.split('-')
然后,我们检查当前标记是否与之前的标记相同。 如果不同,我们将'B-' + label作为开始标记添加到BIO标记列表中,并将当前标记更新为tag。 如果相同,我们将'I-' + label作为内部标记添加到BIO标记列表中。
- if tag != current_tag:
- bio_tags.append('B-' + tag)
- current_tag = tag
- else:
- bio_tags.append('I-' + tag)
最后,我们使用print()函数输出原始的IOB标记列表和转换后的BIO标记列表。
- print(bio_tags) #新的BIO
- print(labels) #旧的IOB
下期将以IOB标注的wikierNER数据集为例,做完整的数据集读取及BIO格式转化代码展示~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。