NER项目 P2-3 解析文字和实体标签对应关系(3)
主办方提供的数据是一些用brat标注的文件,.txt文件为原始文档,.ann文件为标注信息,标注实体以T开头,后接实体序号,实体类别,起始位置,结束位置和实体对应的文档中的词。
因为标注文件的格式不是模型直接能用的,所以我们需要预处理一下,将单个字和标签做一一对应,生成一个新的带标注的文件。
预处理说明
原始数据
中国成人2型糖尿病HBA1C c控制目标的专家共识
标注文件格式
T368 Disease 4 9 2型糖尿病 T369 Test 9 14 HBA1C
导出格式
中,O 国,O 成,O 人,O 2,B-Disease 型,I-Disease 糖,I-Disease 尿,I-Disease 病,I-Disease ...
代码示例
1、配置项
# config.py ORIGIN_DIR = './input/origin/' ANNOTATION_DIR = './output/annotation/'
2、新建预处理文件
# data_process.py from glob import glob import os import random import pandas as pd from config import *
3、解析标签
# 根据标注文件生成对应关系 def get_annotation(ann_path): with open(ann_path) as file: anns = {} for line in file.readlines(): arr = line.split('\t')[1].split() name = arr[0] start = int(arr[1]) end = int(arr[-1]) # 标注太长,可能有问题 if end - start > 50: continue anns[start] = 'B-' + name for i in range(start + 1, end): anns[i] = 'I-' + name return anns
4、一一对应
def get_text(txt_path): with open(txt_path) as file: return file.read() # 建立文字和标签对应关系 def generate_annotation(): for txt_path in glob(ORIGIN_DIR + '*.txt'): ann_path = txt_path[:-3] + 'ann' anns = get_annotation(ann_path) text = get_text(txt_path) # 建立文字和标注对应 df = pd.DataFrame({'word': list(text), 'label': ['O'] * len(text)}) df.loc[anns.keys(), 'label'] = list(anns.values()) # 导出文件 file_name = os.path.split(txt_path)[1] df.to_csv(ANNOTATION_DIR + file_name, header=None, index=None) if __name__ == '__main__': # 建立文字和标签对应关系 generate_annotation()
本文链接:http://www.ichenhua.cn/edu/note/515
版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!