当前位置:   article > 正文

读取IOB标注数据,并转化为BIO标注格式(一)

bio标注格式

BIO标注方法和IOB标注方法是用于命名实体识别(Named Entity Recognition,NER)任务的常用标注方法。

BIO是一种简单直观的标注方法。在BIO标注中,每个词被标记为以下三个类别之一:

  • B(Begin):表示一个词块的开始,即一个实体的开始部分。
  • I(Inside):表示词块的内部,即实体的非起始部分。
  • O(Outside):表示不属于任何词块,即非实体部分。
  • 苹果公司 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',然后检查每个标记。

  1. bio_tags = []
  2. current_tag = 'O'

如果标记为'O',我们直接将'O'添加到BIO标记列表中,并将当前标记更新为'O'。

  1. for iob_tag in labels:
  2. if iob_tag == 'O':
  3. bio_tags.append('O')
  4. current_tag = 'O'

如果标记不是'O',我们使用split()函数将其拆分为实体类别(label)和标记(tag)。

  1. else:
  2. label, tag = iob_tag.split('-')

然后,我们检查当前标记是否与之前的标记相同。 如果不同,我们将'B-' + label作为开始标记添加到BIO标记列表中,并将当前标记更新为tag。 如果相同,我们将'I-' + label作为内部标记添加到BIO标记列表中。

  1. if tag != current_tag:
  2. bio_tags.append('B-' + tag)
  3. current_tag = tag
  4. else:
  5. bio_tags.append('I-' + tag)

最后,我们使用print()函数输出原始的IOB标记列表和转换后的BIO标记列表。

  1. print(bio_tags) #新的BIO
  2. print(labels) #旧的IOB

下期将以IOB标注的wikierNER数据集为例,做完整的数据集读取及BIO格式转化代码展示~

读取IOB标注数据,并转化为BIO标注格式(二)-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/592337
推荐阅读
相关标签
  

闽ICP备14008679号