[0088] 参照说明书附图和具体实施例对本发明的医疗自动问答方法及装置、存储介质、电子设备作以下详细地说明。
[0089] 实施例1:
[0090] 如附图1所示,本发明的医疗自动问答方法,该方法包括如下步骤:
[0091] S1、构建医疗问答知识库:从互联网的医疗问答社区爬取问答对,并对问答对进行预处理构建成医疗问答知识库;
[0092] S2、构建问答模型训练数据集;对于每个医疗问题,在步骤S1中的医疗问答知识库中有两个正确答案,将正确答案与问题构建训练正例,将除正确答案以外的答案与问题构建训练负例;其中,负例的数量根据医疗问答知识库的大小设定;
[0093] S3、构建问答模型:利用卷积神经网络构建问答模型;
[0094] S4、训练问答模型和答案选择:在步骤S2所得到问答模型训练数据集中对步骤S3构建的问题模型进行训练。
[0095] 如附图2所示,步骤S1中构建医疗问答知识库的具体步骤如下:
[0096] S101、利用爬虫技术,从互联网的医疗问答社区爬取问答对:在互联网上有着大量的医疗问答社区,其内容是开放可获取的;医疗问答社区均采用Web形式进行展示,利用Scrapy工具获取问题和所对应的答案,构建问答知识库;
[0097] 医疗问答社区中的问答对示例,如下表所示(将该问题作为示例问题,下面表述中统一称为“示例问题)”:
[0098]
[0099]
[0100] S102、对步骤S101中从互联网的医疗问答社区爬取的问答对进行预处理,主要包括拆分有多个答案的问题以及对问题和答案进行断字处理;
[0101] S10201、拆分有多个答案的问题就是将问题与答案拆分成一一对应的形式,具体来说:医疗问答社区中同一个问题有两个正确答案,将问题与答案拆分成两个问答对;
[0102] 如上述示例问题有两个正确答案,将示例问题与其对应的正确答案拆分为两个问答对,如下表所示:
[0103]
[0104]
[0105] S10202、对问题和答案进行断字处理就是对问题和答案的内容进行断字处理,具体来说:将医疗问答社区中每个问题和答案,以汉字字符为基本单位,将每个字之间用空格分开且保留数字和标点符号。
[0106] 对示例问题进行断字处理,得到“前几天孩子得了病毒性脑炎在医院住了十来天出院了,过了一周去医院复查,血小板计数509偏高,怎么办?孩子现在11个月了。现在吃的药只有双嘧达莫片。请问医生孩子这是怎么了?血小板怎么才能降下来?谢谢!”。
[0107] 如附图3所示,步骤S2中构建问答模型训练数据集的具体步骤如下:
[0108] S201、构建训练正例:将问题与其所对应的正确答案进行组合,构建训练正例,训练正例的形式为:(question,answer,1),其中,question指问题,answer指该问题所对应的正确答案,1表示正例;
[0109] 对上述经常断字处理后的问题及其对应正确答案组合构建训练正例:
[0110] (“前几天孩子得了病毒性脑炎在医院住了十来天出院了,过了一周去医院复查,血小板计数509偏高,怎么办?孩子现在11个月了。现在吃的药只有双嘧达莫片。请问医生孩子这是怎么了?血小板怎么才能降下来?谢谢!”,“你好孩子得了病毒性脑炎在医院住了十几天复查发现血小板计数偏高指导意见:建议你积极接受医院的治疗病毒性脑炎血小板偏高是普遍的现象,除了采取吃药最好进行输液治疗”,1)。
[0111] S202、构建训练负例:在医疗问答知识库中选中步骤S201的问题,再从医疗问答知识库中随机选择除步骤S201以外的问题及其该问题所对应的答案,将步骤S201的问题与随机选择的除步骤S201以外的问题所对应的答案组合,构建训练负例,训练负例的形式为:(question,bad-answer,0),其中,question指问题,bad-answer指随机选择的除步骤S201以外的问题所对应的答案,0表示负例;
[0112] 如:示例问题q1,再从医疗问答知识库中随机选择一个与示例问题q1不同的问题q2,将q1与q2的答案a2组合,可构建训练负例,可形式化为:
[0113] (“前几天孩子得了病毒性脑炎在医院住了十来天出院了,过了一周去医院复查,血小板计数509偏高,怎么办?孩子现在11个月了。现在吃的药只有双嘧达莫片。请问医生孩子这是怎么了?血小板怎么才能降下来?谢谢!”“, 你好,手足口病是一种肠道病毒病,具有肠道病毒感染的共同特征.主要侵犯手,足,口,臀四个部位,口腔溃疡疼痛,患儿流涎拒食.本病经1周后可自愈,一般对症治疗,可应用抗病毒药如阿昔洛韦利巴韦林(三氮唑核苷).中药有大青叶,夏枯草,或导赤散加减.还可以用双黄连口服液,严重的话,是需要到医院检查后治疗的。”,0)。
[0114] S203、构建训练数据集:将步骤S201和步骤S202所的的全部训练正例和训练负例的样本组合,并随机打乱训练正例和训练负例的样本构建最终的训练数据集;其中,训练正例和训练负例均包含三个维度,即question、answer或bad-answer、1或0,前两个维度根据实际包含的词语构建二维的张量表示,第三个维度构建一个向量表示。
[0115] 如:使用vector_question、vector_answer、vector_posneg分别表示训练数据集的问题的向量表示、答案的向量表示、正负例标志的向量表示。假定每个字符用一个embedding_dim维的向量表示,则vector_question和vector_answer的张量维度为word_num×embedding_dim,其中,word_num指question、answer或bad-answer中字符的个数。
[0116] 如附图4所示,步骤S3中构建问答模型的具体步骤如下:
[0117] S301、构建字符映射转换表:根据步骤S1中预处理以后构建的医疗问答知识库,构建字符表,并将字符表中的字符映射为唯一的数字表示,例如可按照字符加入字符表的顺序从1开始依次递增,构建字符映射转换表;
[0118] 以进行断字处理后的示例问题为例,构建字符表及字符映射转换表如下:
[0119]字符 映射 字符 映射 字符 映射 字符 映射 字符 映射
前 1 医 14 小 27 个 40 请 53
几 2 院 15 板 28 月 41 问 54
天 3 住 16 计 29 。 42 生 55
孩 4 十 17 数 30 吃 43 这 56
子 5 来 18 509 31 的 44 是 57
得 6 , 19 偏 32 药 45 才 58
了 7 过 20 高 33 只 46 能 59
病 8 一 21 怎 34 有 47 降 60
毒 9 周 22 么 35 双 48 下 61
性 10 去 23 办 36 嘧 49 谢 62
脑 11 复 24 ? 37 达 50 ! 63
炎 12 查 25 现 38 莫 51
在 13 血 26 11 39 片 52
[0120] S302、构建输入层:输入层包括三个输入内容,从问题对应的训练正例中获取question和answer,从训练负例中获取bad-answer,输入层的形式为(question,answer,bad-answer);再根据步骤S301中得到的字符映射转换表将输入数据中的字符转化为数字表示;
[0121] 示例问题的训练正例和训练负例构建一条输入数据,结果如下:
[0122] (“前几天孩子得了病毒性脑炎在医院住了十来天出院了,过了一周去医院复查,血小板计数509偏高,怎么办?孩子现在11个月了。现在吃的药只有双嘧达莫片。请问医生孩子这是怎么了?血小板怎么才能降下来?谢谢!”,“你好孩子得了病毒性脑炎在医院住了十几天复查发现血小板计数偏高指导意见:建议你积极接受医院的治疗病毒性脑炎血小板偏高是普遍的现象,除了采取吃药最好进行输液治疗”,“你好,手足口病是一种肠道病毒病,具有肠道病毒感染的共同特征.主要侵犯手,足,口,臀四个部位,口腔溃疡疼痛,患儿流涎拒食.本病经1周后可自愈,一般对症治疗,可应用抗病毒药如阿昔洛韦利巴韦林(三氮唑核苷).中药有大青叶,夏枯草,或导赤散加减.还可以用双黄连口服液,严重的话,是需要到医院检查后治疗的。”)
[0123] 根据词表中的映射将上述的输入数据转换为数值表示(由于实际情况中词表数量大约有5000个,暂不在此全部展示),结果如下:
[0124] (“112,332,70,167,73,274,24,19,302,27,213,77,33,30,86,707,24,489,98,70,55,86,24,2,61,24,10,163,122,30,86,120,29,2,32,110,750,883,408,0,584,168,2,
142,52,318,68,167,73,54,33,0,48,66,24,4,54,33,57,3,28,323,6,488,1869,599,905,
237,4,244,131,30,22,167,73,40,5,142,52,24,68,32,110,750,142,52,340,23,528,65,
98,68,356,356,201”,“17,9,167,73,274,24,19,302,27,213,77,33,30,86,707,24,489,
332,70,120,29,31,54,32,110,750,883,408,584,168,111,84,45,103,51,42,44,17,347,
449,437,267,30,86,3,12,14,19,302,27,213,77,549,1815,763,584,168,5,991,1832,3,
54,491,2,249,24,416,484,57,28,132,9,106,118,602,208,12,14”“, 17,9,15,91,385,
146,19,5,10,108,270,176,19,302,19,15,445,6,270,176,19,302,83,189,3,945,196,
407,780,26,181,16,1284,1253,91,15,385,15,146,15,1050,359,48,88,292,15,146,
431,864,933,155,67,15,199,153,156,2437,2171,39,26,469,19,37,87,163,36,8,247,
434,15,10,127,99,35,12,14,15,8,101,20,259,19,302,28,53,703,1603,1061,1344,
497,724,1344,770,828,275,1994,729,586,1616,821,26,100,28,6,56,776,809,15,
1196,1977,826,15,80,84,1770,659,188,303,26,85,8,13,20,488,326,666,146,105,
208,2,304,141,3,262,2,5,126,16,81,30,86,38,29,36,12,14,3,4”)。
[0125] S303、构建字符向量映射层:指定字符向量的维度大小为embedding_dim,步骤S301中获取的字符表大小为vocab_num,使用[-1,1]的均匀分布定义(vocab_num+1)×embedding_dim的二维矩阵并将其作为模型的字符向量映射层的权重矩阵,其中,每一行对应医疗问答知识库中单个字符的向量表示,其中,第0行表示在知识库中没有出现的字符;
[0126] 在PyTorch中,示例的代码实现如下:
[0127] matrix=numpy.random.uniform(-1,1,((word_num+1),embedding_dim))[0128] matrix[0,:]=0
[0129] embedding_layer=torch.nn.Embedding((word_num+1),embedding_dim)。
[0130] 该层是问答模型的通用层,存储了全部字符对应的字符向量;对于question、answer、bad-answer的处理操作均完全相同。
[0131] S304、构建多尺度卷积层和堆叠卷积层:多尺度卷积层是利用不同尺寸的卷积核与经过步骤S303处理后的数据做卷积操作,捕获问题或答案里的字符级别的n-gram特征作为输出;堆叠卷积层是将不同尺寸的卷积核堆叠起来,将经过步骤S303处理后的数据自下而上地与各个卷积核做卷积操作,捕获问题或答案里句子级别的语义特征作为输出;再将多尺度卷积层的输出与堆叠卷积层的输出联接起来,作为问题或答案的特征向量;
[0132] S305、构建相似度计算层:使用余弦相似度公式计算得到问题和正确答案的相似度sim_pos以及问题与错误答案的相似度sim_neg;余弦相似度的计算公式如下所示:
[0133]
[0134] 其中,‖·‖表示L2范数,Q和A分别指问题和正确答案或错误答案经过问答模型处理后获得的向量表示;Q表示vector_question的向量,A表示vector_answer或vector_bad-answer的向量。
[0135] 如附图6所示,步骤S304中多尺度卷积层计算的具体步骤如下:
[0136] (1)、定义卷积核的数量为n,卷积核的集合C={c1,c2,…,ci,…,cn},其中,ci表示卷积核的尺寸;
[0137] (2)、根据步骤S303处理后的数据与卷积核的集合C内的卷积核分别做卷积运算得到结果O={o1,o2,…,oi,…,on};
[0138] (3)、对每个oi依次使用ReLU激活函数,做基于字符向量维度的取最大值操作,得到最终的输出Omulti。ReLU激活函数的公式如下为:
[0139]
[0140] 步骤S304中堆叠卷积层计算的具体步骤如下:
[0141] (1)、定义卷积核的数量为m,卷积核的集合C={c1,c2,…,ci,…,cm},其中,ci表示卷积核的尺寸;
[0142] (2)、根据步骤S303处理后的数据与卷积核的集合C内的第1个卷积核c1做卷积操作,再经过ReLU激活得到o1;
[0143] (3)、将o1与卷积核的集合C内的第2个卷积核c2做卷积操作,再经过ReLU激活得到o2;
[0144] (4)、如此重复操作直至得到om,对其做基于字符向量维度的取最大值操作,得到最终的输出Ostack。
[0145] 在PyTorch中定义卷积、ReLU激活函数、基于字符向量维度的最大值操作的代码如下所示:
[0146] 卷积代码:conv=torch.nn.Conv1d(embedding_dim,output_channel,c_i),其中output_channel为输出通道大小,用户可自定义。
[0147] ReLU激活函数代码:relu=torch.nn.ReLU()。
[0148] 基于字符向量维度的最大值操作代码:max=torch.nn.MaxPool1d()。
[0149] 如附图5所示,所述步骤S4中训练问答模型和答案选择的具体步骤如下:
[0150] S401、构建损失函数:根据步骤S305得到的问题和正确答案的相似度sim_pos以及问题与错误答案的相似度sim_neg使用Max-margin损失函数计算模型的损失值,用损失值来优化模型的结果;Max-margin损失函数的公式为:
[0151] L=max(0,mar gin-sim_pos+sim_neg);
[0152] 其中,margin为超参数,根据实际数据调整;max(a,b)的形式表示取a和b之间最大值;
[0153] 在PyTorch中,定义max-margin函数可用如下代码实现:
[0154] loss=torch.nn.MarginRankingLoss(margin)。
[0155] S402、构建优化函数:使用Adam算法作为模型的优化函数;其中,学习率参数设置为0.01,其他超参数使用PyTorch中的默认值即可;其中,超参数是指在开始训练过程之前,需要人工设置值的参数;该参数不能通过训练而自动优化;根据实际数据集的不同,该参数需要用户自行人工设置。
[0156] 在PyTorch中,定义Adam优化函数可用如下代码实现:
[0157] optim=torch.optim.Adam(lr=0.001)。
[0158] S403、答案选择:将一个新的问题与医疗问答知识库中的所有候选答案组成输入样本;再分别送入利用步骤S3训练完成的问答模型,计算问题与候选答案之间相似度的数值;最后从所有结果中选取相似度值最高的一组作为新问题最有可能的答案并该答案推送给用户。
[0159] 实施例2:
[0160] 如附图7所示,基于实施例1的医疗自动问答装置,该装置包括:
[0161] 医疗问答知识库构建单元,用于利用爬虫技术,从互联网上的医疗问答社区爬取问答对,并对医疗问答知识库的问题和答案进行预处理,预处理包括拆分有多个答案的问题以及对问题和答案的内容进行断字处理,构建医疗问答知识库;
[0162] 问答模型训练数据集生成单元,用于根据医疗问答知识库构建训练正例和训练负例,进而构建训练数据集;
[0163] 问答模型构建单元,用于构建字符映射转换表、输入层、字符向量映射层、多尺度卷积层和堆叠卷积层以及相似度计算层,进而构建问答模型;
[0164] 问答模型训练和答案选择单元,用于构建损失函数和优化函数,完成答案选择。
[0165] 其中,医疗问答知识库构建单元包括:
[0166] 爬虫单元,用于从互联网上抓取医疗问答社区中的内容,将结果保存为问答对的形式;
[0167] 爬虫数据处理单元,用于将爬虫获取的问答对拆分为多个单独对应的问答对,并将问题和答案句子进行断字处理,构建问答知识库;
[0168] 问答模型训练数据集生成单元包括:
[0169] 训练正例构建单元,用于将问题与其所对应的答案进行组合,构建为训练正例;
[0170] 训练负例构建单元,用于从问答知识库选中一个问题q1,再从医疗问答知识库中随机选择一个与问题q1不同的问题q2,将q1与q2的答案a2组合,构建训练负例;
[0171] 训练数据集构建单元,用于从训练正例构建单元和训练负例构建单元所得的全部问答的训练正例样本、训练负例样本组合在一起,并随机打乱顺序构成最终的训练数据集;
[0172] 问答模型构建单元包括:
[0173] 字符映射转换表构建单元,用于将医疗问答知识库中的所有字符构建为字符表,并将字符表中的每个字符映射为唯一的数字表示,可按照字符加入字符表的顺序从1开始依次递增,构建字符映射转换表。
[0174] 输入层构建单元,用于从问题对应的训练正例和训练负例中获取输入数据,分别获取训练正例中的问题question和答案answer以及训练负例中的答案,将其形式化为:(question,answer,bad-answer);
[0175] 字符向量映射层构建单元,用于构建并存储字符映射转换表中每个字符的向量表示;
[0176] 多尺度卷积层和堆叠卷积层构建单元,用于生成多尺度卷积层和堆叠卷积层,多尺度卷积层用于捕获问题或答案里字符级别的n-gram特征并输出,堆叠卷积层用于捕获问题或答案里句子级别的语义特征并输出;最后将多尺度卷积层的输出与堆叠卷积层的输出联接起来,作为问题或答案的特征向量;
[0177] 相似度评价构建单元,用于将多尺度卷积层构建单元和堆叠卷积层构建单元的输出的问题与答案的向量表示,进行联接,获得问题与答案的最终表示,并计算两者的余弦相似度;
[0178] 问答模型训练和答案选择单元包括:
[0179] 损失函数构建单元,用于计算问题和正确答案的相似度以及问题和错误答案的相似度之间的误差;
[0180] 优化函数构建单元,用于调整模型中的参数,使模型对问题与正确答案的相似度大于问题与错误答案的相似度;
[0181] 答案选择单元,用于处理新的问题时,从医疗问答知识库中使用训练好的模型选择正确的答案。
[0182] 实施例3:
[0183] 基于实施例1的一种存储介质,其中存储有多条指令,指令由处理器加载,执行实施例1的医疗自动问答方法的步骤。
[0184] 实施例4:
[0185] 基于实施例3的一种电子设备,电子设备包括:实施例3的存储介质;以及处理器,用于执行所述存储介质中的指令。
[0186] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽快参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。