主办方提供的数据是一些用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()
Original: https://blog.csdn.net/sddqe/article/details/126273800
Author: 陈华编程
Title: NER项目 P2 解析文字和实体标签对应关系
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/557735/
转载文章受原作者版权保护。转载请注明原作者出处!