朱淑媛 罗 军
(重庆大学计算机学院 重庆 400044)
随着信息时代技术的发展,人们越来越习惯在互联网上获取各种各样的信息。传统的搜索引擎,用户只能基于关键词进行检索,这并不能充分表达用户的搜索意图;对不熟悉专业领域的业余人员在询问他们感兴趣的领域问题时,往往也很难精准描述领域专业术语导致关键词匹配失败。基于关键词匹配检索返回的候选结果也难做到问题和答案的相关度吻合。用户要从大量的候选结果中定位目标结果,这种方式的准确率和召回率往往很低,用户体验较差。因此,自动问答系统应运而生。自动问答系统(Automatic Question and Answering System),简称问答系统(QA),是指接受用户以自然语言形式描述的提问,并从大量的异构数据中查找出能回答该提问的准确、简洁答案,并非相关文档的信息检索系统[1]。
目前,研究问答系统的文献有很多。已被广泛使用的问答系统大部分基于FAQ(常见问题及答案库),采用基于字符串匹配的方法[2-4],这种方法一般不考虑语义因素。针对语义的问答系统(SQA)[5-7],运用自然语言处理技术(NLP),借助信息检索(IR)从网络中检索答案成为了研究热点。基于语义的问答弥补了关键词匹配不到的不足,通过运用关键词的语义相识度模型(如wordnet等)进行语义相识度查询扩展,大大提高了问答回答的召回率,使得用户可以从掌握他们想要查询领域的特定词汇的需求中解放出来。
不幸的是,随着开发数据链接(linked open data)的发展,互联网散落了大量异构的知识元数据没有得到高效的组织管理,链接的数据云已经从Web上构建了数十亿个事实。如此庞大的数据量使要访问给定的所需信息变得复杂,导致SQA问答的研究受知识库表达的限制。本体是一种能在语义和知识层次上描述知识信息的概念模型,通过概念和关系的抽取,把互联网文本内容组织成为结构化的以实体为基本语义单元的图结构,图上的边表示实体之间语义关系[8]。近年来,本体在概念的抽取、表示、融合、推理、问答等关键问题上得到了一定的解决和突破。通过构建领域本体知识库来管理互联网上的语义元元素,不仅保证了查询的语义关联,同时利用本体的一致性原则对领域知识做明确规范,可以避免Web知识库中大量冗余的原始数据,优化查询的时间消耗。因此我们可以通过研究自然语言问题到本体知识库的映射,实现面向结构化网络的问答系统。但由于自然语言问题文法结构的复杂性,要完成问题在知识本体上的查询、匹配、推理等操作还面临很多挑战。需要解决的有两个核心问题。第一个是如何理解问题语义,并用计算机可以接受的形式进行表示。问题词汇和概念之间存在“词汇鸿沟”,一个概念可有多个描述词,例如,hypertension和高血压有着相同的语义,同一语义的问题也存在多种提问句式。这些都给问题的理解带来困难。第二个是如何在理解问题的基础上把问题转化为结构化的查询语句SWRL、SPARQL等。目前主流的基于深度学习的QA系统可以把传统的问句语义解析、文本检索、答案抽取与生成的复杂步骤转变为一个可学习的过程[9-10]。这种学习生成的方式虽然取得了一定的效果,但由于方法依赖大量的训练语料,且多是针对语义层次单一的问题设计的,对于复杂问题的回答能力尚且不足。目前,针对语义层次复杂的问题,另外一种主流方法是通过语义分析,运用范畴语法(Category CompositionalGrammar,CCG)以及依存组合语法(Dependency-based Compositional Semantics,DCS)等将用户的自然语言问句转化成结构化的语义表示[11-12]。针对中文的汉语框架网(Chinese FrameNet,CFN)[13]就是山西大学运用根据汉语语法规则在Fillmore的框架语义学理论基础上参照加州大学伯克利的FrameNet构建的汉语词汇语义框架知识库。该框架由框架元素、词元和句子三部分组成。框架元素用来标识语义角色;词元记录框架涉及的相关词语;句子记录用框架标注好语义信息的句子。受李茹等[14]用CFN来解析旅游领域问题语义结构的启发,本文在此基础上进行改进,结合CFN汉语框架网,给出从领域知识本体直接生成能理解问题语义的QFN问题框架本体的映射算法用来解析问题语义。
由于近几年人工智能及精准医疗、智慧医疗的提出,医学知识本体应用正受到国内外企业、学界的广泛关注,目前的医学知识本体库有:医学概念知识库LinkBase、TAMBIS本体库(TaO)等。人工构建的医学知识库本体如包括临床医学知识库、SNOMED-CT、ICD-10以及用CHV和SNOMED-CT两个医学词典自动构建医学知识库的典型例子一体化医学语言系统UMLS也得到了不错的实验结果[15]。利用这些医学知识本体进行自动问答,有望带来更廉价、高效、精准的医疗建议和诊断。因此,本研究将以医疗领域作为实例,通过重构已有的医学知识本体,分析基于医疗领域的本体自动问答系统来论证方法的有效性。
问题到本体映射的最终目的是通过重构原始问题来理解问题的语义。由于本体知识库的知识组织是由基本元素(包括类、实例、对象属性、数据属性)组成,而自然语言描述体系的语法结构是由词进行表达的。因此,问题到本体的映射需要各种各样的自然语言处理技术。本文采用的映射过程大致可分为命名实体标注和QFN语义解析两部分。图1是问题映射到本体的命名实体标注过程。对输入的自然语言问题首先通过分词,词性识别,关键词抽取等NLP技术获得一系列的词(Word)。然后对词的语义属性添加实体(Entity)标注信息,如开放域属性人名、地名、数字、日期,领域属性疾病名、药品名、治疗方式等,以及利用本体的语义结构扩展的同义词,等价词,父子概念等标注信息。接下来再对重构问题进行问题在语义层次的理解。
图1 问句命名实体标注过程
用命名实体的识别通常运用词林的规则匹配,如英文词林WordNet,中文的哈工大同义词词林等。但词林词典的结构往往庞大且缺乏针对特定领域的专业术语词汇[16],在限定领域内进行实体识别显然是不合适的。本文在进行命名实体识别的过程中在传统基于词林的实体识别上引入本体自身天然的对领域内相关概念和概念之间关系具有描述特性,在医学本体中,加入如图2所示的实体匹配词典。
图2 医学本体内实体匹配词典
实体匹配词典从领域本体中挖掘所有的概念(实体)作为最小语义单位,生成概念库。每个概念对应一个描述该概念的术语集合。例如,高血压是领域本体里一个概念,它可以用术语集合高血压、high blood pressure和hypertension表示。
考虑术语集合中的元素通常由一个词或多个词组成,单个词就是自然的索引词,而术语中的一些知识成分,如大部分属性的术语集合通常是一个比较完整的自然语言片段。本文通过在问题的自然语言描述词、领域本体的术语集合、术语对应的概念之间建立索引,构建如图3所示的问题到实体映射的链式数据结构,用于标注问题中领域命名实体。
图3 实体映射的链式数据结构
算法1具体描述了从自然语言问句中标注领域命名实体的方法。
算法1问句标注领域命名实体的方法
输入:医学本体,自然语言问题。
输出:已标注领域命名实体的问题。
1) 借助Jena解析医学本体。
(1) 提取类概念,属性概念,实例概念加入到领域本体图2中的“概念”类。
(2) 将“概念”类中的每个概念的实例的同义词,等价词生成领域本体图2中的“术语”类。
(3) 添加属性关系<有对应术语>连接概念类和术语类中的实例。
2) 对术语类下的每个实例:根据命名规则,采用中科院的分词工具(ICTCLAS)分词生成索引图(3)所示的索引词Indexword。
3) 同2)中规则,将自然语言问句分词生成一系列词序列Q(Q-word1,Q-word2,…,Q-wordn)。通过索引词在Question→Index word→Term table→Concept table流动。将问句的关键词标注为本体知识库中医学领域命名实体。
CFN语义网络解析问题框架结构[14]的思路是对一个问题,获取RDF三元组,即提取问题的语义谓词以及对应的主体和客体。例如文献[14]提到的用“[到达/Arriving框架]”来解析例句“驾车从太原到五台山怎样走最近?”,给出如图4所示的到达框架结构。根据CFN标注结果为:“
架名到达定义指转移体朝目的地方向的移动。目的地可直接表达出来,或从上下文中得到理解,动词本身隐含目标之义核心框架元素:目的地[Goal]目的地表现的是转移体运动终止之地,或行将终止之地转移体[Thm]转移体指移动的物体非核心框架元素:并行转移体[Thm_c]并行转移体指除转移体以外的其他移动的物体形容[Dep]形容指用来描写转移体到达的状态目的地状态[G_c]转移体到达目的地时目的地所呈现出的状态修饰[Manr]表现修饰的话语用于对动作特性的描述,用来描述运动的速度、姿态以及其他情况方法[Mns]用于表现转移体到达的方式传送模式[MoT]传送模式指作用于主体的运动模式,通过传送主体的主体身体或交通工具而实现轨道[Path]轨道指运动的轨道,既非源点,也非目的地源点[Src]源点即明确表达运动的出发点,该框架中出现表达源点的用语是可能的,但出现的频率却相对不高时间[Time]该框架元素表现到达这一动作出现的时间词元到达v,来到v,进入v,抵达v,返回v,走到v,走进v,赶到v,回来v,归来v,到v,回到v
图4 CFN中“到达”框架结构
本文提出的QFN是在传统的CFN上,把领域本体的语义结构提取出来,构建的一个带有语义关联的问题框架网,这个框架网络又是利用本体来管理和维护的。图5是根据CFN框架网络和本体元素的语义关联构建的一个QFN本体模型。
图5 问题框架本体结构
框架名类定义的查询问题的框架,词元类是和该框架相关的字、词表达,用来作为特征识别问题对应的框架。Slot类是CFN中‘框架元素’的等价类,Value类是CFN中‘词元’的等价类。Type类存放实例、属性、类三个实例,关联领域本体知识库对应元素即Value值所属的类别。句子库类描述从领域本体知识库中抽取的与框架相关的RDF三元组关系。QFN本体的映射可以用图6描述。
图6 领域本体到框架元素的映射算法
图6左边是传统CFN框架网络的结构,右边是领域本体的结构。从领域本体到传统CFN框架的映射算法具体描述如算法2。通过该映射算法,可以根据领域知识库自动生成该领域下的QFN框架结构用于问题结构的解析。当领域本体信息更新的同时,系统可以自动检测并更新QFN框架。
算法2领域本体到框架元素的映射算法
输入:领域本体,传统CFN框架结构。
输出:图6所示的框架名和Slot槽之间的关联关系。
算法步骤:
Begin
1:For each Individual框架名属于Class框架名do
2:根据框架名的实例在领域本体中映射到对应的知识类元素。完成Individual框架名到本体类元素的映射,得到映射类C1~Ck
3:For类Ci在领域本体中已存在的属性P1~Pk do
4:识别属性pj关联的主体Sij和客体Oij。作为实例加入到Slot类。
5:在框架名和Slot槽之间添加对应的has slot关联:
6:将领域本体Sij类和Oij类的下的所有Individual添加到Value类。
7:For Ik in Sij添加对应的has Value关联
8:end for
9:For Ik in Sij添加对应的has Value关联
10:end For
11:end For
12:在句子库中加入模式(
13:end For
End
表1以“诊断”框架为例,描述了从领域知识本体中自动生成的QFN框架的框架内容的过程。
表1 诊断的QFN框架本体的框架结构
如问句“继发性高血压/去/医院/要做/哪些/检查/?”经过命名实体识别可以得到(继发性高血压,疾病类,实例)/(医院类,类)/(实验室检查,物理检查,病症检查,类)。根据QFN进行标注,计算框架语义相似得到如下结果:
dis_top1:诊断框架
涉及相关RDF句子库topk:<[solt=疾病value=继发性高血压 type=实例],[患病实验室检查 type=属性],[slot=实验室检查 value=null type=实例]>
<[solt=疾病 value=继发性高血压 type=实例],[患病病症检查 type=属性],[slot=病症检查 value=null type=实例]>
<[solt=疾病 value=继发性高血压 type=实例],[患病物理检查 type=属性],[slot=物理检查 value=null type=实例]>
……
SPARQL是为RDF数据模型定义的查询语言和数据获取协议[17]。对产生单一关系的问句,基于QFN框架,在解析出的RDF三元组上,只要分析出这个问句中所有已知和未知的成分信息,构建简单SPARQL查询语句,并且这些信息能够在领域本体知识库中做出相应的解释,那么就可以认为这个领域问句被理解了。
对包含多个关系的复杂问句,本文分解RDF查询语义图,分别构建SPARQL查询语句。这里分为两种情况:(1) 并列关系:提取关系之间是并列的关系,即属性节点位于查询语义图同一层次。此时,分别输出各关系的查询语句。(2) 嵌套关系:关系与关系分别处于查询语义图的不同层次。此时,从低层次到高层次根据属性的层次关系,依次组装SPARQL查询语句。
对于一个复杂的SPARQL查询Q(G,S,F):本文给出如下定义:
Q(G,S,F)表示一组简单SPARQL查询的集合。其中G={G1,G2,…,Gn}是基础RDF三元组生成的语义查询图。S={S1,S2,…,Sn}是一组SELECT或者ASK头集合。F={f1,f2,…,fn}是一组过滤表达式。输入一个复杂查询Q,此时,从图G的叶子结点开始遍历,遇到非NULL的节点,用filter表达式把节点的值作SPARQL查询的限制条件;遇到NULL节点,加入SELECT头作为SPARQL查询的查询返回信息。通过在语义查询图上对路径上所有节点的遍历,我们可以构造一个等价的SPARQL查询语句。
算法3给出由查询语义图生成SPARQL语句的程序流程。
算法3查询语义图生成SPARQL语句
输入:<[solt=* value=* type=*],[relation type=*],[slot=* value=* type=*]>
输出:对应RDF结构的SPARQL查询语句。
拼装SPARQL语句
1) 组合Select语句
queryStry="Select";
for(遍历所有未知信息实例节点){
queryStr.append(?variable)
}
2) 组合查询条件语句
queryStr.append("Where{"};
for(遍历QFN解析出的该问题的RDF属性节点Relation){
queryStr.append(?Domain)
queryStr.append(Relation)
queryStr.append(?Ranage)
}
3) Filter过滤语句
queryStr.append("filter(");
for(遍历所有实例变量){
queryStr.append(?Domain=′value′)
queryStr.append(?Ranage=′value′)
}
queryStr.append(")}")
表2分别列举了陈述型和布尔型问题自动生成SPATQL语句的流程。
表2 医疗问题分析-例子
为验证本文提出系统的可行性,根据上述设计方案,采用Eclipse+Protégé+Jena实现了一个基于医疗领域本体的自动问答实验系统。系统主要模块包括问题预处理、命名实体识别、QFN解析、SPARQL语句生成以及答案抽取。系统架构如图7所示。
图7 基于本体的自动问答系统架构
实验领域本体抽取SNOMED-CT[18]医学本体的部分信息,运用斯坦福大学提出的本体构建七步法[19],从领域本体的概念出发,在MeSH医学主题词表首先抽取医学领域中以疾病、个体、药品、医院四个概念的层次概念和实例,并确定领域本体中概念间的等级关系。再根据医学中的关键要素从个体属性、疾病属性、药品属性、医院属性四个核心属性抽取关于疾病、医院、药品、个体之间的医学联系,添加概念与概念的关系。在已经重构好的本体结构上,再从A医药网用Scrapy框架与正则表达式结合爬取相关概念的实例丰富本体知识库。重构的医学本体核心结构如图8所示。
图8 医学领域本体部分结构
测试问题数据来自A+医药网中筛选的400个涵盖不同类别的问题。对比图9从本系统得到的问题回答效果和图10从百度知道问答中检索出的答案可以看出:本系统是从理解问题语义的角度给出的针对问题问点的相对准确的答案。
图9 本系统给出的问题答案
图10 百度知道检索结果
为了定量分析系统的效果,实验用召回率、准确率和F值三个指标进行系统性能的分析。性能指标定义如下:
P=(Pnum×100% )/Rnum
(1)
R=(Pnum×100% )/Anum
(2)
F=2×P×R/(P+R)
(3)
式中:P表示准确率,R表示召回率,Pnum是给出回答的问题中准确回答的问题数,Rnum是测试问题中给出答案的问题数,Anum是用来测试的问题数。
实验一问题语义解析的情况分析。表3是用QFN对医学领域4个主要类别的问题解析情况的结果。
实验二问题回答结果的准确率分析。和实验一采用相同的数据,为了避免QFN解析问题结构失败导致实验结果的偏差,实验二在实验一的基础上,用已经解析出QFN框架结构的问题,分析问题回答的准确性。实验结果如表4所示。
表4 问题集测试结果
从实验数据分析,对问题集中的所有问题,sparql语句的生成率达到了90.07%,说明该方法能够准确识别问题中的命名实体,并生成相关SPARQL语句。但平均F值和开放领域TREC[20]的结果相比没有很大的提升。进一步分析实验中找不到答案和错误回答的问题,影响实验一QFN识别的原因主要是实验系统构建的领域本体知识的缺失,在进一步的实验中已验证通过丰富本体知识可以提高系统的可用性。实验二中对QFN正确解析的问题生成sparql查询语句的平均准确率达到90%以上,说明通过QFN解析问题产生的RDF三元组是可以高效地把问题转化成SPARQL语句的。但答案回答的R值较低,原因是系统尚未加入推理机制,导致召回率低。利用本体自身的语义推理特性,系统引入两层推理机制。第一层在框架识别层根据识别的框架语义推理多个符合问题的结构,生成多条SPARQL查询,提高系统的召回率。第二层推理在SPARQL查询执行失败时,利用领域知识本体查找规则库中的规则,执行推理查询。如:问题问点是询问高血压病情时,通过以下规则可以推测高血压的病情。
[rule:(?x medical:患有medical:高血压)(?x medical:收缩压血压值?y), lessThan(?y,159), greaterThan(?y,140)->(?x medical:所患疾病等级 medical:1级高血压)]
这条规则表达了x是患有高血压病的病人。y是收缩压血压值,且y的值被判断在140~159之间,可以推断出x是属于1级高血压的病人。
实验进一步用100个医疗领域问题,启动推理机制,分8个批次,每次扩充100个与实验问题相关的实例到领域知识本体后,系统F值的变化趋势如图6所示。
图11横坐标表示加入新的领域本体知识的数量,纵坐标是回答的F值。可以看出,开启推理机制后,系统初始F值从75.27%提升到80.6%。同时没随着新加入本体知识数量的增加,F值呈现上升趋势。可见,系统能够随着领域本体知识库知识的丰富不断提升回答的效果。
图11 引入推理机制的系统F值随本体知识扩充后变化趋势
大多数传统的基于Web的QA系统是通过在Web知识库下检索识别到的命名实体和相似度的度量来呈现候选答案。本文利用本体在知识管理上带有语义的特性,将问题的命名实体和本体语义结构联系起来,通过QFN问题框架网解析问题语义结构,抽取RDF三元组自动生成SPAQRQL语句从领域本体中之间查询、推理出问题的一系列更具有语义针对性的答案。基于本体的自动问答系统在加入本体和推理之后,能够发掘检索词与其相关领域的显示和隐式联系,使检索具有语义性,答案抽取更加全面且准确,轻松解决了传统搜索引擎无法解决的问题。此外,通过QFN问题框架本体自动更新机制,实现了问题框架的增量式更新。确保了系统的性能在使用中可以不断提高,优化用户体验。实验表明,本文的所有研究对实际应用具有一定的意义,但是仍然有很多需要改进和完善的地方:
1) 基于领域本体库进行概念扩展阶段,扩展的深度在一定程度上会导致问题的意图的偏移。如何控制扩展的深度是今后研究的方向。
2) 自然语言问题的复杂结构,如问题“吃阿莫西林一直肚子疼是怎么回事?”(药品的副作用)这类很难抽取RDF三元组的问题,系统还需引入语料学习的机制,提升回答的准确性。