主办方提供的数据是一些用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/454

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!