命名实体识别数据集构建

命名实体有很多构建方式,这个代码是针对我所作的项目进行构建,方便我自己用,在使用中可以根据自己的方式进行修改,如有不懂可留言私信

import pandas as pd

cer_type = ['工程施工合同', '拍摄合作协议']
per_j = ['中节能财务有限公司', '天津市养颜堂生物技术有限公司'']
per_y = [古城中学', '丹赛县农业局']
contract_data = ['2019年12月19日', '2017年10月25日', '2018年4月18日', '2018年4月25日', '2012年7月15日', '2020年3月20日', '2021年12月31日']
cer_number = ['XF180822-0563', 'ISCT2018-0011', 'DS20180801', 'wy20211122']
money_big = ['贰拾壹万玖任伍佰贰拾元整', '伍万陆仟元整', '叁佰壹拾贰万壹仟叁佰零玖元', '叁万叁仟陆佰抑拾伍元整', '拾捌万柒仟叁佰贰拾圆整', '壹佰捌拾柒万叁仟贰佰', '壹拾伍万元整', '肆万伍仟元整', '三万元整', '肆万贰仟玖佰元整']
money_small = ['219520.00元', '3121309.00元', '33685元', '187320.00元', '1873200.00元', '150000元', '45000元', '30000元', '1,873,200.00元', '187,320.00元', '2369.440元']
train_df = pd.read_csv('./data/train.txt', header=None, names=['txt'])
train_df['clear_txt'] = ''
train_df['lable_txt'] = ''


def cal_base(text, result_list, type_list, type_flag, type_flag_end):
    per_j_str = []
    per_j_end = []
    for i in type_list:
        if text.find(i) != -1:
            # print(i)
            # print(text.find(i), int(text.find(i) + len(i)))
            per_j_str.append(text.find(i))
            per_j_end.append(int(text.find(i) + len(i) - 1))

    per_j_dict = {'per_j_str': per_j_str, 'per_j_end': per_j_end}
    for i in range(len(per_j_str)):
        for j in range(per_j_dict['per_j_str'][i], per_j_dict['per_j_end'][i] + 1):
            result_list[j] = type_flag_end
        result_list[per_j_dict['per_j_str'][i]] = type_flag
    return result_list


for num, text in enumerate(train_df['txt']):
    text = text.replace(' ', '').replace('\r', '')
    ori_list = []
    result_list = []
    for i, j in enumerate(text):
        ori_list.append(j)
        result_list.append('O')
    print(ori_list)
    result_list = cal_base(text, result_list, cer_type, 'T-B', 'T-I')
    result_list = cal_base(text, result_list, per_j, 'J-B', 'J-I')
    result_list = cal_base(text, result_list, per_y, 'Y-B', 'Y-I')
    result_list = cal_base(text, result_list, contract_data, 'D-B', 'D-I')
    result_list = cal_base(text, result_list, cer_number, 'N-B', 'N-I')
    result_list = cal_base(text, result_list, money_big, 'MB-B', 'MB-I')
    result_list = cal_base(text, result_list, money_small, 'MS-B', 'MS-I')
    tool_re = '\002'.join(ori_list)
    train_df['clear_txt'][num] = tool_re
    lable_re = '\002'.join(result_list)
    train_df['lable_txt'][num] = lable_re
print(train_df)
train_df.to_csv('clear_tra_new.txt')

20220415
命名实体识别后还要进行分析,提取对应实体,这里提供一个写法,方便提取

def get_valid_nertag(input_data, result_tags):
    result_words = []
    start, end =0, 1 # 实体开始结束位置标识
    tag_label = "O" # 实体类型标识
    for i, tag in enumerate(result_tags):
        if tag.startswith("B"):
            if tag_label != "O": # 当前实体tag之前有其他实体
                result_words.append((input_data[start: end], tag_label)) # 获取实体
            tag_label = tag.split("-")[1] # 获取当前实体类型
            start, end = i, i+1 # 开始和结束位置变更
        elif tag.startswith("I"):
            temp_label = tag.split("-")[1]
            if temp_label == tag_label: # 当前实体tag是之前实体的一部分
                end += 1 # 结束位置end扩展
        elif tag == "O":
            if tag_label != "O": # 当前位置非实体 但是之前有实体
                result_words.append((input_data[start: end], tag_label)) # 获取实体
                tag_label = "O"  # 实体类型置"O"
            start, end = i, i+1 # 开始和结束位置变更
    if tag_label != "O": # 最后结尾还有实体
        result_words.append((input_data[start: end], tag_label)) # 获取结尾的实体
    return result_words
get_valid_nertag(['浦','东','一','妇','婴','东','院'],['B-A', 'B-A', 'O', 'B-A', 'I-A', 'I-A', 'I-A'])
# 结果
# [(['浦'], 'A'), (['东'], 'A'), (['妇', '婴', '东', '院'], 'A')]

版权声明:本文为qq_39309652原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。