面向机器人学习的对话知识库构建方法分析研究 计算机人工智能专业_第1页
面向机器人学习的对话知识库构建方法分析研究 计算机人工智能专业_第2页
面向机器人学习的对话知识库构建方法分析研究 计算机人工智能专业_第3页
面向机器人学习的对话知识库构建方法分析研究 计算机人工智能专业_第4页
面向机器人学习的对话知识库构建方法分析研究 计算机人工智能专业_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录前言 3第一章 绪论 41.1 研究背景及现状 41.2 对话知识库构建方法概述 41.3 本文的主要工作及创新点 51.4 本文的组织结构 5第二章 对话知识库构建方法 72.1 理论基础 72.1.1 方法的形成 72.1.2 方法思路 82.1.3 方法可行性分析 82.2 语句模板生成 92.2.1 词性标注集简介 92.2.2 语句特征选取 102.3 提取问题与答案关联特征 112.4 生成对话知识库 122.4.1 知识库存储方式 122.4.2 知识库存储结构 132.4.3. 知识库生成过程 142.4.4 知识库更新过程 152.5 本章小结 15第三章 知识库构建系统 173.1 系统需求分析 173.2 系统可行性分析 173.3 系统结构 183.4 使用工具介绍 193.5 系统编码实现 203.5.1 词性标注模块 203.5.2 知识库生成模块 233.5.3 知识库检索模块 273.5.4 人机交互模块 293.6 本章小结 30第四章 实验结果分析 314.1 实验结果展示 314.1.1 对话过程展示 314.1.2 知识库构建结果展示 354.2 实验结果分析 36第五章 总结与展望 37参考文献 38致谢 39摘要本文提出了一种基于模板自动生成的面向机器人学习的对话知识库构建方法,并且实现了一个基于这种知识库构建方法的对话系统。该构建方法的核心思想是利用句子中的词性,根据句子中有意义实词的词性来完成模板的生成。知识库构建系统对首次被问及的某一个问题,会请求用户告知这个问题该如何回答。此后,系统会根据用户输入的问题和答案尝试学习同类问题和答案的表达方式并建模。并且采用一定策略,从问题和答案中尝试提取出该问题和对应答案相关联的细节特征。然后在语料库中匹配满足答案表达方式的语句,利用这些语句来建立和该问题同属一类问题的答案知识库。当再次被问及这一类问题时,系统就会先将问题建模,找到此类问题对应的知识库,然后利用前面学到的此类问题和答案关联特征,尝试在知识库中找到这个问题的答案。该构建方法可以用来实现简单的对话机器人系统,同时也可以为刚投入使用的复杂对话机器人系统快速构建常规问题的对话知识库。实验结果表明,本文提出的模板自动生成知识库构建方法是有效的,基于模板生成的对话知识库构建方法能够利用用户提供的[问题,答案]快速建立这一类问题的答案知识库。关键词:知识库构建;机器人学习;模板生成;对话机器人AbstractInthispaper,weproposeamethod,basedonautomaticallygeneratingpatterns,toconstructdialogueknowledgebaseorientedonrobotlearning.Wealsoimplementadialoguesystembasedonthisknowledgebaseconstructionmethod.Thecoreideaoftheconstructionmethodistousethepart-of-speechofwords,whichcompletestheformationofpatternsbyusingthepart-of-speechofmeaningfulwordsinthesentence.Theknowledgebasebuildingsystemaskstheuserhowtoansweraquestionthatwasfirstasked.Afterthat,thesystemwilltrytolearntheexpressionsandmodelsofsimilarquestionsandanswersbasedonuserinputquestionandanswer.Anditalsoadoptsacertainstrategytotrytoextractcorrespondingfeaturebetweenquestionandanswer.Thenitpicksoutthetargetsentenceswhichfitthatanswermodelinthecorpus,andusesthesesentencestosetupknowledgebasewhichcanbeusedtoanswerquestionsthathavesametypewithquestioninputtingbyuser.Whenaskedaboutthiskindofproblemagain,thesystemwillgeneratepatternwithinputtingproblemfirst,andthenitfindthecorrespondingknowledgebasewhichareestablishedwiththisquestionpattern.Next,itusethefeatureslearnedintheearlysteptofindexactanswerofthisquestionintheknowledgebase.Thisconstructionmethodcanbeusedtorealizeasimpledialoguerobotsystem,anditcanalsoquicklybuildaconversationknowledgebaseofconventionalquestionsforthecomplexdialoguerobotsystemthathasjustbeenputintouse.Theexperimentalresultsshowthatthemethodproposedinthispaperiseffective,andthemethodofbuildingadialogueknowledgebasebasedonpatterngenerationcanmakeuseofthe[question,answer]providedbyuserstoquicklyestablishtheanswerknowledgebasetothiskindofproblems.Keywords:KnowledgeBaseConstruction;RobotLearning;PatternGeneration;ConversationalRobot前言随着信息化时代的到来,日常生活中会产生大量的数据,而且每天产生的数据量正在以指数式增长。这些数据中记录了各种各样的信息,涵盖了日常生活中的方方面面,其中含有许多简单、事实性问题的直观答案。常规的搜索引擎能完成信息的检索,即搜索引擎根据关键字进行检索,它返回出现了给定关键字的文档。这些含有问题答案的文档集合为问答系统的答案抽取提供了基础。目前,已经有多种方法用来从文本信息中抽取答案,比较典型方法有基于模板匹配算法、基于信息检索和信息抽取算法、基于统计学习的算法、基于自然语言处理的算法[1],能利用这些技术,能够从含有答案的文档中提取出准确答案完成对话,如周博通等实现的InsunKBQA:一个基于知识库的问答系统[2]。但是,这些技术只是对针对一个具体的问题完成了答案的提取,无法抽取同属一类问题的所有问题的答案。面对海量的问题,如果对每一个问题都采用只针对本问题的答案抽取方式,那么构建一个对话知识库就要完全依赖人工手动输入每一个问题,然后知识库构建系统再依据具体的问题建立对话内容,这显示是费力不可行的。对于海量的问题,我们渴望对问题进行分类,然后从“类”的角度入手,找到一种通用的方式来建立这一类问题的答案知识库。本文从词性的角度对句子进行分类,根据用户提供的[问题,答案],尝试自动生成该问题和答案的词性模板,并利用答案语句的词性模板在语料库中搜索满足该模板的语句,然后再根据这些语句来构建这一类问题的答案知识库。当下次输入的问题符合特定的[问题,答案]中“问题”模板时,就可以尝试从这个“答案”模板生成的知识库中寻找正确答案。绪论本章首先介绍了对话知识库构建方法的研究背景和研究现状,其次概述了本文构建对话知识库所用的方法,并说明了本文所做的主要工作及创新点。最后介绍了本篇文章的组织结构。研究背景及现状随着人工智能时代的到来,人们希望机器人能像人一样用自然语言来完成对话。目前市面上也已经有了很多能用自然语言来对话的机器人,代表作品有微软公司的娱乐聊天机器人小冰、苹果的语音助手Siri、京东客服机器人JIMI等。对话系统可以根据应用场景的不同分为开放域(open-domain)问题和封闭域(closed-domain)问题2种类型[3]。.就机器人回答内容的来源上划分,可以将聊天机器人分为检索式聊天机器人和生成式聊天机器人。检索式对话机器人根据用户的输入和上下文内容,使用预先存储好的知识库来完成对话;生成式对话机器人则更加复杂,它不依赖于事先定义好的内容,自动生成新的回答内容。目前的对话机器人主要还是以检索式为主,因此构建知识库是完成检索式对话机器人的关键内容。当前关于构建对话知识库的主要方法分为三种,分别为手工编辑、基于本体的知识库构建方法、半自动或自动知识提取构建方法[4]。手工编辑主要表现形式为直接手动编辑和互联网众包机制,通过人们手动将知识结构化写入计算机的方法来得到对话知识库。起源于哲学的本体论近年来在信息领域也得到了广泛的应用,特别是W3C国际标准本体描述语言OWL(ontologyWeblanguage)[5]使本体论方法在构建知识库方面成为现实。半自动或自动知识提取则是事先设计好自动或半自动提取算法,然后让计算机利用该算法去语料库中抽取知识。对话知识库构建方法概述本文所提出的对话知识库构建方法是面向机器人学习的自动知识库构建方法,即不需要提供大量的训练数据,基于用户提供的一例[问题,答案],尝试学习同类问题和答案的表达方式并建模,借以从自由文本或知识库中搜集大量同质异构的问答对子,形成知识库并辅助问题的高效检索。该构建方法的核心思想是同一类问题虽然有很多不同的具体问题,但是就问题中实词的词性而言,属于同一类的问题,它们的词性是相同的。比如“张明昨天去哪儿了?”,这一具体的问题,其中实词的词性向量为[张明_人名,昨天_时间,去_动词,哪儿_代词],因此这一类问题的共词性同模板向量就是[人名,时间,动词,代词]。对于这个具体的问题,一个正确答案可能是“张明昨天去北京了。”,同理这个答案的词性向量依次为[张明_人名,昨天_时间,去_动词,北京_地名],我们可以得到这类问题的答案语句模板向量为[人名,时间,动词,地名]。因而,我们可以用这个答案模板去语料库中检索,符合这个模板的句子,它可能就是这类问题中某个具体问题的答案。基于这样的假设,我们将这些句子用来建立这类问题的答案知识库。当下次有符合[人名,时间,动词,代词]模板的问题,就尝试从这个答案知识库中去寻找答案。本文的主要工作及创新点本文以各种知识库构建方法为基础,参考了各种构建方法的核心思想,提出了一种基于模板生成的自动知识库构建方法。先在理论上探索了利用该方法构建对话知识库的可行性,然后在windows平台上编码实现了一个利用该构建方法的对话知识库构建系统,通过在一定量的语料库上,实际地验证了该构建方法的实际效果。本文提出的知识库构建方法创新点主要体现在不仅是对具体的某个问题创建该问题的答案知识库,而是尝试将用户提供的[问题,答案]实例抽象到“类”的层次。从人的认识事物的角度出发,将某个具体的[问题,答案]进行抽象,抛去表层具体的词项,提炼出该[问题,答案]的词性模式[问题模板,答案模板,问题--答案的关联特征],利用这个词性模板建立一个属于这一类[问题,答案]的答案知识库,实现由一个[问题,答案]例子,尝试学会回答这一类问题,从而达到机器人自学习的效果。本文的组织结构全文共分为五章,每个章节的内容安排如下:第一章:绪论。本章首先介绍了对话知识库构建方法的研究背景和研究现状,其次概述了本文构建对话知识库所用的方法,并说明了本文所做的主要工作及创新点。最后介绍了本篇文章的组织结构。第二章:本文所使用的知识库构建方法详细描述。阐述该构建方法的理论基础及实现原理。第三章:详述一个基于该构建方法实现的对话知识库构建系统。第四章:实验结果展示及对基于本方法的知识库构建系统的评估。第五章:总结全文,提出进一步的工作设想与展望。对话知识库构建方法本章将详细地介绍本文提出的对话知识库构建方法,主要从基本原理、句子模板生成、具体问题和对应答案关联特征提取、利用生成的模板构建知识库和如何利用构建的知识库完成对话几个方面详细介绍。理论基础本节介绍了本文提出的构建方法是如何产生以及构建方法的详细思路。方法的形成对话知识库中的知识和具体问题是存在强关联的,通常是知识库中的每一条知识对应一个特定的问题。传统的手工构建知识库方法就是人们利用自己已经学到问题--答案知识,将每一个问题对应的答案按一定的格式手动输入计算机,所有这类格式的答案集合形成了一个对话知识库。受手工知识库构建方法的启示,半自动或自动对话知识库构建方法事先对可能要问的每一类问题设计一种具体的模板或算法。然后利用这些模板去语料库搜寻符合这些模板的语料信息,最后利用这些匹配到的语料信息来建立对话知识库。半自动或自动对话知识库构建方法有一个比较明显的弊端,那就是对于每一类问题都要事先人工给出模板,然后计算机才能依靠这个模板去建立知识库。从这个弊端入手,我们希望能找出一种方法,让计算机自己尝试找出问题和答案的模板,然后再利用这个计算机自己找出的答案模板尝试生成这类问题的答案知识库。当下次再遇到这类问题时,计算机能用同样的策略识别这类问题,并且尝试从已经构建的对应答案知识库中找到这个问题的答案。现在核心任务就是计算机要尝试学会自动建立不同问题和答案的模板。围绕着核心问题,我们考虑从人们认识事物的角度去寻找方法。人们认识某一类事物,总是从某一个具体的事物开始,然后把这个具体的事物进行抽象,提取这个事物的本质特征。最后用这些特征去匹配新出现的事物,当这个新事物符合这些特征时,我们就认为它们同属于一类事物。基于人们认识同类事物的方式,我们考虑是否将这种过程用到对话知识库的构建上。方法思路结合对话知识库特点和人们学习新事物过程,我们不难发现这种学习过程可以运用到对话知识库的构建上。因为,对话过程中的被问及的问题也是存在这种由具体问题抽象到某类问题的现象;由某个具体问题的回答方式抽象到某类问题的回答方式。这种抽象可以是一种建立在句子词性相同的基础上。方法可行性分析要计算机利用语句的词性尝试自动完成模板生成和利用生成的模板构建知识库,有以下四个核心任务要处理。要自动对输入的问题、答案,语料库中的语句进行词性标注。要从已经进行词性标注的给定问题和答案中提取出问题和答案的一般特征,进而形成类的概念。在提取一般特征的同时,还必须找出这个给定的问题和答案具体是如何关联在一起的,即为什么这个答案对应这个问题,这样才能对这一类问题中每个具体的问题找到对应的具体答案。要利用生成的答案模板在语料库中匹配所有符合这个模板的语句,并将符合答案模板的这些语句段截取出来。最后还要考虑如何组织第三点中提取出来的语句段,以便下次针对同类问题,在其中检索答案。针对以上四点核心任务,可以采取以下措施完成。就词性标注而言,目前词性标注在自然语言处理中已经得到了很好的解决,有很多开源的工具可以直接使用,并且这些开源工具在词性标注方面准确率几乎都在95%以上。利用这些分词工具可以完成词性标注任务。针对给定问题和答案中特征提取,特征太少时无法准确描述这类问题和答案的共性,特征提取的太多,又失去了对它们的一般性概括。从一般的问题入手,我们可以发现同类问题它们语句包含的关键词的词性是相同的,比如问地点的问题“小明刚才去哪儿了?”,其中的关键词应该是[小明,刚才,去,哪儿]它们的词性为[人名,时间,动词,代词]。同属这一类问地点的所有问题,其中的具体成分可以被更换,但词性几乎不会改变。至于辅助词“了”和标点符号“?”这些成分可以被更换或省略。因此我们可以忽略句子中的虚词,采用句子中实词的词性作为模板的成分。而具体的问题和答案关联则可采用问题和答案中相同成分作为特征的策略。从已经进行标注的语料库中选取符合答案模板的语句并截取出来,这个任务可以通过将答案模板和语料库中语句的词性模板视为串,然后采用串匹配策略完成检索与截取。最后,我们对符合答案模板语句的整体组织可以采用XML格式。XML这种标签语言带有很强的描述性,可以使得生成的对话知识库结构化。同时XML格式的数据可以在不同的平台间传输,做到知识库一次生成,跨平台多次使用的效果;另一方面,也是因为基于W3C标准的XPath文档查询语言可以快速地选出需要的节点,避免了对整个文档的检索,缩短了在知识库检索目标答案时间。从以上几个方面分析,我们可以得出基于模板生成的面向机器人学习的对话知识库构建方法在理论上是可行的。语句模板生成要计算机尝试完成问题和答案模板的自动生成,首先要考虑如何对问题和答案进行抽象。不管是问题还是答案,它们都是语句。既然是句子,那么句子中每个词都一定的词性,我们可以从词性出发,利用每个词的词性来对这句话进行抽象。词性标注集简介词性标注就是给每个词一个类别信息,它是对词本身的一种抽象描述。要对汉语进行分词,首先要制定一套标准的词性标注集。汉语词性标签集不仅可以用于汉语分词,也是进行词法分析、句法分析和汉英机器翻译系统的重要元素。不同的分词工具采用词性标注集略有差异,当前分词系统主要用的词性标注集有ICTCLAS2008汉语词性标注集[6],以及该标注集的扩充版本ANSJ词性标注集,其余词性标注集还包括中文树库(ChineseTreeBank)标注集、863词性标注集。具体采用哪一个标准的词性标注集并不影响具体的句子模板生成,本文中后续系统的实现采用了LTP((LanguageTechnologyPlatform)平台[7]的分词功能,因此,词性标注集选用863词性标注集。表2.1是LTP平台采用的863词性标注集符号的详细说明。采用了一定标准的词性标注集对句子中每个词进行标注后,下一步我们就可以利用这些词性标注信息形成模板来描述句子的特征。语句特征选取特征提取的好坏决定了归纳的问题类是否能够包含该类所有的问题,同时也决定了答案模板能否在语料库中找到所有这类问题的答案。对给定问题和答案进行特征提取,特征太少时无法准确描述这类问题和答案的共性,这可能导致将不是同类的问题也归纳到这一类问题中;特征提取的太多,又失去了对它们的一般性概括,从而会导致生成的模板规则太强,在语料库中匹配不到有用的语句。为了选取有效的特征,从一般的问题入手,我们可以发现同类问题它们语句包含的关键词的词性是相同的,比如问地点的问题“张明刚才去哪儿了?”,其中的关键词应该是[张明,刚才,去,哪儿]这几个有意义的实词,它们对应表1.1中的词性标注符号生成的模板向量为[nh,nt,v,r]。同属这一类问地点的所有问题,其中的关键词的具体成分可以被更换,比如关键词换为[李刚,上个月,去,哪里]。这些关键词构成的问题可能为“李刚上个月去哪里啦?”,不难发现这两个问题是属于同一类问地点的问题。第二个问题中包含的关键词词性没有改变,至于无意义的辅助词“了”和标点符号“?”这些成分可以被更换或省略,如上面第二个问地点的问题中,可以将“了”换成“啦”或者不用这种语气助词。这种助词在问句中并没有提供实际的意义,只是起到使语句通顺的效果,因此他们不能成为特征。由上述我们可以得出结论,模板中的特征应该选用句子有意义的实词词性标签,我们将这种有意义的实词定义为该句中的关键词,同时要忽略句子中无意义的虚词词性标签。对于“张明刚才去哪儿了?”这个问题我们得到这类问地点的问题模板向量为[nh,nv,v,r]。我们假设表1.1中的词性标注集中所有的词性标签为S,我们选择集合I中词性标签为要忽略的虚词标签元素,则特征词性标注集F的中表记元素为S与I的差集。即: 公式(2-1)其中S为词性标注集中所有标签,I=(c,e,g,h,o,p,u,wp,x)。表2.1LTP词性标注集各标签含义标签符号描述例子标签符号描述例子a形容词漂亮ni组织名称红十字基金会b其他名词修饰符大型nl位置郊区c连词和ns地名成都d副词非常nt时间昨天e叹词唉nz其他专有名词图灵奖g词素甥o拟声词啪叽h前缀阿p介词在i习语百花齐放q量词一个j缩写词公检法r代词我k后缀率u辅助词的m数字100v动词去n一般名词桃子wp标点符号。,nd方位名词左侧ws外文词GPAnh人名张三x非词法符号萄提取问题与答案关联特征上一节中,尝试性给出了如何对给定的[问题,答案]实例进行抽象,提取模板,进而归纳出这一类问题的答案所共有的特征。但是对答案模板匹配到的语句,我们只知道这是用来回答某一类问题的语料信息,我们还不知道这个句子究竟是用来回答哪一个具体问题的。比如对于问地点的问题“张明昨天去哪儿了?”,语料库含有许多回答地点的语句,“张明昨天去北京了”,“张明今天回学校了”,“李刚昨天去成都”等。我们必须采取一种策略判定出“张明昨天去北京了”这个句子是问题对应的答案语料。我们知道对话知识库每一个答案都是对应一个问题的(不包括像“好啊”,“我不知道”等这种无效回答),并且这种问题和答案的对应关系是一一强对应的。观察上面的问题“张明昨天去哪儿了”和对应答案“张明昨天去北京了”,我不难发现在这个问题和答案中,他们的具体关联表现在[nh,nt,v]模板向量对应的具体词相同。更一般的,我们能不能把这种问题和答案中的一致性作为问题和答案的关联关系呢?事实上,对于基于事实、非推理性的问题,这种关联是可以的。因为,基于事实的事件,包括时间、地点、人物、事件的内容等一系列事件要素,对这些事件进行提问时,必须要指明事件中的一些或全部要素才能完全确定问题要问的对应事件。基于以上理论我们可以采取将问题和答案中相同关键词生成的向量作为具体问题和具体答案关联的特征向量。例如对于上述问地点的问题,它的具体问题与答案的关联特征向量为[nh,nt,v]。下次当再次有这类问地点的问题时,我们就可以根据这个关联特征向量去尝试性检索这个问题的具体答案。生成对话知识库到目前为止,我们已经找到方法对语句进行词性标签,提取问题模板向量、答案模板向量、具体问题和答案关联特征向量。接下来要解决的就是如何用这些得到的信息构建得到对话知识库。知识库存储方式基于我们构建的对话知识库是提供给对话机器人完成对话的目的,我们设计的对话知识库首先应该是结构化、便于检索的。同时知识库还应该是自描述、易扩展的,即生成的知识库可以脱离知识库生成程序后进行自解释,当生成好的知识库遇到新的语料信息时,可以依靠知识库中的自我结构描述信息进行扩充。根据以上的几点对知识库的要求,我们可以选择XML这种扩展标签语言。首先XML作为标签语言,它可以对文本中的信息添加一系列的标签从而使无结构的数据成为半结构化或结构化的数据。其次XML标签语言给用户提供很大的自由性,用户可以自定义标签,为不同的信息添加不同的描述结点,从而可以达到知识库自描述的特点。再次,基于W3C标准的XPath文档查询语言可以快速地选出需要的节点,避免了对整个文档的检索,缩短了在知识库检索目标答案时间。最后,XML格式的数据可以在不同的平台间传输,做到知识库一次生成,跨平台多次使用的效果。知识库存储结构确定了如何结构化的存储知识库后,接下来要做的就是设计一套XML节点标签,用来描述对话知识库中,每条知识的想详细信息。本文设计的XML节点标签有以下4种:knowledgeBase、knowledge、answerDetail和answer。它们各自描述信息如下:KnowledgeBase为根节点,不带有属性;Knowledge为一类问题对应的所有答案节点,具有的以下五个属性,分别为:questionPattern,questionFeature,answerPattern,answerFeature,exactAnswer。其中,questionPattern属性值指出了这一类问题的模板向量;questionFeature属性值为数字索引,它指出应从questionPattern中选择哪几个位置的词性标注对应的词来区分属于这类问题中不同的具体问题;answerPattern属性值指明了这一类问题的答案语句在语料库中应该有的模式;answerFeature属性值为数字索引,它指出answerPattern中哪些位置对应的词性标注用来区分不同问题对应的具体答案;exactAnswer属性值为数字索引,它指出在答案模板中应该抽取哪些位置词性标注对应的词作为问题的准确答案。AnswerDetail为符合answerPattern的一条目标语句信息结点,它具有的属性为answerFeature指出的词性标签集合,属性值为目标语句对应answerFeature指出的词性位置上对应的那个词。同时,answerDetail结点还具有子节点answer。answer结点标签每个问题对应的具体答案,它的值来自于exactAnswer属性值指出的具体词。以上questionPattern和answerPattern属性对应的值分别来自于我们在2.2.2节中从问题和答案中抽取的模板。questionFeature和answerFeature则来自于2.3节中问题和答案关联特征词项在问题和答案中的索引集合。下面就对给定的[“张明刚才去哪儿了?”,“张明刚才去厕所了”]这个问题答案对进行详细说明各结点的含义。对于这个给定的实例,对应生成的知识库如下(生成过程见下节)。<?xml

version="1.0"?>

<knowledgeBase>

<knowledge

questionPattern="nh

nt

v

r

"

questionFearture="0

1

2"

aswerPatern="nh

nt

v

n

"

answerFeature="0

1

2"

exactAnswerPosition="3">

<answerDetail

nh="张明"

nt="刚才"

v="去">

<answer>厕所</answer>

</answerDetail>

</knowledgeBase>

首先knowledgeBase结点表示这个知识库的根结点。其下可以含有许多名为knowledge的子结点。Knowledge结点表示一类问题的对应的知识库。在[“张明刚才去哪儿了?”,“张明刚才去厕所了”]例子中,利用2.2.2节中模板生成方法,我们可以得到问题和答案模板向量为分别为[nh,nt,v,r],[nh,nt,v,n]。则questionPattern属性的值为[nh,nt,v,r];answerPatter属性值为[nh,nt,v,n]。利用2.3节中问题和答案关联特征提取方法,我们可以得到这个问题和答案关联模板向量为[nh,nt,v],他们在问题模板向量中的索引为[0,1,2],在答案模板向量中的索引也是[0,1,2]。因此,questionFeature属性值为“0,1,2”,answerFeature属性值“0,1,2”。对于exactAnswer属性而言,它需要额外的信息,因为从上面用户给的例子中无法自动学习出“厕所”就是准确答案。这个额外信息的来源由系统向用户发出请求,当用户手动额外输入“厕所”一词时,系统就将这个词在答案中的位置提取出来,并进一步的在答案模板中找到这个词的位置。这里“厕所”答案模板[nh,nt,v,n]中对应n代表的词,故索引号为3。answerDetail结点对应一条符合answerPattern模板的语句详细信息,这里符合answerPattern的语句是“张明刚才去厕所了。”。这个结点的属性来自于其父节点knowledge的answerFeature属性值指出的词性标注。上面answerFeature属性值“0,1,2”指出了要选用answerPattern中的[nh,nt,v]作为属性,属性值为[nh,nt,v]对应的具体词[张明,刚才,去]。知识库生成过程上一节介绍了本文要使用的知识库存储结构,本节将介绍如何利用学到的模板信息和关联特征信息来建立对话知识库。建立对话知识库的详细过程如下:对用户输入的[问题,答案]分别生成模板向量Pquestion和Panswer。对用户输入的[问题,答案]和生成的模板向量[Pquestion,Panswer],并从中提取关联特征索引向量Iquestion,Ianswer。系统向用户发出请求,请求用户输入答案中的准确词项,并将这些输入词项在答案模板中对应的位置Iexact保存下来。建立knowledge结点,利用1),2),3)中生成的信息填充knowledge结点。对语料库中每一句话进行词性标注,并生成该句的模板向量Pi。如果模板向量,则将Pi对应Panswer部分的句子Si截取出来。这里符号是指Panswer对应的串是Pi的一个子串。对句子Si建立一个answerDetail结点,该结点的属性用Panswer和Ianswer指出的词性标签名填写,属性值这些词性标签对应的值填写。根据Iexact和Panswer指出词性标签对应的词添加answer子节点。将根据Si建立的answerDetail结点添加到4)中的knowledge结点下。知识库更新过程对于已经构建完成的知识库,在大部分的情况下我们只是对其进行查询操作,即从中找出我们需要的答案。但有时随着语料库的更新,我们也需要更新我们的知识库。因为2.4.2节中定义的知识库存储结构是自描述的,各结点信息中详细的给出了每类问题对应的答案所具有的模板和细节特征,利用这些信息可以很容易的对这个知识库进行更新。更新对话知识库的过程如下:对新增加的语料库,将语料库中每一句话进行词性标注,并生成该句子的模板向量Pi。遍历知识库中每个knowledge结点,获取到这个结点的答案模板向量Panswer,如果,则将Pi对应Panswer部分的句子Si截取出来。这里符号同上一节的6)步骤中含义相同。对提取的句子Si建立一个answerDetail结点,该结点的属性用knowledge结点中的answerPattern和answerFeature属性指出的词性标签名填写,属性值用这些词性标签对应的值填写。根据knowledge结点的exactAnswer属性指出词性标签对应的词添加answer子节点。将根据Si建立的answerDetail结点添加到这个knowledge结点下。本章小结本章完整介绍本文提出的对话知识库构建方法。首先讲述了这个方法是如何产生的,其次分析了这个方法构建对话库的可行性,得出了利用该方法建立基于事实性对话知识库的理论可行。接下来提出了句子模板生成、具体问题和对应答案关联特征提取的方法。最后详细地描述了如何利用生成的模板和提取到的特征从语料库中建立和更新对话知识库。知识库构建系统本章将要描述一个面向机器人学习的对话知识库构建系统IdiotTalker。该系统基于第二章中提出的知识库构建方法,它能利用语料库完成对话知识库的构建,并且利用构建的对话知识库进行简单对话。系统需求分析利用上面提出的对话知识库构建方法,我们希望能够设计出一个系统,该系统与人的交互过程如下:对用户首次输入的对话问题,系统给出“这个问题我不懂,你能教我吗”响应,然后请求用户给出该对话问题的回答答案。用户给出这个问题的答案,并指出这个答案中包含的精确答案。系统利用用户给的这个[问题,答案,精确答案],尝试从中生成问题模板和答案模板,达到从一个具体的问题到该类问题的认知效果。系统用学会到的答案模板在语料库中去检索所有符合这个模板的语句,并采用异步方式,将这些语句组织成这类问题的答案知识库。这类问题的答案知识库构建完毕后,向用户给出响应信息“我懂了,谢谢”。当下次再遇到这类问题时,系统采用异步方式,尝试从知识库中检索这类问题的答案,并将答案呈现给用户。系统可行性分析在上一章2.1.3节中论述了构建方法的理论可行性,从理论上证明了基于模板自动生成的方法可以用来构建基于事实的对话知识库。下面将分析该方法构建对话知识库的实际可行性。如2.4节中给出的对话知识库生成过程,我们可以得出完成基于模板生成的对话知识库构建系统,主要内容包括以下四个方面:收集含有事实性内容的语料库;完成语料库中句子的词性标注;将生成好的对话知识库以XML语言格式写入磁盘;检索和更新基于XML格式的知识库。关于事实性内容的语料库可以通过多种方法获取,可以手工从网上摘取一个小型的语料库用来研究系统的效果,也可以直接利用别人已经收集好的语料库。本系统中为了验证前面的提出的方法的可行性,因此,自己手工在网上收集了一些事实性的语料。对于词性标注这一部分的工作,目前许多分词工具可以完成对句子词性的标注。常用的有百度员工fxsjy的jieba分词、哈工大社会计算与信息检索研究中心的LTP、中科院的ICTCLAS、清华大学自然语言处理与社会人文计算实验室的THULAC、FudanNaturalLanguageProcessingGroup的FudanNLP和斯坦福的CoreNLP。综合考虑以上各种工具的可获得性和使用复杂程度,本系统决定采用哈工大社会计算与信息检索研究中心的LTP为所有的句子进行词性标注[7]。上面3)和4)任务的主要内容都是操作XML文件,W3C制定了XML语言的格式规格,各种编程语言也都有对XML操作语言的支持,因此这两项任务也能通过学习具体编程语言如何操作XML文件得到解决。综合上述分析,基于模板生成的面向机器人学习的对话知识库在实际上也是可行的。系统结构由3.1节中得出的基于模板生成的面向机器人学习的对话知识库构建方法在实际编码实现上可行,故可以设计一套系统来生成和利用对话知识库。本文中设计一个名为IdiotTalker的系统,IdoitTalker系统从整体上分为三层4大模块,分别是最顶层的人机交互层,对话知识库管理中间层和最底层的数据表示层。它的系统结构如图3.1所示。图3.1中最顶层的人机交互层由具体的人机交互模块完成,其主要功能就接收用户的输入信息和向用户展示系统处理的结果信息。中间层的对话知识库管理层由对话知识库管理模块完成,该模块又进一步分为3个子模块,分别是图3.1中间层中最左边的对话知识库生成子模块,中间的词性标签模块和最右边的对话知识库检索模块。各模块的具体功能见后面系统具体编码实现章节。IdiotTalker系统IdiotTalker系统人机交互模块人机交互模块语句模板生成模块词性标注语句模板生成模块词性标注模块对话知识库检索模块关联特征提取模块关联特征提取模块知识库创建模块知识库创建模块知识库更新模块知识库更新模块对话知识库语料库对话知识库语料库图3.1IdiotTalker系统结构使用工具介绍工欲善其事必先利其器。在具体的编码开始前,必须要先决定在什么样的平台下开发和使用何种语言开发。虽然前面分别论证了基于模板生成的面向机器人学习的对话知识库构建方法在理论和实际上是可行的。但是具体采用什么样的编程语言和使用何种平台对开发的效率还是有很大影响。本系统中主要借助的外部工具为词性标注工具,综合考察了各种词性标注工具,本系统决定采用哈工大社会计算与信息检索研究中心的LTP为所有的句子进行词性标注。因为LTP平台提供的词性标注工具不需要自己配置环境,可直接通过http请求完成。这就使得后续的开发语言和开发平台不受限制,只要是支持http协议的编程语言和平台都可以选择。因自己平时使用Windows平台的情况多,对Windows平台的操作更加熟悉,故本次系统的开发在Windows8.1下进行。最后是编程语言的选择,因为系统生成的对话知识库是以XML格式存储的,综合比较了C++、java和C#三种编程语言,结合它们对XML数据操作的方便性和自己的熟悉情况,最终决定采用C#这门编程语言。Microsoft在正式场合把C#描述为一种简单、现代、面向对象、类型非常安全、派生自C和C++的编程语言,C#非常类似于C++和Java[8]。C#对http网络编程和XML文件处理提供了很好的支持,可以让我们减少编码量,从而能更集中精力于对构建知识库方法的实现。系统编码实现选择好编程语言、开发平台和分词工具后,下一步的任务就是按照基于3.2节中给出的系统结构,实现各模块指定的功能。本系统要实现的主要功能是中间层对话知识库管理模块功能。最底层的数据表示,由于语料库本身只提供语料信息,因此可以直接以文件夹的形式存储即可。对话知识库本身也只是结构化地存储对话内容,对它的生成和检索部分放在对话知识库管理模块中。因此,最底层的数据表示层不需要有编码工作。词性标注模块词性标注模块是本系统的基础,本系统最主要的思想就是利用句子的词性对问题和答案进行模板生成,故在进行词性模板生成前必须完成词性标注模块的功能。如3.3节中介绍,本系统采用LTP(语言云技术平台)工具的词性标注。如语言技术平台官方网站上介绍的,LTP对个人研究者及非盈利项目提供源代码,可免费试用该平台提供的功能。同时LTP的使用方式也是非常简单,只需要根据它提供的WebAPI构造相应的参数即可。不过在使用LTP前还得先在其官方网站上申请一个账号,用于提供身份验证信息的APK_KEY。具体操作方法可以去LTP官方网站上了解,此处不详细介绍。LTP的http接口的构造参数如图3.2所示。调用WebAPI接口的方式很多,但在本系统需要把这种调用封装成一个模块以便后面进行复用,故对此建立一个名为Parse的类,Parse类的任务就是完成对句子的词性标注。Parse类的属性对照图3.2,分别为HttpUrl表示WebAPI的地址;Userkey用于身份验证的唯一秘钥;Pattern可选的分析模式,包括分词(ws)、词性标注(pos)、命名实体识别(ner)、依存句法分析(dp)等;Format表示已何种形式返回分析后的结果。为了便于参数的填写,根据图3.2每个属性的枚举值,设置一个名为HttpParams的参数类,该类含有2个子参数类,分为名为Pattern,Format。它们含有一些字符串常量,它们对应表中的具体枚举值。Parse类中最重要的方法是一个名为Analyze的方法,该方法接收一个字符串,然后根据前面的属性和LTP通信完成Pattern模式指定的分析。图3.2LTPAPI调用参数说明Analyze函数原型为:publicstringAnalyze(stringtext)。传入参数text代表要进行词性标注的句子;返回值以字符串形式表示。本系统中为了处理的一致性,对Parse的Format参数采用的是xml,即以xml格式返回词性标注后的句子。Analyze的实现代码下:public

string

Analyze(string

text)

{

string

results

=

"";

string

httpParameter

=string.Format("{0}?api_key={1}&text={2}&pattern={3}&format={4}",HttpUrl,UserKey,

text,Pattern,Format);

HttpWebRequest

request

=

WebRequest.Create(httpParameter)

as

HttpWebRequest;

try

{

request.AllowAutoRedirect

=

true;

request.Method

=

"GET";

reuest.ContentType

=

"application/x-www-form-urlencoded"HttpWebResponse

response

=

request.GetResponse()

as

HttpWebResponse;

StreamRaer

resultStream

=

new

StreamReader(response.GetResponseStream(),

Encoding.UTF8);

results=

resultStream.ReadToEnd();

}

catch(Exception

e)

{

Console.WriteLine("Http

Request

Error:

"+e.ToString());

}

return

results;

}下面将描述如何用C#编程语言完成WebAPI的调用。C#编程语言内置了一个名为HttpWebRequest的类,它是.Net中对Http协议的具体实现。该类提供了一个静态类方法Create,接受一个URL字符串参数。该方法返回一个用指定URL参数创建的HttPWebRequest实例。获取到HttpWebRequest实例后就能用它的成员函数GetResponse,该方法从构建HttpWebRequest中的URL指定的服务器获取到分析结果。GetResponse方法返回值类型为HttpWebResponse,可从这个类型中将返回的具体分析结果以流的方式获取到,然后将这种流用StreamReader包装成文件流的形式,就可以像文件一样操作返回的词性标注结果。下面的XML是调用LTP平台进行词性标注后的结果展示。<?xml

version="1.0"

encoding="utf-8"?>

<xml4nlp>

<note

sent="y"

word="y"

pos="y"

ne="n"

parser="n"

semparser="n"

lstmsemparser="n"

wsd="n"

srl="n"

/>

<doc>

<para

id="0">

<sent

id="0"

cont="张明刚才去哪儿了?">

<word

id="0"

cont="张明"

pos="nh"

/>

<word

id="1"

cont="刚才"

pos="nt"

/>

<word

id="2"

cont="去"

pos="v"

/>

<word

id="3"

cont="哪儿"

pos="r"

/>

<word

id="4"

cont="了"

pos="u"

/>

<word

id="5"

cont="?"

pos="wp"

/>

</sent>

</para>

</doc>

</xml4nlp>

LTP词性标注结果的格式中为每一段话创建一个para节点,然后为para对应段中每句话创建一个sent节点,最后再为sent节点中每个词用word标签标签,对应的pos属性为该词的词性标签,id属性表明了这个词在该句中的位置,cont属性用于指示这个词的内容。更多具体的格式表示请参考LTP官方网站的结果表示详细说明。知识库生成模块将词性标注部分封装成模块后,下一步就就可以利用该模块对所有的目标语句进行词性标签并根据词性标签的结果生成模板。知识库生成模块主要包括两大功能即从无到有生成一个知识库和对已有的知识库利用新语料进行更新。这两大模块都要共用的功能是语句模板生成、问题和答案关联特征提取、知识库节点生成。为了更好的复用代码故先实现这3个公共函数。语句模板生成函数负责的主要任务就是对利用前面2.2.2节语句特征选取策略完成该语句的的模板生成。由其提供的功能可以设计如下的函数原型:stringGetPattern(stringxmlSeg)。其中参数xmlSeg是以XML格式表示的句子词性标注结果,XML格式的词性标注结果见3.4.1节中XML结果表示。该函数返回结果为以字符串形式存储的模板向量,每个向量分量之间用空格分割。考虑到在实际生成模板的过程中我们丢弃了很多没有实际意义的虚词,生成的模板向量中,每个词性标签符号并不是与原句子中每个词的位置一一对应,因此我们需要添加额外的位置信息,即返回的模板向量中每个词性标签前面还有一个ID,表明了该词性标签在原句子中对应的位置,这个ID值来自于XML格式词性标注中的id属性。根据上面方法的描述,具体的实现就是首先对XML格式的词性标注结果中,依次遍历所有的word结点,然后查看该word节点的pos属性值是否在2.2.2节给出的忽略词性集I中,如果不是,则将这个word节点的id属性值和pos属性值添加到返回结果串的末尾,id和pos之间用逗号分隔。GetPattern的具体实现代码如下。

public

string

GetPattern(string

xmlSeg)

{

StringBuilder

sb

=

new

StringBuilder()

;

try

{

XDocument

xdoc

=

XDocument.Parse(xmlSeg);

foreach

(XElement

xele

in

xdoc.Descendants("word"))

{

if

(!_funcitonWord.Contains(xele.Attribute("pos").Value))

sb.AppendFormat("{0},{1}

",

xele.Attribute("id").Value,

xele.Attribute("pos").Value);

}

}

catch

{

StackTrace

st

=

new

StackTrace(new

StackFrame(true));

new

Exception(string.Format("Error

in

{0}

Load

xml

segment",st.ToString()));

}

return

sb.ToString();

}

调用词性标签模块和模板生成函数后我们能够得到问题、答案和语料库中句子的模板向量。现在系统已经能从具体的句子抽象到“类”的层次了,但是系统还不能将“类”的信息匹配具体的实例上。所以,下一步的任务就是具体的[问题,答案]关联特征提取。利用2.3节中介绍的问题与答案关联特征提取方法,采取的策略就是利用一个两重循环,外循环为问题模板向量中的词性标签,内循环为答案模板的词性标签。当答案模板中词性标签和问题模板中的词性标签相同时,再查看他们对应的词是否也相同,如果相同,则将这个词性标签的在问题模板向量和答案模板向量中的位置记录下来。根据这个思路关联特征提取函数的原型可以设计为:List<Tuple<string,string,int,int>>LearnFeatures(stringposQuestionXml,stringposAnswerXml)。参数posQuestionXml为经过词性标注后的问题语句;posAnswerXml为经过词性标注后的答案语句。返回值为四元组集合。其中四元组中各项的含义为:第一项为词性标签,第二项为该词性标签在句子对应的具体词,第三项为该词性标签在问题语句中的索引,第四项为该词性标签在答案语句中的索引。下一步就是利用学到的答案模板去语料中找符合该模板的语句,然后将符合模板的部分截取出来,再利用学到的问题和答案关联特征去整理这些语句。这一步中的难点主要集中于在词性标注后的语句中找到和答案模板相匹配的部分并把他们截取出来。为了是问题简单化,这里把词性模板向量去掉ID部分,只保留词性标签部分。这样就可以利用串匹配方法在语句模板向量中检索答案模板向量子串。当查到句子模板向量中含有答案模板向量时,我们再讲句子中对应答案模板向量中词性标签的的这些位置提取出来,方便下一步处理这些位置的具体词。函数原型如下:string[]LocateAnswerPattern(stringposSenXml,stringanswerPattern)。参数PosSenXml为语料库中经过词性标注后的一句话;answerPattern为消除ID属性后的答案模板向量;返回值为字符串数组,每个字符串包含ID和词性标签两种信息,这两种信息描述了该句中哪些位置的词性标签对应答案模板向量的词项标签。最后一步就是整理这些符合答案模板向量的句子,然后将它们写入知识库。在写入之前首先要将每条语句进行整理,转变为XML结点。FillDetailNode函数用来处理将整理好的句子转变为XML结点。它将一条整理好后的语句转变为一个answerDetail节点。循环调用它,就可以对一类问题的所有语料信息转变answerDetail结点。FillDetailNode函数原型如下:XmlElementFillDetailNode(XmlDocumentxdoc,List<Tuple<string,string>>attributes,stringexactAnswer)。参数xdoc是因为C#要子节点和父节点必须出自相同的上下文,因此xdoc表示了知识库的文档节点;attributes表示了answerDetail节点的所有属性集合;exactAnswer是answerDetail子节点answer的具体内容。Attributes集合中每个元组的第一项为属性名,第二项为具体的词,这些属性值根据问题--答案关联特征和语料库中句子的具体词得到。FillDetailNode函数已经完成,现在只需要对每一类的问题,生成答案模板向量,然后利用模板向量去语料库中抓取所有符合这个模板的语料,整理这些语料。下面用AddNewPattern函数来处理这些任务。AddNewPattern的任务就是调用前面已经写好的函数,然后由新来的[问题,答案]利用语料库生成这一类问题的对话知识库库。AddNewPattern函数主要代码实现如下:public

int

AddNewPattern(FileInfo

file,

string

questionPOS,string

answerPOS,string

exactAnswerPOS)

{

XmlDocument

xdoc=new

XmlDocument();

xdoc.Load(_knowledgeBasePath);

//获取模板并消除模板中的ID信息

string

questionPattern=EliminatePatternID(GetPattern(questionPOS));

string

answerPattern=EliminatePatternID(GetPattern(answerPOS));

string

exactAnswerPattern=EliminatePatternID(GetPattern(exactAnswerPOS));

//获取问题和答案关联特征

List<Tuple<string,

string,

int,

int>>

features

=

LearnFeatures(questionPOS,answerPOS);

StringBuilder

sb

=

new

StringBuilder();

//准备knowledge节点的属性信息

int[]

answerFeatureIndexes

=

new

int[features.Count];

for(int

i=0;i<features.Count;i++)

{

sb.Append(features[i].Item3.ToString()+"

");

answerFeatureIndexes[i]

=

features[i].Item4;

}

string

quesFeatureIndexes

=

sb.ToString();

int[]

exactAnswerIndexes

=

ExactAnswerPos(answerPOS,

exactAnswerPOS);

//填充knowledge节点属性

XmlElement

xele

=

xdoc.CreateElement("knowledge");

xele.SetAttribute("questionPattern",questionPattern);

xele.SetAttribute("questionFearture",quesFeatureIndexes.Trim());

xele.SetAttribute("answerPattern",answerPattern);

xele.SetAttribute("answerFeature",strAswerFeaIndexes);

xele.SetAttribute("exactAnswerPosition",

strExactAnswerIndexes);

//获取语料库中所有符合答案模板的语句

List<string>

targetSents=

Extractor.ExtractSentence(file,answerPattern);

XmlElement

quesDetail;

//对符合答案模板的语料信息进行整理并装填为answerDetail结点

foreach

(string

sent

in

targetSents)

{

string[]

splitedPattern=

LocateAnswerPattern(sent,answerPattern);

List<Tuple<string,

string>>

exactAnswerTuple

=

ExtractFeature(sent,splitedPattern,exactAnswerIndexes);

quesDetail

=

FillDetailNode(xdoc,ExtractFeature(sent,splitedPattern,answerFeatureIndexes),sb.ToString());

xele.AppendChild(quesDetail);

}

xdoc.DocumentElement.AppendChild(xele);

xdoc.Save(_knowledgeBasePath);

return

targetSents;

}

AddNewPattern的参数依次为语料库文件路径,词性标注后的问题,词性标注后答案,词性标注的精确答案。它的主要逻辑过程如下:用C#的XDocument类加载已有的知识库。将EliminatePatternID函数去除参数中词性标ID信息去掉以便进行模板向量串匹配。用LearnFeatures函数提取关联特征。从提取到的关联特征中获取它们的索引值。用ExactAnswer函数获取精确答案的索引值。用XElement的SetAttribute方法填充knowledge节点属性。用ExtracSentence方法提取出指定文件中所有符合答案模板的目标语句。对提取来的每条目标语句调用LocateAnswerPattern方法,获取答案模板所在具体内容;调用ExactFeature方法或关联特征具体词;调用FillDetailNode方法生成这天语句对用的answerDetail节点,并将生成的节点添加到父节点中。保存新生成的知识库。知识库检索模块知识库检索模块对生成的知识库进行检索。因为知识库是结构化的,且W3C指定了XPath标准,故可以很方面的对知识库进行检索。知识库结点中带有问题模板的描述信息,故对于给定的问题,按照2.2.2中指定的方法进行问题模板生成,然后利用这个模板去知识库中和每个knowledge结点的questionPattern匹配,如果匹配到了这这个结点对应的内容即为这个问题的的答案知识库,然后利用问题和答案关联特征,在这个知识库中找到这个问题对应的答案。检索的结果由以下三种:这类问题还没有学习过,即知识库中不存在这类问题的模板。这类问题已经有学习过,但缺乏这个问题的具体答案。这类问题已经学习过,并且语料库中也有这个问题的答案。用GetAnswer方法来进行语料库的检索,GetAnswer方法的原型如下:stringGetAnswer(stringquestion)。参数为具体的问题,返回值为知识库检索结果。根据前面的分析,返回结果有三种,分别是空串、“语料信息不足,无法回答该问题”、知识库中answer结点的内容。这三种返回结果分别对应了上面的三种情况。GetAnswer的关键部分实现代码如下://加载知识库

XDocument

knowledgeBase

=

XDocument.Load(_knowledgeBasePath);

//获取问题模板向量

string

patternWithoutID

=

EliminatePatternID(questionPattern);

//获取所有的knowledge节点

XElement

knowledge

=

knowledgeBase.Descendants("knowledge").Where(ele

=>ele.Attributes("questionPattern").Value

==patternWithoutID).FirstOrDefault();

bool

isRightNode

=

true;

if

(knowledge!=null)

{

//获取区分不同问题的特征下标

string

[]quesFeatureIndexes

=

knowledge.Attribute("questionFearture").Value.Split('

');

foreach(XElement

answerDetail

in

knowledge.Descendants("answerDetail"))

{

isRightNode

=

true;

foreach(var

str

in

quesFeatureIndexes)

{

string

quesCont

=

questionDoc.Descendants("word").Where(ele

=>ele.Attribute("id").Value

==

wordIDs[Convert.ToInt32(str)].ToString()).FirstOrDefault().Attribute("cont").Value;

string

knowledgeCont

=

answerDetail.Attribute([Convert.ToInt32(str)]).Value;

if

(quesCont

!=

knowledgeCont)

{

isRightNode

=

false;

break;

}

}

if

(isRightNode)

{

answer

=

answerDetail.Descendants("answer").FirstOrDefault().Value;

break;

}

}

if

(!isRightNode)

answer

=

"语料信息不足,无法回答该问题";

}

GetAnswer方法的主要逻辑过程如下:用C#XDocument类从磁盘上加载知识库。用GetPattern方法获取传入问题的模板向量。用EliminatePatternID方法去除问题模板向量中的ID信息。从XML知识库检索是否有这个3)中问题模板向量对应的knowledge节点。若没有直接将返回值置空串并结束检索。若知识库中含有对应的knowledge节点则转5)。对这个knowledge节点下的所有answerDetail节点依次遍历。若当前遍历的节点是对应问题的答案节点,将返回值置answerDetail子节点answer的文本值,并将是否检索到正确答案的标记isRightNode置true。根据isRightNode人机交互模块本系统中人机交互模块由C#的WPF图形化界面完成。人机交互模块整体上由四部分组成,从上到下分别是窗口标题栏,对话内容显示面板,用户输入区,消息按钮栏。对话内容显示区和用户消息输入区。对话内容显示面板上有一些初始化的语句。界面中的按钮分别绑定了对应的事件,比如右上角的“X”按钮绑定应窗口关闭。本界面中最重要的按钮是发送按钮,当发送按钮按下后,对话内容要显示用户输入的内容,同时要采用异步的方式对输入问题进行检索,检索过程中不允许用户再次发送消息。或者根据用户输入完毕的新问题类型尝试构建知识库。发送按钮事件绑定的主要代码如下:private

void

button2_Click(object

sender,

RoutedEventArgs

e)

{

if

(textBox.Text

!=

string.Empty)

{

switch

(sessionState)

{

case

SessionState.WaitQuestion:

question

=

textBox.Text;

stackPanel.Children.Add(CreateLabel(textBox.Text,

true));

Task.Factory.StartNew(AsynRetrivalAnswer);

button2.IsEnabled

=

false;

button2.Background

=

new

SolidColorBrush(Color.FromRgb(109,

109,

109));

br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论