基于BiLSTM+CRF医学病例命名实体识别项目

news2024/9/27 5:47:20

研究背景

为通过项目实战增加对命名实体识别的认识,本文找到中科院软件所刘焕勇老师在github上的开源项目,中文电子病例命名实体识别项目MedicalNamedEntityRecognition。对其进行详细解读。
原项目地址:https://github.com/liuhuanyong/MedicalNamedEntityRecognition
修改版项目地址(详细注释):待补充

项目介绍

数据来自CCKS2018的电子病历命名实体识别的评测任务,是对于给定的一组电子病历纯文本文档,识别并抽取出其中与医学临床相关的实体,并将它们归类到预先定义好的类别中。共提供600份标注好的电子病历文本,共需识别含治疗方式、身体部位、疾病症状、医学检查、疾病实体五类实体。
领域命名实体识别问题自然语言处理中经典的序列标注问题, 本项目是采用BiLSTM+CRF构建模型。
病历结构如下图所示:
在这里插入图片描述

神经网络结构图

在这里插入图片描述

实验数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import os
class TransferData:
    def __init__(self):
        cur = '/'.join(os.path.abspath(__file__).split('/')[:-1])  #获取当前文件地址的上级目录
        #对分类进行标记
        self.label_dict = {
                      '检查和检验': 'CHECK',
                      '症状和体征': 'SIGNS',
                      '疾病和诊断': 'DISEASE',
                      '治疗': 'TREATMENT',
                      '身体部位': 'BODY'}

        self.origin_path = os.path.join(cur, 'data_origin')  #原始数据地址
        self.train_filepath = os.path.join(cur, 'train.txt') #转化后的训练数据地址
        return
    def transfer(self):
        f = open(self.train_filepath, 'w+',encoding='utf-8')   #以写入的方式打开训练数据要保存的文件
        count = 0
        for root,dirs,files in os.walk(self.origin_path):
        #for (root, dirs, files) in walk(roots):
        # roots代表需要遍历的根文件夹;
        # root表示正在遍历的文件夹的名字(根/子);
        # dirs记录正在遍历的文件夹下的子文件夹集合;
        # files记录正在遍历的文件夹中的文件集合
            for file in files:
                filepath = os.path.join(root, file)
                if 'original' not in filepath:
                    continue
                label_filepath = filepath.replace('.txtoriginal','')
                print(filepath, '\t\t', label_filepath)  #data_origin\一般项目\一般项目-1.txtoriginal.txt 	data_origin\一般项目\一般项目-1.txt
                content = open(filepath,encoding='utf-8').read().strip()  #打开案例描述文件,去掉收尾空格
                res_dict = {}
                for line in open(label_filepath,encoding='utf-8'):  #打开实体类别文件
                    res = line.strip().split('	')  #每个实体描述按空格分隔 ['右髋部',‘21’,‘23’,‘身体部位’]
                    start = int(res[1])  #实体的其实字符位置
                    end = int(res[2])  #实体的结束字符位置
                    label = res[3]  #实体类别
                    label_id = self.label_dict.get(label)   #返回分类字典中实体类别对应的values,作为实体名称的id
                    for i in range(start, end+1):
                        if i == start:
                            label_cate = label_id + '-B'  #定义实体的首字符
                        else:
                            label_cate = label_id + '-I'  #实体的非首字符
                        res_dict[i] = label_cate   #构建实体字典{位置index:字符}

                for indx, char in enumerate(content):  #indx文本中字符的位置,char字符
                    char_label = res_dict.get(indx, 'O')  #如果indx在字典的key中,则返回字典value;否则返回O,代表非实体
                    print(char, char_label)   #字符:字符实体标注
                    f.write(char + '\t' + char_label + '\n')
        f.close()
        return
if __name__ == '__main__':
    handler = TransferData()
    train_datas = handler.transfer()

连接

原文连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一小时轻松掌握Git,看这一篇就足够

文章目录序言:版本控制分类一、Git环境配置下载卸载安装二、常用linux命令三、基本配置四、Git基本操作0.原理图1.项目创建及克隆方式一:本地仓库搭建方式二:克隆远程仓库2.文件操作3.配置ssh公钥4.分支5.push代码参考序言:版本控…

ORB_SLAM2+kinect稠密建图

下载代码:https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 运行代码: 解压代码后,删掉作者自己编译的build文件夹(下面三个都删除): ~/ORB_SLAM2_modified/build, ~/ORB_SLAM2_modified/T…

【上传项目代码到Git详细步骤】

1.下载安装Git到电脑上(这里我之前已经安装好了,就不细说了)2.进入控制台安装好后右键点击桌面空白部分会多出两个菜单选项,点击第二个Git Bash Here(点击第一个你会爆炸)会弹出一个git控制台,如…

华为OD机试用Python实现 -【分解质因数】 2023Q1A

华为OD机试题 本篇题目:分解质因数题目示例 1输入输出示例 2输入输出Code代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南

从0-1搭建交付型项目管理体系流程(上)【宝芝林2】

很多项目经理在这个阶段,由于经验不足及整个项目管理体系涉及的环节和内容比较庞杂,往往无法有效思考,无从下手。笔者有幸在最近几年的工作实践中,实际搭建并迭代了2-3次项目管理体系流程框架,期间也经历过很多迷茫&am…

C++基础了解-21-C++ 继承

C 继承 一、C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,不需要重新编写新的…

mes系统如何管理企业生产

随着市场竞争的日趋激烈,很多企业都开始意识到生产管理的重要性。mes系统如何管理企业生产?下面,我们通过一个实例来说明。 案例简介: 一、客户需求快速增长 随着市场竞争的加剧,越来越多的客户提出了个性化需求。同…

人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术

随着现今智能时代的发展,酒店也越来越趋于智能化,也在不断地推行智慧酒店,这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术,只有智能设备通过精准地感知人体存在,才能更好地做…

2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

目录前言C左值和右值二、右值引用二、右值引用前言 对于C的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接在这,话不多说讲解一…

C++ ,JNI, Java 数据传递全解(一)

在讲正题之前,先说一下C,JNI和Java 对应的数据类型对比吧,废话不多说,直接上图上面为C,Java,JNI 三者只见对应的数据类型好了,现在我们有了上面的数据类型比对,下面就讲讲从C如何将数…

MySQL的下载及安装详细教程

提示:本文仅为MySQL初学者的安装MySQL过程提供参考,创作不易,请多点赞支持! MySQL的下载及安装前言一、MySQL的下载及安装1.MySQL的下载2.MySQL的安装3.配置环境变量4.连接MySQL4.1 方式一4.2 方式二前言 本文内容主要是帮助初学…

OpenWrt 制作软件包05

文章目录 OpenWrt 制作软件包05软件包目录结构分析软件包顶层Makefile分析OpenWrt一些常用的变量一些默认的变量Package宏定义Build宏定义构建自己的软件系统软件包工程目录文件内容分析编译安装卸载OpenWrt 制作软件包05 软件包目录结构分析 如下图所示 :

4N65-ASEMI高压MOS管4N65

编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为2.5Ω,是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。4N65功耗&#xff08…

[工控自动化]信捷PLC与威纶通HMI以太网通讯的连接设置

在工业自动化领域,PLC和触摸屏是经常使用的元器件,其中PLC是处理逻辑与数据的核心,而触摸屏HMI则是显示与操作的必备。 工控领域虽然是外国品牌的天下,但近些年来,国产PLC和HMI品牌也在成长,例如汇川、信捷、威纶通等。 本文以实际使用经验,介绍一下信捷PLC与威纶通HMI的…

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景,就是一个list,根据某种规则,我要去判断里面是不是有重复的项。 难度不高,但有点烦,所以专门开一篇文章来记录一下,争取弄一个相对简洁的写法。 先看一个简单的例子&#xf…

DSF深度搜索时到底是如何回溯的(小tip)

这一段让我迷了两次,为什么回溯的时候,恢复了最后一位,往上递归一层之后,把最后一位填在它前一位,但是原本的前一位没有恢复,最后一位要怎么办?其实这还是递归没明白 也就是这一步是如何实现的 …

Kafka 压缩算法

压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层: 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…

python趣味编程-奥赛罗游戏

在上一期我们用Python实现了一个高速公路汽车游戏的游戏,这一期我们继续使用Python实现一个简单的奥赛罗游戏,让我们开始今天的旅程吧~ 在Python中使用Turtle实现的奥赛罗游戏 在Python中使用Turtle的简单奥赛罗游戏 是一个以 Python 为程序设计语言的项…

基于nvidia xavier智能车辆自动驾驶域控制器设计与实现(一)

智能车辆在减少交通事故、节能减排、缓解交通拥堵等方面具有十分重要的作用,自动驾驶系统又是智能车辆的核心。近年来,随着智能车辆的应用场景日益广泛,人工智能算法在自动驾驶系统中广泛应用,自动驾驶系统功能不断增强&#xff0…

ccc-pytorch-RNN(7)

文章目录一、RNN简介二、RNN关键结构三、RNN的训练方式四、时间序列预测五、梯度弥散和梯度爆炸问题一、RNN简介 RNN(Recurrent Neural Network)中文循环神经网络,用于处理序列数据。它与传统人工神经网络和卷积神经网络的输入和输出相互独立…