法律状态公告日
法律状态信息
法律状态
2022-06-28
公开
发明专利申请公布
技术领域
本发明涉及人工智能领域,具体涉及一种基于患者症状描述文本的疾病分类智能服务方法。
背景技术
随着我国人口老龄化程度的加剧,越来越多的人更加关注自己的健康情况;但是我国医疗资源配置并不均衡,许多病人为了确定自己所患的疾病通常需要花费很大的代价。
目前医生大多是通过询问病人所具有的临床症状表现,并结合专业知识、临床经验和医疗器械诊断来判定病人可能患有的疾病;当所挂科室的医生不擅长临床症状所属的领域会导致病人需要重新挂其它科室或医院的号。因此,根据症状描述文本来自动化地推断病人所患疾病,可以帮助患者判断选择就诊医院或科室,极大提高治疗疾病的效率。
自动问诊系统将医疗领域知识和计算机科学技术结合,为患者进行疾病诊断。为了实现疾病的自动诊断,需要利用计算机将疾病和症状进行数据化规范化处理,同时也需要挖掘分析症状与疾病的关系,并利用计算机语言建模与表达。
知识图谱已经成功计算机科学的一个重要分支,在自然语言处理、信息检索、数据挖掘、人工智能和大数据等领域具有重要的应用,并且得到了研究者的广泛认同。
知识图谱使用节点代表实体与概念,边代表节点间的关系,进而表示知识之间的逻辑关系。利用疾病数据集构建医疗领域知识图谱,可以形式化的描述疾病与症状之间存在的关系,在医疗领域知识图谱中上层的症状表达了疾病之间的共性,下层的症状表达了疾病之间的差异性。
医生将各类疾病信息在大脑中归纳、分类、思考和判断来得到最终结果,这是一种心理过程,与“人工智能”类似,也属于“黑箱”过程。近期,已有很多方法试图用深度神经网络描述这一过程。然而,训练深度神经网络模型需要大量的标注数据,需要耗费大量时间和人力。
一种新思路是在实际应用中逐渐积累数据,模型逐步迭代升级,又因为模型与知识图谱、数据集的耦合度高,迭代的部署和运行成本高,阻碍了其在实际中的应用。
发明内容
本发明公开了一种基于患者症状描述文本的疾病分类智能服务方法,基于微服务框架,结合AC自动机和深度模型进行医疗实体识别,引入数据增强机制,实现了面向自然语言疾病智能识别方法的有效实施,提高了识别结果准确率,减少了标注数据需求量,有效降低了部署和运行的成本,对其在集群平台的部署应用有重要意义。
所述基于患者症状描述文本的疾病分类智能服务方法,分以下步骤:
步骤一、从已有的医疗领域相关数据中提取患者症状的描述语句,并从语句中提取实体,标注各实体类型,将语句和实体类型标注结果组成样本,存储到NoSQL图形数据库;
实体包括医院、科室、疾病、症状和药品等类别;各实体分别具有自身的属性;
样本S=
步骤二、将各样本分别通过生成器,生成新的样本,并对应生成新语句以及语句中各实体的类型标注;
生成器是根据原样本中各实体的类型标注,进行词语替换,自动生成同等类型的新样本。
步骤三、针对样本S生成的每个新样本S',使用包含可用性规则的检查器逐个计算两者的最小编辑距离,得到各新样本的分数,降序排列后选择前K个新样本加入已标注数据集。
K的取值根据实际实验数据取值,K大于等于3。
步骤四、构建实体识别微服务,将实际患者的症状描述文本输入实体识别微服务,输出实体的识别结果。
实体识别微服务包括构造AC自动机和搭建BiLSTM+CRF模型架构作为深度模型;
AC自动机使用NoSQL图形数据库的所有实体构造Trie树,进一步在Trie树上构建失配指针;对经过预处理的患者的中文症状描述文本进行关键词匹配,找到语句中出现的医疗实体识别结果,即实体位置、名称和类型;
深度模型依次包括第一层嵌入层,将患者输入的实际描述文本转换成词向量矩阵;第二层BiLSTM层,接收嵌入层输入的词向量矩阵,通过前向LSTM和反向LSTM得到的两组输出进行拼接,然后依次经过dropout层、ReLU层和omit层,最终得到输出的特征向量;第三层CRF层,接收BiLSTM层输出的特征向量,使用CRF模型得到患者输入的实际描述文本中每个字的实体类型标注,进而得到医疗实体识别结果;
最后,通过实体识别微服务接口,将AC自动机和深度模型分别得到的实体识别结果合并;对识别结果相同的直接合并;对于识别结果有冲突的,按照深度模型的置信度进行判断,当深度模型的置信度大于等于阈值,则保留深度模型的结果;当置信度低于阈值,则保留AC自动机的结果,作为最终结果。
步骤五、构建疾病查询微服务,根据实际患者的实体识别结果,在NoSQL图形数据库中查询与实体相关的疾病并排序,作为候选疾病结果输出;
具体过程如下:
首先,输入实体识别结果,使用SQL查询语句在NoSQL图形数据库中进行查询;
然后,分别提取查询结果中各实体相关疾病对应的症状描述语句结果,逐一与实际患者输入的症状描述文本计算相似度。
最后、按相似度由高到低顺序依次返回候选疾病名称。
步骤六、构建用户交互微服务,将患者的实体识别结果,候选疾病结果,并上患者的历史健康数据打包返给患者。
本发明一种基于患者症状描述文本的疾病分类智能服务方法,优点在于:
(1)本发明通过生成器增强了数据,在标注条件有限的情况下,提高已有标注数据的使用效率。
(2)本发明通过构建AC自动机和深度模型进行医疗实体识别,兼顾了自然语言中的歧义分析,提高了医疗实体识别的准确率,用户体验和疾病诊断的准确率。
(3)本发明使用微服务架构,降低了疾病分类智能服务的耦合度;各个功能性微服务相对独立,可以分别部署与更新,降低了运维成本,方便了后续增加数据标注、更新实体识别模型、完善知识图谱。
附图说明
图1为本发明一种基于患者症状描述文本的疾病分类智能服务方法的流程图;
图2为本发明BiLSTM+CRF模型的结构示意图;
图3为本发明实体识别微服务接口对输入的自然语言文本采取的处理流程图;
图4为本发明构建的所有微服务之间的调用关系图;
图5为本发明各微服务之间进行交互的流程图。
具体实施方式
下面结合附图和实施例对本发明做进一步的详细说明。
针对患者症状描述文本的疾病自动诊断问题,本发明提出了一种面向微服务架构的疾病分类方法,对于患者的症状描述文本,使用基于AC自动机和BiLstm+CRF的深度模型进行实体识别,并基于实体识别的结果,在知识图谱中查询得到相关候选疾病;进一步使用余弦相似度计算出候选疾病的先后顺序,最终返回给患者。
所述基于患者症状描述文本的疾病分类智能服务方法,如图1所示,分以下步骤:
步骤一、从已有的医疗领域相关数据中提取患者症状的描述语句,并从语句中提取实体,标注各实体类型,将语句和实体类型标注结果组成样本,存储到NoSQL图形数据库并构建知识图谱;
实体包括医院、科室、疾病、症状和药品等类别;各实体分别具有自身的属性,以疾病类别实体为例,其属性包括名称、病症特征等;
样本S=
实体间关系包括科室间的关系、医院和科室的关系、科室和疾病的关系等。
据这些实体与关系,在NoSQL数据库(如Neo4j)中构造医疗领域知识图谱,并对外提供一个通用的数据库查询接口。
步骤二、构建标注管理微服务,将各样本分别通过生成器,生成新的样本,并对应生成新语句以及语句中各实体的类型标注;
获取已标注命名实体的医疗领域文本数据,并对每条数据进行数据增强,对外提供数据获取接口;深度问答模型需要大量标注数据且人工标注成本高,为了解决这些问题,引入了数据增强方法,基于已有标注数据生成更多标注数据,并将原始标注数据和增强数据一起提供给模型进行学习,在同等的人工标注成本下进一步提高模型性能。
数据增强过程具体包括数据生成和检查两个步骤;
本发明通过生成器使得数据增强,基于已有标注数据生成更多标注数据;生成器根据词替换规则,使用原始数据生成新数据;生成器需要输入必要的参数和数据,包括PWS(Percentage of Words to Swap per augmented example,每个生成样本中替换的字符比例)、中文近义词词典(用以搜索可替换的近义词,包括语义近义词词典和嵌入空间近义词词典)。在使用已标注样本生成新样本的过程中,也要同时生成新样本的标注,即每个词语的实体类型。近义词替换不会改变词语的实体类型,因此可以根据原样本的标注和词语替换的记录,自动生成新样本的实体类型标注。
如样本S中,语句X为:我有点发热;实体类型标注Y为:O O O B-Sym E-Sym;
其中,“我”“有”“点”这三个字属于类别O,不是医疗实体,“发”字是症状的开头(Begin-Symptom),“热”字是症状的结尾(End-Symptom);
该样本S生成的新样本S'中,语句X为:我有点头晕;实体类型标注Y为:O O O B-Sym E-Sym;
步骤三、使用包含可用性规则的检查器,对新样本生成的语句进行检查,并保存到已标注数据集中;
检查器包括一些通用的规则,有重复检测(不允许在一个生成样本中多次替换同一个词)、停用词检测(不允许对停用词进行替换);还包括关于医疗场景的可用性规则,有医疗专有名词检测(不允许对原句中的某些医疗专有名词进行替换)。为了获得更高的数据使用效率,需要根据可用性规则为句子打分并排序,每个样本选取排序前K的生成样本加入已标注数据集。
针对样本S生成的每个新样本S',检查器利用可用性规则逐个判断是否可用,将不可用的新样本标记为0分;
对剩下的可用的新样本,利用原始样本S的语句X和生成新样本S'的语句X'的最小编辑距离计算各新样本的分数,并按分数高低进行排序,并选择前K个新样本加入已标注数据集。
K的取值根据实际实验数据取值,本实施例选择K为3。
最小编辑距离是指:字符串A修改为字符串B所需要的最少编辑次数,每次编辑只能增加、删除或修改一个字符。
分数计算公式为:
Score(S,S')=MED(S,S')*Useable(S,S')
MED(S,S')为样本S和新样本S'的编辑距离;Useable(S,S')取值为1或0,当该新样本S'通过了所有可用性检查,该值为1;否则该值为0。
最后,搭建数据获取接口,以微服务形式对外提供Restful API,方便后续调用;该接口利用Flask架构编写,外部可利用GET类型的HTTP请求获取指定数量的<原始样本、增强样本>对。
步骤四、构建实体识别微服务,实现医疗领域命名实体识别功能,将实际患者的症状描述文本输入实体识别微服务,输出实体的识别结果。
实体关键词检索能够保证已知名称医疗实体的准确识别,但容易被自然语言中的歧义干扰。而深度命名实体识别模型可以识别句子的上下文语义,有效进行实体识别,但其依赖大量训练数据,在数据集匮乏时没有很好的性能。
为了提高医疗实体识别的准确率,本发明结合了实体关键词检索和深度命名实体识别模型两种方法,提出的实体识别微服务包括构造AC自动机和搭建BiLSTM+CRF模型架构作为深度模型;
多模态匹配算法AC自动机(Aho-Corasick automation),使用NoSQL图形数据库的所有实体构造Trie树,进一步在Trie树上构建失配指针;
Trie树使用实体名的名称对应的字符串作为节点构建的键,每个节点的键由其在树中的位置决定,而节点的值则指向知识图谱的各实体;当指针指向当前节点匹配失败时,匹配下一节点。使用失配指针可以避免回溯造成的时间浪费。
Tire树中节点结构为:
所述BiLSTM+CRF(Bi-directional Long Short-Term Memory+ConditionalRandom Fields)模型,如图2所示,包括:第一层嵌入(embedding)层,将输入的描述文本转换成词向量矩阵;
词向量矩阵设定最大句子长度max_length,对大于max_length的语句直接截断前max_length个词即可,对小于max_length的语句使用无意义词进行补全,保持所有词向量矩阵大小保持一致。
第二层BiLSTM层,接收嵌入层输入的词向量矩阵,通过前向LSTM和反向LSTM得到的两组输出进行拼接,然后依次经过dropout层(通过随机丢弃部分参数增强鲁棒性)、ReLU层(使用ReLU函数作为激活函数增加模型的拟合度)、omit层(把多维的输出整合为一维特征向量),最终得到输出的特征向量。
ReLU(x)=max(0,x)
第三层CRF层,接收BiLSTM层输出的特征向量,使用CRF模型得到最终的预测结果。
最后一层需要定义损失函数和目标函数,将CRF模型输出的标签序列计算对数极大似然估计作为损失函数,损失函数结果均值的负值作为目标函数。这种设计参考了逻辑回归的目标函数,降低了计算的复杂度,能够减少模型训练的时间与算力成本。
最终,搭建好的BiLSTM+CRF模型,使用标注数据集与接口,根据目标函数和损失函数进行前向传播训练,使用反向传播更新参数,循环多个轮次直至模型收敛。
结合得到的两个模型搭建实体识别微服务接口,利用Flask架构编写,使用GET类型的HTTP报文请求服务;接口内处理流程如图3所示,针对实际患者的中文症状描述文本,首先进行预处理;
预处理包括:半角字符转为全角字符,汉字数字转为阿拉伯数字,大写字母转为小写字母以及繁体中文转为简体中文;
然后,AC自动机对预处理后的症状描述文本进行关键词匹配,找到语句中出现的医疗实体识别结果,即实体的位置、名称和类型;
同时,深度模型对实际患者的中文症状描述文本,依次通过嵌入层、BiLSTM和CRF层,得到语句中每个字的实体类型标注,进而得到医疗实体识别结果,包括实体位置、名称和类型;
最后,通过实体识别微服务接口,将AC自动机和深度模型分别得到的实体识别结果合并:对识别结果相同的直接合并;对于识别结果有冲突的实体,按照深度模型输出的置信度进行判断,当深度模型的置信度大于等于阈值,则保留深度模型的结果;当置信度低于阈值,则保留AC自动机的结果,作为最终结果。
例如,针对样本S中的语句X,输入为:X={x1,x2,x3,x4,x5}=我有点发热;输出为:Y={y1,y2,y3,y4,y5}={O O O B-Sym E-Sym}。
步骤五、构建疾病查询微服务,根据实际患者的实体识别结果,在NoSQL图形数据库中查询与实体相关的疾病并排序,作为候选疾病结果输出;
具体过程如下:
首先,输入实体识别结果,使用SQL查询语句在NoSQL图形数据库中进行查询,找到与各实体相关的疾病;
然后,分别提取查询结果中各疾病对应的症状描述语句,逐一与实际患者输入的症状描述文本计算相似度。
相似度计算方法为:
对输入的两段文本,分别利用深度模型计算文本中所有单词的词嵌入平均值,得到两个向量
然后计算这两个向量之间的余弦相似度S
得到的结果越大,相似度越高。
词嵌入为BiLSTM+CRF模型中的Embedding层的输出结果。
最后、利用Flask架构编写调用框架,按相似度由高到低顺序依次返回各症状描述语句。
步骤六、构建用户交互微服务,将患者的实体识别结果,候选疾病结果,并集上患者的历史健康数据打包返给患者。
在此为了满足微服务的轻量级使用场景,服务端不存储用户在多轮问答中产生的特征数据,而是每次根据调用时传入的历史数据并入新的医疗实体,并把本次模型抽取出的特征数据附在网络请求中返回。
特征数据可能包括抽取出来的患者症状、问答中抽取出来的患者历史健康数据等。流程图如图5所示。
具体过程如下:
首先、解析传入的数据,包括历史特征和用户本轮输入的自然语言文本;然后,调用实体识别微服务,传入输入的自然语言文本,获得对话中的医疗实体。
接着、把新产生的医疗实体和历史数据取并集,作为输入调用疾病查询微服务,得到按照相关性由高到低排序的一组候选疾病。
最后、打包好本次调用中抽取出的患者特征信息(即识别到的医疗实体),作为本轮次产生的历史信息,和输出的候选疾病共同打包,返回给服务的调用者。
实体包含患者症状、历史健康数据等。
本发明利用微服务架构,部署组成疾病分类智能服务的多个微服务;首先,把构建的微服务使用docker工具打包为镜像,使用Kubernetes(K8s)容器编排引擎来部署与维护装载镜像的容器(pod),按照K8s的规则编写yaml格式的配置文件,在K8s集群中导入配置文件进行系统自动化部署;
配置文件包括:配置每个微服务的pod数、服务主机、端口号、访问权限和挂载存储等信息;其中Chart.yaml主要配置了服务的名称、描述和版本号等信息;Values.yaml负责配置pod数、使用镜像、服务主机、端口号、访问权限、挂载存储和节点选择等信息。
如图4所示,本发明共有5个微服务组成,负责的功能分别为:
1)用户交互微服务:作为整个系统对外的接口,负责接收用户患者的输入,调用其它模块得到可能的疾病信息,并输出给用户。
2)实体识别微服务:用于识别医疗实体,使用训练好的机器学习模型,对输入的自然语言进行医疗实体标注并输出。
3)标注管理微服务:负责标注数据存取与增强,并对外提供训练模型需要的已标注数据。
4)疾病查询微服务:根据实体识别结果,在知识图谱中进行疾病查询,并对可能的多个疾病打分并排序,对外提供查询接口。
5)知识图谱微服务:使用NoSQL数据库存储系统需要的医疗领域知识,对外提供数据检索接口。
上述各微服务之间使用Restful API进行交互,同时整个系统也作为一个微服务,对外提供一个API接口,供用户调用。用户通过API接口调用本系统的服务并传入参数(包括自然语言描述、可选的历史诊断信息),微服务1)负责对传入参数的解析,调用微服务2)得到命名实体识别结果,然后使用实体识别结果调用4)查询相关疾病,对多个可能疾病进行打分排序,然后把结果输出给用户。2)中模型的训练与更新依赖微服务3)中的数据;4)中的查询与排序依赖于5)中的知识图谱。
使用微服务架构,使得各个功能相对独立的模块可以分别部署与更新,在后续增加数据标注、更新实体识别模型、完善知识图谱、优化系统回复等更新升级时,可以独立的升级对应的模块,只要保证单个模块暴露的API不变即可。