第1页共6页电子病历结构化模型分析与设计杨泽辉①刘长春①①东莞市长安医院计算机中心,523850,广东省东莞市长安镇长青街南路171号摘要本文探讨结构化电子病历中模板设计思想,该模型通过不同层次对象的组合来构成病历,能适应各种病历的结构化处理,病历数据结构化程度高、数据粒度细。该模型将提高医生的工作效率和病历质量,为临床科研和数据分析提供了有效的手段。关键词电子病历结构化数据元数据模板XML1概述病历是诊疗工作中形成的文字、符号、图表、影像、切片等资料的总和。它是医务人员通过问诊、查体、实验室及器械检查、诊断、治疗、护理等医疗活动获得有关资料,并进行归纳、分析、整理形成的医疗工作记录。反映了疾病的全过程、是临床医师进行正确诊断、抉择治疗和指定预防措施的科学依据。病历即反映医院管理、医疗质量和业务水平,也是临床教学、科研和信息管理的重要资料;同时也是考核医务人员医德、评价医疗服务质量、医院工作绩效的主要依据。病历是具有法律效力的医疗文件[1]。医疗卫生信息系统通常应用于四个层次:个人层次,如医生、护士和病人;临床机构、门诊部或社区医疗;医疗保建机构层次;区域性层次(国家、州或省)。病人数据可以在同一层次的不同医疗卫生人员或单位之间进行交流,如在不同的全科医生之间交换,也可以在处于不同层次的医疗卫生人员或单位之间进行交换,病人数据从全科医生传输到国家机构。病人可以从电子病历数据中受益[2]。2结构化分析首先我们可以明确一点:病历是可以结构化是这个方案的前提。我们从自由文本开始分析,先看一段摘录心血管内科病人入院记录纸张病历资料[3]。主诉:反复发作胸闷、胸痛3个月。现病史:3个月前夜晚入睡前,突觉右上肢乏力伴麻木,胸骨后剧烈压榨性疼痛、伴有气紧、头昏、四肢无力、冷汗,无放射痛,常常持续1小时,无诱因,卧床休息后自动缓解。服用“速效救心丸”有所缓解。过去史:10年前咳嗽,咯痰,于当地诊断为“气管炎”,处理不祥。多年来病情稳定,半月前因颈部疼痛于当地诊断为“颈椎骨质增生”,未处理。曾有磺胺、环丙沙星过敏史,分别表现为全身水疱、手抖。无手术、外伤史,预防接种史不详,否认肝炎、结核史。初步诊断:1、冠心病2、不稳定型心绞痛。病历摘录1心血管内科病人病历我们给这段内容中对了解病历、重建病人情况有关键部分数据字体加粗,为了清楚的显示,在数据之间加上空格,得到如下文档。主诉:反复发作胸闷、胸痛3月。现病史:3个月前夜晚入睡前突觉右上肢乏力伴麻木,继而胸闷、胸骨后剧烈压榨性疼痛、伴有气紧、头昏、四肢无力、冷汗,无放射痛,常常第2页共6页持续1小时,无诱因,卧床休息后自动缓解。服用“速效救心丸”有所缓解。既往史:2年前咳嗽,咯痰,于当地诊断为“气管炎”,处理不祥。多年来病情稳定,半月前因颈部疼痛于当地诊断为“颈椎骨质增生”,未处理。曾有磺胺、环丙沙星过敏史,分别表现为全身水疱、手抖。无手术、外伤史,预防接种史不详,否认肝炎、结核史。初步诊断:1、冠心病2、不稳定型心绞痛。病历摘录2对关键数据项标识后。从病历摘录2可知有意义的数据占了这段文字的大部分。除此之外是些连接词、修饰词,只是为了组成通顺的语句才存在的,这也反映了病历文档的一个特点:所有数据都是医生对病人真实情况的客观记录,所记录的内容都是实实在在的,经过分析和综合判断,以医学术语为基础结合临床理论知识表达出来,使病历能够真实地再现病人的疾病发生、发展和演变的全过程。正因为这样,病历文件的内容类似于说明文,其语句都是普通陈述句,语法结构固定,大量使用精练的短语。现在有意义的数据已经标识出来了,那么在做数据分析的时候,需要怎样使用这些数据呢,比如,如果需要查询“入院时胸痛超过1月的病人”,我们就可以在入院记录的主诉中查询数据,可能只得到一部分数据,并且可能包含错误的数据。因为在这个查询操作中实际隐含着另外两个操作:一是在主诉中能找到“疼痛”的部位是“胸骨后”,并且持续时间超过‘1月’“这样的关系;二是疾病持续时间的表达方式多种多样,必须换算成统一单位的值与才能进行比较,首先解决如何找出数据间的联系,然后再解决时间换算的方法。在查阅了病历书写规范的基础上,分析了实际病历以后,我们可以发现医生在书写病历的时候并不是随意的记录,基本上是把和某种密切相关的数据放在同一句或相邻的几句中。病历中每一部分书写重点就是明确要求,并且是按照临床不同的专科分别定义,比如,对于心血管内科入院记录中现病史要求记录的重点如下:①胸痛②心悸③呼吸困难④水肿⑤头晕、晕厥或间歇性跛行等⑥近期用药情况⑦心血管介入治疗的情况。根据规范,我们可以得到类似病历摘录3的现病史模板。现病史:{此处填写胸痛情况描述}.{此处填写心悸情况描述}。{此处填满写呼吸困难情况描述}。{此处填写水肿情况描述}。{此处填写头晕、晕厥或间歇性跛行情况描述}。{此处填写用药情况描述}。{此处填写心血管介入治疗情况描述}。病历摘录3按病历规范设计的现病史模板。到现在为止,这段病历内容的基本结构以及包含的有意义的数据项已被明确标识,如果还能知道每个数据项的具体含义,这段内容的结构化处理就完成了,以示例中现病史的胸痛描述进行说明,说明内容以斜体字放于括号中。现病史:患者在3个月前夜晚入睡前(开始发病时间),突觉右上肢乏力伴麻木(伴随症状),胸骨后(部位)剧烈(发作程度)压榨性疼痛(性质)、伴有气紧、头昏、四肢无力、冷汗(伴随症状),无放射痛(放射部位)、常常持续1小时(持续时间),无诱因(诱因),卧床休息后自动缓解(疼痛缓解方法)。病历摘录4:对胸痛描述中的数据项进行解析。第3页共6页在病历规范中说明了病历各部分的书写重点,也列出了每个重点应该包含的数据。以现病史中的胸痛描述为例,规范中要求的数据是这样的“胸痛:开始发病的时间、部位、性质、程度、持续时间、发作程度、放射部位、与活动及体位的关系、引疼痛的诱因及缓解方法;有无头晕、晕厥或间歇性跛行等“[4].与病历摘录4的数据项对比就会发现规范中要求的数据在病历中基本上都出现了。可以这样理解病历内容:一些数据项按照规范要求组合在一起,构成了一段描述特定内容的语句,语句组合在一起形成了病历。对这个思路进行延伸,提出了以对象组合的方式对病历进行结构化。定义模板是电子病历系统的应用中有一项重要的工作,病历输入的过程是基于模板进行的,所以,前面的分析过程实际上是考虑如何得到适用于特定疾病的模板。本文中的示例是心血管内科的病历,在现病史中有胸痛的描述,不是只有心血管内科的病历才会出现胸痛的描述。但是不同的病人中有关胸痛的描述内容基本一致,就需要不同结构的胸痛描述语句。如果每种情况都新建一种胸痛描述方式,病历模板的设计工作量显然就增加了,要是胸痛的描述要求发生了变化,修改起来也较麻烦。若采用组合的方法就可以很好的解决这样的问题。再对病历中的数据项进行分析,我们就会发现类似的情况,比如疾病诊断、解剖部位等数据项可以出现在不同的描述语句中。图1分解的病历模型如图1所示病历被分解为多层次结构,每一层的对象都是上下一层对象按一定规则组合而成。最上层病历模板,嵌入式对象就是描述某一具体内容的一段话,元数据对象是构成描述内容的最小单位,原子对象是不可再分的录入单位。现在处理思路是由词构成短语,短语组成句子,最后形成病历。为了实现更复杂的功能,能够进行灵活的控制,在模型设计中引入面向对象的一些设计思想。以这种方式组合病历能保证在临床上含义相同的概念基础结构只有一种形式,减少数据重复。在这个模型里最重要的处理是对嵌入式对象的分解,病历中的每一句话通过两层对象来构成。这样做的目的有两个:一是为了让病历数据的粒度尽可能的小,数据挖掘深度越深;二是为了满足病历显示和打印的要求。第二个目的实际上是第4页共6页针对其它结构化方式中存在问题而提出解决方案。现在我们要解决的就是如何将已有的数据项拼成一句话,让它看起来和人书写的一样,不幸的是没有简单的方法可以让计算机将这些数据项自动组合成通顺的语句,句子如何组织最好还是由人来决定。基于这种考虑,尽可能的减少对医生修改操作的限制,让医生以期习惯的方式书写病历。我们对示例数据按这个模型行分解,分析病历的时候,我们根据上下文将有意义的数据项标识出来,如果把这些数据项从病历中挖掉,那病历书写过程就变成从零开始,需要医生根据上下文及病人情况将数据填写到对应的位置。假设我们将语句设计的很好,医生一看就明白在何处填写何种数据,那医生的工作量就可以减轻很多。我们以生成胸痛描述模板为例进行分析。病历规范中要求“胸痛”的描述中应包含的内容,如表格1所示。表1病历规范中要求胸痛描述包含的内容开始发病的时间部位性质持续时间放射部位与活动及体位的关系发作频度伴随症状疼痛的诱因缓解方式如果换成另外一个病人,病情描述可能就不一样了,病人的发病时间可能是“昨天早饭后”,伴随症状可能是“胸闷”。这时我们就发现上面的处理数据粒度不够细,无法进行有效的查询,例如“昨天早饭后”和“3个月前”是没办法直接比较的。对输入的数据进行分析,可以发现部分数据还可以再分解,比如“3个月前”可以看作一个相对时间单位和一个时间修饰词,“伴有气紧、头昏、四肢无力”可以分为三种伴随症状。由此,我们将胸痛描述中的内容再次细分,得到模型中的原子对象。通过这种分解方式,就将文本的差异缩小到一个比较小的范围,这样定义病历模板时就会比较容易。比如“发病时间”的结构定义,现在对它的结构进行拆分,变成“时间值+时间修饰词”的形式就比较容易处理了,“3个月前”就分解成“3个月”和“前”,“昨天早饭后”就分解成“昨天早饭”和“后”。再比如,对于“伴随症状”来讲,症状的数量是不确定的,它应该是列表型数据结构,这样对于记录下来的每一个伴随症状都可以进行查询。按此思路,最终的胸痛描述模板如图所示,每一个元数据都用下划级标识出来[5]。患者在时间值时间修饰,突觉解剖部位乏力伴伴随症状列表,继而症状列表、解剖部位列表后发作程度列表疼痛性质列表疼痛、伴有伴随症状多选列表,无放射痛(放射部位)、常常时间值时间修饰,无诱因列表,缓解方式列表后自动缓解。片段5:最终的胸痛描述模板。如果将各层对象的描述符都放在文本中,处理起来会非常困难,所以应用XML格式保存病历数据。XML在数据的可扩展性、灵活性、可读性、交换性、平台无关性等诸多方面是传统的数据库无法比拟的,也是它在电子病历应用的优势。用XML可以定义描述对象的结构,这适合于病历中不同内容结构的变化[6]。使用XML保存病历数据后,病历编辑器的作用是展现、录入病历,为了提高输入速度、保持病历的结构,除了普通文本外,数据项中的数据实际上并不是在第5页共6页编辑器中编辑的,在需要修改数据项的内容时会加载特定的编辑控件。病历中各种对象本身具有很多属性,比如数值类型、取值范围、缺省值等,但是编辑器在显示病历的时候不需要知道这些属性,在编辑数据时也只要知道当前编辑的是不是特殊对象,如果是就加载对应的编辑控件。因此,可用XML来保存实际的病历数据,需要编辑病历时,先将XML数转换成病历对象,然后再生成合适的数据显示到编辑器中。在编辑器中编辑数据时,都通过病历对象的同步机制同时更新病历对象中的数据和编辑器内容。保存数据时就进行XML数据和病历对象之间的逆转换。如时间处理和单位换算的问题,为了便于做数据分析,在保存数据时就应该完成这些操作。实际的数据和显示的数据是分开的,所以可以很容易的数据转换时实现换算的处理。这样的病历模型对编辑器的要求就比较高,为了协调数据录入和结构化处理的要求,需要使用自定义富文本编辑器。病历对象层次被细分虽然加大程序设计复杂性大,但是对于数据查询分析却有很大的好处,不仅查询粒度变细,最主要可以解决语义相关性问题。在这个模型中进行数据查询时,在选择查询条件的同时也指定了需要查询的数据范围。比如,想以“发病时间在3天前”作为查询条件。这时可以理解成“凡是发病时间在3天前,包含任何病种”,在逻辑上这样的理解没有任何问题,但是在实际情况中是很少发生。相反,如果指明了“在3天前出现胸痛的病人”,那就可以进行查询了。现在的病历模型中首