周昊林,王 梅
(东华大学计算机科学与技术学院,上海 201620)
随着社会经济的发展,在生活水平与质量不断提高的同时,人们也越来越关注自身的健康,并且希望能够获得便捷且高质量的医疗服务[1]。伴随着移动医疗技术的快速发展,一定程度上也促进了社会医疗体系的进步[2],同时移动设备的便携性也成为了移动医疗推广和发展的重要抓手,患者通过移动设备能够快速的完成挂号、智能导诊等需求,使得就诊效率大幅度提升[3]。
从患者的角度而言,虽然医师会给予患者如何用药的医嘱,然而由于患者依从性较低所导致治疗失败或者疗效不尽人意的情况仍然时有发生。患者用药的不依从性主要表现为:用药时间错误、漏服、过早停药、服药剂量错误、随意换药等。产生不依从性的首要原因就是在患者自主用药的过程中没有得到及时的提示或指导。而相对于医生以及研究者而言,联合用药分析对于保证医疗质量有着重要意义[4]。然而,患者的实际用药信息对于医院来说很难跟踪获取。在医院一方开完处方药之后,病人在回去之后坚持服用多久、服用时间是否合理、如何去吃、是否同时服用别的途径获取的别的药物,上述信息对于医院都难以准确获得,从而为联合用药分析带来难度。而若能够将移动医疗的便携性和以上问题结合,则既能够协助患者规范用药,提高患者的用药依从性;又能够对用药信息进行采集,为医生和研究者打下用药分析的基础。
针对上述问题,本文提出并实现了集用药信息采集、规范患者用药于一体的原型 App,包括对于患者处方信息的录入、用药提醒、用药信息的采集与上传等功能,并且在用药提醒功能中,为了解决冲突药品之间的安全服用时间规划问题,本文提出了一种基于贪心和分治思想的安全时间段规划算法。从而实现了以规范和监督的方式提高患者的用药依从性,同时为联合用药分析提供了有效的数据采集渠道。
近年来,AI诊疗模型结合智慧医疗、移动医疗的应用形式日渐多样化,例如针对临床决策支持的辅助诊疗系统、针对临床诊疗数据分析的医疗服务平台等。Stoner等人[5]对76名参与者进行随机对照实验,评估移动医疗应用程序的干预对于酒精滥用者的纳曲酮药物依从性的影响,发现移动医疗能够一定程度上提高患者的药物依从性。张世宇等人[6]在 Android平台开发的辅助诊疗系统则主要通过药品相关信息查询结合医院信息管理系统的挂号、电子病历阅读、查看检验报告等功能实现了移动平台和医院信息管理系统的结合。现有工作主要关注于辅助决策或是诊疗相关服务,而对于患者用药的监督与规范的相关工作较少。
移动医疗,指通过移动便携设备为诊疗提供服务与支持,实现的主要形式为基于Android、IOS等系统的手机应用APP,是传统医疗技术的补充与延伸[7]。在系统实现上,本文基于 Android采用 MVP架构模式[8]进行开发,设计并实现原型APP,从而实现对患者的用药信息采集以及规范监督用药。
系统总体框架图如图 1所示。系统采用 C/S模式进行通信,服务器端保存知识图谱,并维护服务器数据库。客户端包括处方录入模块、用药提醒模块以及信息管理模块。同时,在客户端维护本地SQLite数据库,保存当前患者的处方及药品信息等。
图1 系统框架图Fig.1 Sy stem framework diagram
为满足用药信息采集、规范患者用药的目标,App客户端通过处方单拍照或是手动输入的形式添加处方,处方录入模块借助OCR对处方图片的内容进行识别,通过对识别结果中带有相对位置信息的文字进行解析,筛选出处方中包含的药品信息,并对药品信息进行保存。用药提醒模块包括用药成分分析和安全时间段规划两部分。用药成分分析,通过调用知识图谱,发现已录入药品成分之间的药物过量或相互作用关系,对上述问题进行自动检测并提醒。根据提醒并确认后的药物信息更新待规划药品集。安全时间段规划,根据待规划药品集中各药物的服用约束条件,建立规划算法,对所有用药时间段进行规划,得到可行的安全用药时间段,并设置用药提醒。同时,系统设计了用药反馈功能,采集用户在安全时间段内是否用药的信息。信息管理模块提供信息上传服务器功能。服务端,主要提供知识图谱的存储以及用于保存用药反馈信息的数据库,便于后期进行联合用药分析,并提供外部访问数据接口。
本文知识图谱主要用于分析药品成分及建立服药约束,接下来将对图谱的构建流程进行介绍。
本文选择基于药品的说明书对所需信息进行抽取以构建图谱。考虑到网站的爬取难度、药品种类是否齐全以及网站布局的复杂性等等,本文选择对“药智网”的药品说明书数据库、药物相互作用数据库进行爬取。对爬取的结果以表格标签的形式使用Xpath进行遍历,可得到结构化数据并保存于关系型数据库中,共包含27380条药品说明书数据、3984条相互作用数据。
进一步使用汉语言处理工具HanLP结合正则表达式来对其中的药品名、药品成分、适应症,相互作用关系进行实体抽取以及关系抽取[9]。实体包括:药品、疾病、成分,这些实体即为知识图谱中的结点。关系则包括:适用于、包含、有相互作用,这些关系则作为图谱中的边,从而连接各个实体结点。用于药品实体结点的描述信息的属性包括:用法用量、注意事项、禁忌、不良反应、孕妇及老年人用药。
由于来自不同厂家生产的同一种药品可能采取不同命名,如:“康多宁米氮平片”、“米氮平片”,导致数据库中的药品实体存在冗余,因此本文通过遍历同一个疾病适用的所有药品,判断两两药品实体的药品名字符串是否为二者其一的子集来确定是否是同一种药品,根据经过筛选后的药品建立最终的药品实体。图谱的结构示意图如图 2所示。
图2 知识图谱结构图Fig.2 Knowledge graph structure diagram
用户可以选择直接对处方进行拍照或者是从相册选择处方照片进行识别,或是选择手动填表的方式完成表单中药品的添加。文中使用的OCR识别技术来自于百度提供的 OCR通用票据识别Api。通过对返回的 json数据进行解析,能够获得图片中所有文字信息的文本内容,内容所占的大小,以及内容在整张图片的相对坐标位置。然而,由于实际拍取的处方照片可能存在照片方向与文字内容不能保证水平的问题,由按行生成的绝对位置坐标关联表中字段内容实际会导致字段错位等问题。
为解决上述问题,本文选择建立相对参照点的方式,分别选取了处方左上和右下对角线处的两个标志性文字作为参照点,根据两个参照点的坐标计算矩形区域,将识别结果中的所有元素在矩形区域中的相对坐标进行筛选,从而使得识别范围仅限定在包含药品信息的部分,同时关联得到的药品名、服药信息等字段保证一致性。
2.3.1 用药合理性分析
由于患者可能会通过多种渠道获取药品,如从不同医院获取或自购,此时可能会出现不同药品中含有的相同成分超标或发生相互作用。为此,在进行服药规划和提醒前,首先要进行用药合理性审查。主要包括两部分:会发生相互作用的药品、含有相同成分的药品。通过 Neo4j所支持的Cypher语句查询此前构建的药品知识图谱,能够快速地查询到所需要的药品关系,例如:
(1)查询两个药品 A、B之间是否存在冲突关系:
(2)查询两个药品A、B之间含有的相同成分:
上述查询方式能够快速定位到指定的两个药品之间是否存在相互作用或是药物成分过量的情况。因此,依次遍历新添加的药品和处方表中已有药品,并依次对相互作用和过量的查询结果进行判断,并生成待规划药品集。没有相互作用和过量的则无需规划。
2.3.2 安全时间段规划算法
通常而言,对于给定单一药品,患者每次服药在一个时间段内均是合理的。例如,一日两次与一日三次的药品常见时间段为:
然而,若这两种药物同时服用,且服用的两种药之间存在冲突,则其服用时间需满足间隔至少两小时的约束条件。此时,按照单一药品服用的常见时间段进行服用就可能出现问题,很明显,其服用时间段存在重合,不满足约束条件。因此,需要对可服用药品集中的药品时间根据约束条件进行规划。具体方法如下所示。
首先,定义如下变量:
T:表示时间段,以Ts,Te来表示时间段的起始时间点和结束时间点,则一个时间段T可以表示为:[Ts,Te];给定患者的待规划药品集合D={d1,d2,d3,…,dw}。药品集合D对应的时间段集合记作M={m1,m2,m3,…,mw},mi为第i个药品常见时间段的集合。mi的大小和药品的服用方式相关,若第i个药品为一日三次的药品,则mi包含3个时间段。令mi={mi1,mi2,mij,…},其中mij代表第i个药品的第j个服用时间段,则有mij=[Ts,Te],也可以表示为mij=[Tijs,Tije]。
对于药品集合中的多个冲突药品进行时间段的生成,本文采用归并调整的方法,先将各药品默认服药时间段存入列表 TimePartList中,进而进行递归划分,划分为每个集合仅包含一个药品的服用时间段后开始从下而上两两调整。
首先进行算法开始前准备。对M集合中每个时间段mij进行封装。为每个mij添加其与药品对应的标记、类型标记后建立TimePart结构。其中药品信息标记用于在经过算法调整过后的新时间段能够对应到药品信息;临时类型标记用于标识该时间段与其他时间段是否冲突,生成 TimePart结构。初始化TimePartArray为单个药品对应的所有TimePart。将所有的TimePartArray存入待归并列表TimePartList结构变量T_list,调用MergeList算法开始自上而下递归调整。Mergelist算法如算法1所示。
算法1:MergeList
Input:TimepartList T_list
Output:TimePartList result_list
TimeResize对冲突的时间段进行具体调整,其算法过程如下所示。
(1)将输入的两个 TimePartArray中的所有TimePart变量置入同一个临时Array;
(2)对临时Array中的所有TimePart元素进行排序,排序的规则是优先判断TimePart起始时间的先后,若起始时间相同再判断结束时间的先后,最终得到一个有序的临时Array,此时这个临时集合中包含,两种不同的临时标记 Temp的时间段;
(3)对临时 Array从前向后进行遍历,步长为1,循环过程中依次对Array中位置相邻的左右两个 TimePart的 Temp标记进行判断,若 Temp相同,则不进行进一步操作,跳过;若 Temp相同,则对这两个TimePart进行调整,通过缩短冲突药品服药的可行时间段,使两个时间段之间的间隙达到约束条件,即 Tijs与Ti-1js的时间相差 2小时;具体调整时,若冲突时间段有重合,则分别缩短;若无重合,则优先缩短较长的时间段;
(4)最终临时Array经过一遍循环后,Array中的所有 TimePart均被调整为不会冲突的时间段,并在TimeResize过程结束后将Temp标记统一为相同值。
其中TimeResize的具体算法如算法2所示。
算法2:TimeResize
输入:TimePartArray A,TimePartArray B
输出:TimePartArray T
2.3.3 用药提醒
在安全时间段规划算法得到各药品的安全时间段后,首先对各药品所对应的时间段进行持久化存储,再进一步通过AlarmManager服务设定广播时间点,通过指定时间的广播来唤醒指定的提醒页面,同时每一次更新服用提醒时间都保证在其对应的安全时间段内,从而完成自动设置提醒;而每次提醒时提供给用户两个选项:完成用药和推迟10分钟提醒,同时在当前时间未到达设定时间段或是当前时间不足以在设定时间段内推迟10分钟时,均会将对应选项变灰且不可选中,并给与相应的警告提示。
用药反馈的记录即为通过判断用户每次用药的完成时间点是否仍然处于设定的安全时间段内,若处于则记录为一次安全用药,反之则记作一次不安全用药,并保存至用药反馈表中,当疗程结束后,就能够得到所使用药品的用药反馈时间序列数据,以用于研究人员的用药分析。
信息管理模块主要提供用户上传、删除所记录的用户用药信息的功能。App通过对服务端的指定接口进行网络请求,将用户的药品信息数据、用药反馈数据组织为json类型的数据,并以网络请求的方式传递数据来实现上传、删除功能。
本文的原型App为基于Android7.0编写的原生Android应用,采用MVP架构进行开发,涉及的主要组件和相关技术包括 Retrofit2[10]、ButterKnife、LitePal、以及百度OCR识别Api等。下图为本文原型 App的总体架构设计图,其中MVP架构即为如下View、Model、Presenter的分层结构。
View层的内容即为用户可见的界面,包括处方管理、用药提醒、信息管理模块的各个页面的Activity,当用户在这些界面中进行添加处方、查看提醒等操作时,会通过其对应的Presenter实例执行相应的业务逻辑,由 Presenter层作为 View层和Model层沟通的中介,承载应用的业务逻辑;View层的更新也通过 Presenter来通知,Model层只负责和数据获取相关的逻辑。除此之外,对于服务端数据的操作与访问,也由Presenter层对应的对象来负责向服务端传输、请求数据;而服务端返回的数据则交由Model层进行处理。
图3 系统总体架构设计Fig.3 Overall system architecture design
假设给定的药品均为相互冲突的药品,表 1总结了实验中出现的所有药品类型,它们包含的服用方式以及常见的服用时段如表2所示。
表1 一日两次与一日三次药品的常见用药时间段Tab.1 Common dosing periods for twice-daily versus thrice-daily medicines
表2 药品服用方式与其默认常见时间段Tab.2 Medication administration methods and default time periods
对于实验场景的设置,本文将以数字组合指代所设计场景中给出的药品服用方式,即以数字1、2、3代表三种服用方式,同时数字的排列方式为升序,例如场景[223]表示待规划的药品包括{一日两次、一日两次、一日三次}。
由于实际临床诊疗中的同一位患者在安排用药时的冲突药品不会过多,因此在实验中本文仅对同时包含四种冲突药品以内的场景进行规划,则在将四种药品经过排列组合并且去重后分别得到所有的场景,并分为三类场景,如表3所示。
表3 所有无重复的用药场景Tab.3 All unduplicated medication scenarios
在排除掉不可能保证两小时间隔的条件的场景以及过于简单后,本文在表中每一类场景均选出2个在复杂性和实用性上均较为典型的场景进行展示与分析。
将 6个用药场景使用本文的规划算法获取安全时间段,6个场景的规划前以及规划后时间段如图4所示。
图4 六种实验设置的初始时间段与结果Fig.4 Initial time periods and results for the six experimental setups
在测试中,本文从运行时间以及占用内存对算法进行评估,其中对同一个场景进行多次实验并将统计结果取平均值,得到的统计结果如表4所示。
表4 实验运行时间以及内存消耗的统计Tab.4 Experimental runtime and memory consumption statistics
从测试结果中可以看出,以上场景的实验中算法的运行时间均在22 ms~26 ms之间,并且内存消耗也仅在67 mb~70 mb之间波动,能够取得较快的运行速度以及较低的资源消耗。上述实验结果表明,本文提出的算法结合移动平台App能够对患者的用药规范提供监督作用,具有一定的实用意义。
本文提出并实现了集用药信息采集、规范患者用药于一体的原型 App,包括对于患者处方信息的录入、用药提醒、用药信息的采集与上传等功能,并在用药提醒功能中,为了解决冲突药品之间的安全服用时间规划问题,提出了一种基于贪心和分治思想的安全时间段规划算法。从而以规范和监督的方式提高了患者的用药依从性,为临床治疗效果提供保障;同时为联合用药分析提供了有效的数据采集渠道。目前,本文提出的原型系统与算法仍尚有不足,如系统尚未对用药采集后续的联合用药分析提供相关功能,安全时间段规划算法的效率和流程还存在改进的空间。接下来的研究中,将会关注联合用药的分析和安全时间段规划的改进,并进一步优化系统的功能与性能。