CCKS2020数据集处理

这几天再看关于医学命名实体识别的论文,想着自己尝试去运行一下论文中的代码。但是第一步就是我们对数据记得处理。结合csdn中的一些博主的代码命名实体识别ccks2020数据集的数据预处理之上进行了修改,因为我需要的格式需要对数据集中的每一个句子进行编码。为了方便得到每一个句子的编码表示。我们在预处理时为每一个句字中间都加了一个\n\n用来区分不同的句子。

import re


# 把re认为是一个正则表达式module

def get_data_lists(filepath):
    # 打开所要处理的文件
    # python的with open()函数,第一个参数是读取文件路径,第二个参数是读取方式('r':只读,'w':只写,'r+':读写均可,'a':可追加至文件末尾)
    # 第四个参数是指如果读取发生错误的处理方式
    with open(filepath, "r", encoding='utf-8', errors='ignore') as fp:
        text = fp.readlines()  # fp.readlines():返回的是由字符串构成的 list

    tag_lists = []
    word_lists = []

    for sent in range(len(text)):
        '''
        r''  告诉python这是一个原始字符串,将不处理转义序列(\n、\b 等)
        >>> print('\n') # 打印换行符   >>>print(r'\n') # 不处理转义序列\n
        >>> print('\b') # 打印退格字符 >>>print(r'\b') # 不处理转义序列\b

        re.findall(pattern, string, flags=0)

        pattern -->正则表达式

        string -->需要处理的字符串

        flags -->说明匹配模式
        '''
        # 对列表里的每个句子进行处理,获取标注信息labels和文本信息content
        labels = re.findall(r'(?<=\|\|\|).*?(?=\|\|\|)', text[sent])
        content = re.findall(r'.*?(?=\|\|\|)', text[sent])[0]
        # 将文本转化为单字序列
        word_list = [word for word in content]
        word_lists.append(word_list)

        # 生成标记序列
        tag_list = []
        begin = []
        end = []
        tags = []

        # begin包含所有实体的起始位置,end包含对应实体的结束为止,tags包含对应标注内容
        for j in range(len(labels)):
            pos = re.split(r'\s', labels[j])
            pos = [x for x in pos if x != '']
            begin.append(int(pos[0]))
            end.append(int(pos[1]))
            tags.append(pos[2])

        # 从文本第一个位置开始,生成标记序列
        idxb = 0
        for i in range(len(content)):
            if i in begin:
                idxb = begin.index(i)
                tag = 'B' + '-' + tags[idxb]
            elif (i > begin[idxb]) & (i < end[idxb]):
                tag = 'I' + '-' + tags[idxb]
            else:
                tag = 'O'
            tag_list.append(tag)
        tag_lists.append(tag_list)
    return tag_lists, word_lists


# 将数据写入新文件操作
def write_data(path, word_data, tag_data):
    with open(path, "w", encoding="utf-8") as fw:  # 打开指定文件
        for line1, line2 in zip(word_data, tag_data):
            for l1, l2 in zip(line1, line2):
                fw.write(l1 + " " + l2 + "\n")  # 每行末尾添加换行符
            fw.write("\n\n")

if __name__ == '__main__':
    # 训练集
    train_tag_lists, train_word_lists = get_data_lists('./train_data.txt')
    write_data('./new_data/train.txt', train_word_lists, train_tag_lists)
    # 验证集
    val_tag_lists, val_word_lists = get_data_lists('./val_data.txt')
    write_data('./new_data/eval.txt', val_word_lists, val_tag_lists)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值