电子病历实体识别数据处理、多个文件读取
文章目录
- 数据格式
- 数据描述
- 数据处理
- 1、json格式
- 代码
数据格式
电子病历包含四个部分:
每个部分都有相关的病历和实体标签:
其中病史特点-1.txt
等格式是病历实体标签内容:
其中病史特点-1.txtoriginal.txt
等格式是病历内容:
数据描述
病史特点-1.txt
等实体标签内容:
每一行包括:
实体名字 | 起始下标 | 结尾下标 | 实体类别 |
---|
实体类别定义
- 症状和体征 :症状是患者描述的主观感受、体征则是外部观察到的客观事实。举例来说,流鼻涕、头昏及体温超过摄氏三十八度,这三者都是感冒的元素:但流鼻水及头昏是感冒的症状;而体温超过三十八度,则是感冒的体征。
- 检查和检验 :指通过实验室技术、医疗仪器设备为临床诊断、治疗所提供的依据。
- 疾病和诊断 :疾病是机体在一定的条件下,受病因损害作用后,因自稳调节紊乱而发生的异常生命活动过程;诊断,是指根据症状来识别病人所患何病。
- 治疗 :通常是指干预或改变特定健康状态的过程。为解除病痛所进行的活动,如药物、手术等。
- 身体部位 :指疾病、症状和体征发生的人体解剖学部位。
数据处理
1、json格式
json格式的文本处理
需要将实体类别映射成英文:
'检查和检验': 'CHECK',
'症状和体征': 'SIGNS',
'疾病和诊断': 'DISEASE',
'治疗': 'TREATMENT',
'身体部位': 'BODY'
再将实体类别打上BIO标签:
'O': 0,
'B-TREATMENT': 1,
'I-TREATMENT': 2,
'B-BODY': 3,
'I-BODY': 4,
'B-SIGNS': 5,
'I-SIGNS': 6,
'B-CHECK': 7,
'I-CHECK': 8,
'B-DISEASE': 9,
'I-DISEASE': 10
定义路径和映射字典:
path = r"D:\学习·\自然语言处理\数据集\CCSK2017"
self.raw_data_path = os.path.join(path, 'raw_data/原始数据')
self.process_data_path = os.path.join(path, 'raw_data/data.json')
self.cn2en_dict = {'检查和检验': 'CHECK','症状和体征': 'SIGNS','疾病和诊断': 'DISEASE','治疗': 'TREATMENT','身体部位': 'BODY'}
获取文件夹名称:
['一般项目', '出院情况', '病史特点', '诊疗经过']
使用 os.listdir()
list_dir = os.listdir(self.raw_data_path)
循环读取文件夹内容
for dir in list_dir:dir_path = self.raw_data_path + '/' + dirfiles = os.listdir(dir_path)for file in files:"""一般项目、出院情况、病史特点、诊疗经过里面的文件"""file_path = dir_path + '/' + fileif 'original' not in file_path:continue
其中 dir_path:
D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/一般项目
D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/出院情况
D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/病史特点
D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/诊疗经过
files:
读取1.txtoriginal.txt
和1.txt
的格式的文件
文件——rstrip() 、lstrip()和 strip()、zip() 函数
content_filepath = file_path
tag_filepath = content_filepath.replace('.txtoriginal', '')
with open(content_filepath, 'r', encoding = 'utf-8') as f:content = f.read().strip()with open(tag_filepath, 'r', encoding = 'utf-8') as l_f:res = l_f.readlines()tag_content = ['O'] * len(content)#其他类型标签content = [i for i in content]for r in res:r = r.strip().split('\t')tag, s_i, e_i, entity_class = r[0], int(r[1]), int(r[2]), r[3]entity_class = self.cn2en_dict.get(entity_class)"""打上B-TREATMENT','I-TREATMENT',等BI命名实体识别标签"""for i in range(s_i, e_i + 1):if i == s_i:tag_content[i] = 'B-' + entity_classelse:tag_content[i] = 'I-' + entity_classassert len(tag_content) == len(content)
其中
content’: [‘女’, ‘性’, ‘,’, ‘8’, ‘8’, ‘岁’, ‘,’, ‘农’, ‘民’, ‘,’, ‘双’, ‘滦’, ‘区’, ‘应’, ‘营’, ‘子’, ‘村’, ‘人’, ‘,’,
‘主’, ‘因’, ‘右’, ‘髋’, ‘部’, ‘摔’, ‘伤’, ‘后’, ‘疼’, ‘痛’, ‘肿’, ‘胀’, ‘,’, ‘活’, ‘动’, ‘受’, ‘限’, ‘5’, ‘小’,
‘时’, ‘于’, ‘2’, ‘0’, ‘1’, ‘6’, ‘-’, ‘1’, ‘0’, ‘-’, ‘2’, ‘9’, ‘;’, ‘1’, ‘1’, ‘:’, ‘1’, ‘2’, ‘入’, ‘院’, ‘。’],
tag, s_i, e_i, entity_class : 实体名字 、 起始下标、 结尾下标 、 实体类别
tag_content:[‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’,
‘B-BODY’, ‘I-BODY’, ‘I-BODY’, ‘O’, ‘O’, ‘O’, ‘B-SIGNS’, ‘I-SIGNS’, ‘B-SIGNS’, ‘I-SIGNS’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’,
‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’]
然后使用 write_jsonline() 把读取内容保存到json格式
代码
# -*- coding: utf-8 -*-
# @Time : 2021/5/28
# refer to : Benqi
# @Author : xuanyunyunimport os
from ccks2020.tools import write_jsonline, read_jsonlineclass DataTransfer(object):def __init__(self):path = r"D:\学习·\自然语言处理\数据集\CCSK2017"self.raw_data_path = os.path.join(path, 'raw_data/原始数据')self.process_data_path = os.path.join(path, 'raw_data/data.json')self.cn2en_dict = {'检查和检验': 'CHECK','症状和体征': 'SIGNS','疾病和诊断': 'DISEASE','治疗': 'TREATMENT','身体部位': 'BODY'}self.tag2i_dict = {'O': 0,'B-TREATMENT': 1,'I-TREATMENT': 2,'B-BODY': 3,'I-BODY': 4,'B-SIGNS': 5,'I-SIGNS': 6,'B-CHECK': 7,'I-CHECK': 8,'B-DISEASE': 9,'I-DISEASE': 10}def single_file2jsonl(self, path):content_filepath = path#D:\学习·\自然语言处理\数据集\CCSK2017\CCKS2017-master\data2/training dataset v4/一般项目/一般项目-1.txtoriginal.txttag_filepath = content_filepath.replace('.txtoriginal', '')#D:\学习·\自然语言处理\数据集\CCSK2017\CCKS2017-master\data2/training dataset v4/一般项目/一般项目-1.txtwith open(content_filepath, 'r', encoding = 'utf-8') as f:content = f.read().strip()with open(tag_filepath, 'r', encoding = 'utf-8') as tag_f:res = tag_f.readlines()tag_content = ['O'] * len(content)#其他类型标签content = [i for i in content]"""'content': ['女', '性', ',', '8', '8', '岁', ',', '农', '民', ',', '双', '滦', '区', '应', '营', '子', '村', '人', ',', '主', '因', '右', '髋', '部', '摔', '伤', '后', '疼', '痛', '肿', '胀', ',', '活', '动', '受', '限', '5', '小', '时', '于', '2', '0', '1', '6', '-', '1', '0', '-', '2', '9', ';', '1', '1', ':', '1', '2', '入', '院', '。'],"""for r in res:r = r.strip().split('\t')tag, s_i, e_i, entity_class = r[0], int(r[1]), int(r[2]), r[3]"""右髋部 45 47 身体部位"""entity_class = self.cn2en_dict.get(entity_class)"""打上B-TREATMENT','I-TREATMENT',等BI命名实体识别标签"""for i in range(s_i, e_i + 1):if i == s_i:tag_content[i] = 'B-' + entity_classelse:tag_content[i] = 'I-' + entity_classassert len(tag_content) == len(content)res_dic = {'content': content, 'tag': tag_content}return res_dicdef transfer(self):list_dir = os.listdir(self.raw_data_path)[1:]#['result', '一般项目', '出院情况', '病史特点', '诊疗经过']res_jsonl = []for dir in list_dir:dir_path = self.raw_data_path + '/' + dir"""dir_path:D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/一般项目D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/出院情况D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/病史特点D:\学习·\自然语言处理\数据集\CCSK2017\raw_data/原始数据/诊疗经过"""files = os.listdir(dir_path)for file in files:"""一般项目、出院情况、病史特点、诊疗经过里面的文件"""file_path = dir_path + '/' + fileif 'original' not in file_path: #file_path只是包含original的文件continueres_dic = self.single_file2jsonl(file_path)res_jsonl.append(res_dic)"""{'content': ['女', '性', ',', '8', '8', '岁', ',', '农', '民', ',', '双', '滦', '区', '应', '营', '子', '村', '人', ',', '主', '因', '右', '髋', '部', '摔', '伤', '后', '疼', '痛', '肿', '胀', ',', '活', '动', '受', '限', '5', '小', '时', '于', '2', '0', '1', '6', '-', '1', '0', '-', '2', '9', ';', '1', '1', ':', '1', '2', '入', '院', '。'], 'tag': ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-BODY', 'I-BODY', 'I-BODY', 'O', 'O', 'O', 'B-SIGNS', 'I-SIGNS', 'B-SIGNS', 'I-SIGNS', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']}"""write_jsonline(self.process_data_path, res_jsonl)if __name__ == '__main__':data_trans = DataTransfer()data_trans.transfer()
电子病历实体识别数据处理、多个文件读取相关推荐
- 中文电子病历实体关系抽取研究
摘要 本文首先对电子病历去隐私,制定了隐私信息标注规范,使用条件随机场完成了隐私信息识别模型的构建. 使用992份经去隐私的已标注中文电子病历,首先实现了基于特征的关系抽取方法,通过抽取一些基本特征 ...
- 利用python对excel文件进行操作_数据处理-对Excel文件读取和操作和存储(python版)...
一:利用python读取Excel中.xls文件中所有数据 #encoding=utf-8 import xlrd import xlwt from xlwt import * fileName=&q ...
- python爬取电子病历_一种基于中文电子病历的实体识别方法技术
本发明专利技术提供了一种基于中文电子病历的实体识别方法,涉及医疗实体识别技术领域.针对目前国内缺少公开中文电子病历标注语料库的缺陷,本发明专利技术通过构建整理医学词典,提出了一种半自动语料库标注方法, ...
- 基于RoBERTa-wwm动态融合模型的中文电子病历命名实体识别
摘要 [目的] 提出基于RoBERTa-wwm动态融合的实体识别模型,提高中文电子病历实体识别效果.[方法] 将预训练语言模型RoBERTa-wwm各Transformer层生成的语义表示进行动态融合 ...
- 最新最全-中文生物医学命名实体识别最新研究论文、资源、数据集、性能整理分享
本资源旨在跟踪中文生物医学自然语言处理的进展,收集整理相关的论文列表和展示现存方法性能. 内容整理自网络,源地址:https://github.com/lingluodlut/Chinese-BioN ...
- 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)
https://github.com/mali19064/LSTM-CRF-pytorch-faster 中文分词 说到命名实体抽取,先要了解一下基于字标注的中文分词. 比如一句话 "我爱北 ...
- (转)零基础入门--中文命名实体识别
转自 https://blog.csdn.net/buppt/article/details/81180361 中文分词 说到命名实体抽取,先要了解一下基于字标注的中文分词. 比如一句话 " ...
- 中医门诊电子病历xml文档数据读入数据库实验流程演示
前言: 本次实验老师要求我们用java程序实现,其整个实现流程也满足了老师提出的实验要求.由于绝大部分都是在课堂上完成的,写得有误的地方还请大家包涵. 1.下载所需的jar包并通过项目Build Pa ...
- ELMO实战-命名实体识别
ELMO模型实战-命名实体识别 数据处理 import numpy as np import torch import os# shared global variables to be import ...
- 使用电子签章确立在线医疗电子病历的法律地位
确立电子病历的法律地位 防控疫情,普通群众只是居家减少外出,而医务人员只有一个选择,那就是迎难而上,抗击疫情.比较欣慰的是,为减轻医务人员压力,许多互联网平台纷纷开通线上问诊通道.互联网医院,在此次阻 ...
最新文章
- 区块链中的智能合约是什么?
- Navicat数据库非常实用的技巧 (create_time、edit_time 设置默认值和自动更新)
- cesium 页面截图_Cesium开发入门篇 | 02开发环境搭建及第一个示例
- input 关闭输入法
- opencv-api convexHull
- 中国智能硬件创新产业发展分析2017
- centos 7 64位虚机上android4环境运行
- MATLAB学习——Matlab系统环境介绍
- java pingfang,PingFang sc字体的使用
- android+6.0中兴v5s,中兴v5s
- wps怎么自动生成目录?2分钟完成
- css的外链写法,纯CSS代码为外链增加图标
- 那些不正经的前端笔试题
- 牛客练习赛107 A~D除C
- 常用的python读写函数
- 查看系统架构是32位还是64位--用Enki学Linux系列(15)
- 看片会员php源码,会员碎片 · THINKPHP插件 · 看云
- EPLAN 接线端子
- 计算机网络--数据链路层[微课堂]
- IDEA新建项目卡在下载Resolving dependencies of xxx
热门文章
- java中间==、equals和hashCode差额
- Parts of a URL
- LeetCode每日一题——剑指 Offer 10- I. 斐波那契数列
- BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
- 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
- Linux学习笔记(1)linux的开关机及重启
- Python学习笔记(matplotlib篇)--多图figure
- [模板]01分数规划
- Centos 7 修改时区
- linux学习: sudo命令(ubuntu)