赞
踩
上一章详细解释了BIO和IOB数据标注的区别,并且对转化步骤做了详细说明
下面我们以wikierNER数据集为例,展示读取IOB标注数据,并将其转化为BIO标注格式相关代码。
该数据集中的标注包括以下几个部分:
- 单词:文本中的每个单词。
- 词性标注(Part-of-Speech,POS):标注了每个单词的词性,例如"DT"表示冠词(Determiner),"NNP"表示专有名词(Proper noun),"TO"表示介词to,"VBZ"表示动词be的第三人称单数形式等。
- NER标签:标注了每个单词的命名实体类别。这里使用的是MISC(Miscellaneous)类别,表示不属于其他特定类别的实体。
这些标注信息可以帮助模型理解和识别文本中的各个实体及其属性,数据格式示例如下
The|DT|I-MISC Oxford|NNP|I-MISC Companion|NNP|I-MISC to|TO|I-MISC Philosophy|NNP|I-MISC says|VBZ|O ,|,|O "|LQU|O there|EX|O is|VBZ|O no|DT|O single|JJ|O defining|VBG|O position|NN|O that|IN|O all|DT|O anarchists|NNS|O hold|VBP|O ,|,|O and|CC|O those|DT|O considered|VBN|O anarchists|NNS|O at|IN|O best|JJS|O share|NN|O a|DT|O certain|JJ|O family|NN|O resemblance|NN|O .|.|O "|RQU|O
完整的数据读取及格式转化代码如下:
- def wikier_to_tuple(input_file):
- """读取wikier数据集,把IOB标注改为BIO,返回格式
- lines=[('O O B-LOC', 'I love Beijing'), ('O O O B-LOC', 'He is from Shanghai')]"""
-
- rf = open(input_file, 'r', encoding='utf-8')
- lines = []
-
- for line in rf:
- if line != '\n':
- parts = line.split(' ')
- words = [i.split('|')[0].replace('\n', '') for i in parts]
- labels = [i.split('|')[2].replace('\n', '') for i in parts]
-
- # 把IOB标注改为BIO
- bio_tags = []
- current_tag = 'O'
- for iob_tag in labels:
- if iob_tag == 'O':
- bio_tags.append('O')
- current_tag = 'O'
- else:
- label, tag = iob_tag.split('-')
- if tag != current_tag:
- bio_tags.append('B-' + tag)
- current_tag = tag
- else:
- bio_tags.append('I-' + tag)
- print(bio_tags) #新的BIO
- print(labels) #旧的IOB
- l = ' '.join( bio_tags)
- w = ' '.join(words)
- lines.append((l, w))
-
- rf.close()
- return lines
调用以上函数就可以成功把IOB数据的wikier数据转化为BIO数据了。
注意:这里我模型训练中用不到词性标注信息,所以就没有保留该字段,如果需要的话可以对上述代码稍作修改。
读取IOB标注数据,并转化为BIO标注格式分步代码解析可以查看上一章~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。