版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章绪论1.1课题研究的目的和意义从世界上的发展趋势来看,AI技术很有可能引领下一次工业革命,因为人类创造出来的这些AI技术,使得机器能够独立“思考”,当机器学会了独立“思考”,机器就不单单能代替人类完成一些重复性劳动,也能完成一些拥有了“思考”才能完成的任务,包括但不限于交通工具的自动驾驶,也可以实现智能对话机器人。同时,实现人工智能的核心手段是MachineLearning。在这个大数据的时代,通过电脑对数据的分析,规律自然就被总结出来了,使电脑能够预测那些看起来并没有规律的事件。深度学习是机器学习的一种形式,它采用神经网络计算模型来模拟大脑的推理原理并产生结果[1]。因此,深度学习、机器学习和人工智能不可避免地联系在一起,如图1.1所示。图1-1AI、ML、DL关系人工智能是一种赋予人类智能机器的先进技术。足够的新机器发动下一次互联网革命。人工智能是未来的基础科学,它已经影响了地球上的方方面面,信息技术的发展也由此加速起来。1950年,马文·明斯基(后来被称为“人工智能之父”)利用神经网络技术设计了世界上第一台计算机,即人工智能的开端。图灵测试是由被誉为“计算之父”的艾伦·图灵在1950年提出的。图灵测试表明如果超过30%的测试人员不能区分另一个是聊天机还是人,这种工具就可以完成图灵测试。根据图灵的假设,如果这个装置和这个人能够在不被称为一个装置的情况下进行流畅的对话,这个装置就会很聪明。今年图灵还勇敢地预言了未来喋喋不休的机器人的到来。图灵测试也吸引了学者[2]。图1、2显示了人工智能的发展。经过几十年的研究,人工智能蓬勃发展。图1-2人工智能发展历程bp算法的出现在1980年代后期,学者们开始重新研究机器学习,并引起了学者们热烈探讨。对bp算法的研究告诉了学者们,大量训练样本中是存在着某种统计规则的,而这些规则是能够被学习的,机器学习方法远远强于人类学习的系统。80年代后期,只有一个隐层节点人工神经网络有了新的外号,也被称为多层感知器。在1990s,支持向量机等浅表机器学习模型被普遍提出,有隐含层节点或没有隐含层节点。这些模型的理论研究和实施也取得了良好的效果。[3]2006年,在《科学》上发表了一篇论文来自UniversityofToronto教授JeffreySinton和他的学生RuslanSalahtinov,这篇文章的含金量很高,它的提出了两点结论:第一,可以面对深度神经网络训练的困难可以采用一层一层的初始化,与此同时利用没有监督的学习实现初始化;第二,特征学习的能力越强的人工神经网络拥有隐藏层越多,特征更能精确的表现数据,更适合用于分类[4]。1.1.2聊天机器人的研究背景及意义诞生于1966年的Eliza是最早在生活中应用的对话机器人,它是为了治疗心理疾病的病人和创造出来的,它最主要是用来跟病人对话,尽管Eliza使用的方法是人为地设定回复规则,但它仍受到用户的欢迎,这让学者和业界都很兴奋,关于聊天机器人的研究热潮也开始兴起。1980年,UCB的罗伯特·韦伦斯基(RobertWillensky)作为首席研究员,与其他研究人员合作,建立了UC计划。用户通过聊天机器人系统学习如何使用UNIX操作系统,UC聊天机器人可以了解其他人的需求,寻找解决方案,并通过语音对操作人员做出回应。无论从其工作原理还是最终效果来看,UC比Eliza更聪明,也更受业界关注[5]。1990年代,HughLebner在美国设立了AI年度大赛,优胜者将获得10K美元的奖金,并颁发印有勒布纳和图灵头像的金质奖章,该奖章的目的是为了完成图灵的遗愿,鼓励人们把精力投入到聊天机器人领域。让聊天机器人尽早完成图灵测试。如此一来,聊天机器人领域就获得了大量的关注和研究,最被受期待的聊天机器人是爱丽丝。聊天机器人爱丽丝是由RichardWallers开发的,并在1998年开放源代码给Alice的聊天机器人。利用AIML语言和模板匹配技术建立了Alice聊天机器人的回复模板和回复规则。AIML易于学习和使用,其一致性可靠、一致。是当前聊天机器人领域里这项技术扔被人们大量的使用。由于AIML的简单、稳定,勒布纳奖颁发了数次给Alice聊天机器人。尽管机器学习中存在非监督学习,虽然是通用的,但是深度学习为建立这样的模型提供了另外的新颖的方法,也为这些模型带来了很多便利,从而为基于深度学习的机器人提供了更好的对话性能。1.2国内外研究现状对话机器人不仅是许多人认为的娱乐工具,在各种各样的领域上它都有广泛的应用,只要与人对话相关的,都能用上它。打个比方,苹果公司上的SIRI语音助理就非常智能实用,用户可以通过语音向SIRI发出“设置一个明天九点钟的闹钟”、“发个朋友圈问有人一起吃饭吗”、“每天给张三发一条微信说明情况”等指令,SIRI语音助理就会帮你执行发朋友圈或者发一条微信,无需用户自己亲自去操作,因为语音助手的使用将消除许多无聊或不愉快的任务,允许人机对话。最近,中国市场上出现了一大批语音助手,其中大部分是以智能微型音箱的形式出现的,他们能根据用户的指令,完成相关动作,如播放音乐、查看天气等等。比如天猫的“天猫精灵”,小米的“小爱同学”,由于国外人工智能的工作开展的较早,总体的研究水平也比国内高,比如微软的“Cortana”,更加完善了系统,与用户沟通也更加顺畅。随着人工智能的发展,QA机器人领域的热度越来越高涨,是因为下一个时代的人机交流渠道很有可能是通过语音交流的,最基本的人机交流要求机器能够理解人类的指令。现在,聊天机器人还没有进入人工智能时代,它已经被应用于许多领域,尤其是移动互联网。所以,当前学术界和产业界正在不断投入到聊天机器人领域中,为争夺领先地位[6]。非面向任务的对话系统(也称为聊天机器人)专注于在开放环境中与用户通信,而面向任务的对话系统则寻求为用户完成特定的任务。聊天机器人通常使用生成方法或基于检索的方法部署。生成模型可以引起更合适的反应,否则在语料库中会被忽略。当前Seq2Seq对话系统的一个最困难的问题是,它们经常生成不相关或不清楚的、通用的、几乎无用的答案。这些回答通常包括一些无意义的短语,比如“我不知道”或“我很好”。另一方面,检索模型有大量的数据和平滑的响应。消息-响应匹配是高级检索过程的秘密,匹配算法必须在消息和应答之间架起语义距离的桥梁。1.3文章主要工作与章节安排本文提出了一种将Attention机制、长短记忆网络(LongShort-TermMemory,LSTM)和传统seq2seq模型相结合的聊天机器人对话模型。这篇文章的结构如下:第一章介绍引言,描述了该选题的设计背景和意义,具体的介绍了QA机器人的国内国外研究的现在的状况第二章主要介绍了聊天机器人的关键技术和方法。由于中文版之间不会出现空格,而且语法结构也比较复杂,因此针对中文版引入了相关的处理技术,包括中文分词,语料清理,句子标准化。第三章是在word2vec基础的语料预处理。对话过程中的一个重要环节就是语料的预处理,语料质量的优劣和词向量的训练结果都会对对话的最终表现产生影响。我们讨论了语言文本的表示,包括onehot编码,矩阵的分布式表示,基于神经网络的分布式表示,以及与word2vec相关的概念,包括huffman相关的概念,以及CBOW模型。在第四章中,我们首先讲述了几种学术上常用的神经网络模型,包括循环神经网络,LSTM。接着就是本文的重点,seq2seq模型,但是seq2seq模型有很大的依赖性,因此本章详细介绍了Attention机制。在传统的序列到序列模型中,会产生大量的无意义回复,笔者选用了集束搜索来解决这个问题。第五章讨论了实验设计,介绍了系统的大概情况在系统设计上遵循着配置灵活、代码模块化的思路,分为数据预处理器、训练模型、可视化展示3个模块。模块间的逻辑关系大致为:(1)语料预处理是把笔者从网络收集下来的原始语料进行初步的处理;(2)训练模型是一个基于TensorFlow的seq2seq模型,用来定义神经网络,进行模型计算;(3)用前端实现交互,调用API接口实现对话。第六章为总结和展望,总结了本文的内容,根据聊天机器人存在的不足给出了一些小建议。第2章聊天机器人的相关技术介绍这一章首先介绍了聊天机器人所使用的相关技术。2.1聊天机器人的关键技术聊天机器人系统结构如图2.1所示,共有四个模块语音模块、语言理解模块、对话模块、语言生成模块。图2-1chatbot的系统框架语音合成模块和语音识别模块这两个模块不在本文讨论的范围内,这里就不再详述了。借助自NLP技术,自然语言处理模块获取到用户的想法后,通过数据的方式表达出来,转化为具体的语义数据,然后交给下一个对话管理模块。由于多个模块之间可能存在作业冲突,操作会话管理模块必须提前做好准备,并保留会话管理模块来负责用户和聊天机器人之间的聊天过程。[7]本文研究的重点是自然语言生成模块,该模块利用多种自然语言生成技术对自然语言进行响应。目前,检索对话和生成对话是两种主要模式。以下部分将深入讨论自然语言解释、对话控制和自然语言生成模块。(1)自然语言理解模块将用户的意思以数据的形式转换为具体的语义数据。自然语言理解模块最关键的目的是将用户的语言转换成计算机可以理解的数据[8]。(2)对话管理模块负责组织自然语言解释和生成模块的工作,其关键技术有对话补偿、强化学习和对话状态识别等。(3)自然语言生成模块主要负责生成用户回复。聊天机器人通常使用生成方法或基于检索的方法部署。生成模型可以引起更合适的反应,否则在语料库中会被忽略。当前Seq2Seq对话系统的一个最困难的问题是,它们经常生成不相关或不清楚的、通用的、几乎无用的答案。这些回答通常包括一些无意义的短语,比如“我不知道”或“我很好”。另一方面,检索模型有大量的数据和平滑的响应。消息-响应匹配是高级检索过程的秘密,匹配算法必须在消息和应答之间架起语义距离的桥梁。各种深度学习模型的应用,如RNN模型、LSTM模型、注意力模型等,是新一代技术的核心。2.2中文处理相关技术2.2.1中文分词中文分词是将中文文本序列分割为若干独立词语的技术。把多个独立的字序列按一定规则分成一组的过程称为分词过程[9]。当前较为成熟的分词技术主要有三种,下面对这三种分词技术进行详细介绍。(1)基于字符串匹配的分词技术也称为机械分词技术,它根据某些规则将用户输入的待处理文本与一个通常规模很大的字典进行对比,假设在字典中找到了与字典相同的文本,那么就可以根据此规则对该文本进行分词。(2)语法和语义子系统以及分词子系统构成了基于理解的分词框架。基于综合的分词方案的目的是消除歧义,利用原语料库文本中的语法和语义知识解释句法,即模拟人脑思维。然而,中文信息有些复杂和难以理解,它不能完美地翻译成机器的数据格式[10]。(3)利用统计分词系统,利用训练模型和学习原理实现汉语不规则序列的分词。如最大似然分词和最大熵分词是目前应用最广泛的两种分词技术[11]。随着汉语语料库的建立和深度学习的研究和发展,越来越多的学者选择基于统计的汉语分词方法。2.2.2句法分析句子分析是与自然语言处理相关的核心基础技术之一,句子分析可分为句法结构分析和依赖分析两种[12]。在对句子进行句法分析时,确定同时划分句子中的“主谓宾定状补”,如下图2.2所示,确定每两个词之间进行语法关系。从图2.2里面可以看出,“吃”与“粉”形成动态关系,其中吃是v(动词)表示动作,粉是n(名词),“一”是表示数量的量词,ATT表示动态关系,在对句子进行分析之后,可以回答诸如“我吃了什么?”,“我吃了多少碗粉?”这样的问题,让聊天机器人能够更聪明地与人交谈。把句法结构分析和依赖分析结合起来,可以理解用户输入语句的依赖关系和语义[13]。一是让电脑能够理解句子的意思,从而找到到最完美的答案,第二个是如果互相依赖在此之前已经生成,分析它们的语义,还可以通过可信度匹配也能生成聊天回答。
图2-2句子依存关系图句子结构分析的目的在于判断一篇文章是否符合相应语言的语法要求,然后根据语法规范来分析一篇文章,首先要判断一篇文章是否属于某一语言范畴,其次,进行词义消歧。第三,分析文章的句法结构、语境和句法关系。作为一种强大的句法分析工具,它通常需要解决两个问题:一是句法形式的表达,二是词条信息的描述[14]。由于通用依赖树的出现,依赖解析的研究重点已经从通用依赖树转向更复杂的数据集标注。数据集的标注结果可用于体态识别或词性标注,并可作为不同任务的评价数据,因此得到广泛应用;第二,句法结构分析的语法集由固定语法集和僵化语法集组成,固定语法集和僵化语法集比较多;第三,依赖解析树易于标注,具有较高的解析精度。现有的依赖分析方法主要有PCFG、词法PCFG、基于转换的依赖分析等主流的依赖分析方法(基于贪婪决策行为的装配语法树)。2.2.3计算短文本相似度就当前而言,短文本相似度计算是NLP技术中的核心技术,即如何表达两个或多个短文本之间的相似度,即短文本之间有很高的相似度。语篇之间语义和语法结构的相似性越高,反之就越低[15]。目前,短文本相似度计算主要采用三种算法,第一是基于语料库的TF-IDF算法、第二是最小编辑距离算法,第三是短文本相似度计算算法。目前业界研究语料库的短文本相似度时,多数都是选用上下文的统计描述方法,因为上下文可以提供充分的语义信息更好的为词语的定义。词向量空间模型(VSM)是一种广泛应用的基于统计的词相似度计算方法。算法复杂度较低,模型易于实现。(1)VSM提前选取一组特征词,然后计算特征词集和每个词之间的关联(通常是根据在实际大型语料库中上下文中出现的频率来衡量)。所以每一个词都有一个相同的词向量的维度,然后多个词之间的相似度就由这个公式得到,如公式(2-1)所示。(2-1)NDG的中文翻译为,谷歌的标准距离越大代表越相似,范围从0到1。在这些词中,(x)、(y)(分别表示含有单词x,y的网页数量)、((x,y)、(n,y)(同时包含单词x,y)和(N,google引用的网页总数)。距离法用于计算文本序列的相似性,其原理如下:目前有两个短文本序列A和B,其中B是参考序列,执行以下步骤:序列A删除单词;序列A增加单词;序列A替换单词。循环执行,序列A完全转换为序列B,且中间的操作次数记为E-D(A,B)。一个二维数组E-D[i][j]是表示转换为短文本序列B的前j个字符由短文本序列A的前i个单词转换而成所需要的最小操作数。因此,E-D[i][j]的递推式如下:(2-2)(2-3)编辑距离越小,得到更加相似的两个字符串。相反,它越不一样。(3)词频-反向文件频率,即(TermFrequency-InverseDocumentFrequency)。termFrequency指的是某个单词的词频[16]。与此同时,为了避免对长文档的倾斜,最后的数字通常会归一化,也就是说,最后的数字在0到1之间。在公式2.4中,TF-IDF算法解决了哪一个词最具代表性的问题,并给出了计算公式。(2-4)Tw表示文件中的总字数,sw
(2-5)c指文集中的文件数,c指含有w词语的文件数量。在中文里经常使用回复,如“收到”、“嗨”等,每一篇文章中都可能含有他们,而且更经常出现在每一篇文章中,这时TF-IDF就变小了。所以,TF-IDF会删除掉常用词,留下具有更高重要性的词。TF−IDF=TF∗IDF(2-6)2.2.4词义消岐在NLP技术中,消除词语的歧义是一个需要解决的重要问题。与其他语言相比,一词多义是汉语难以理解的原因之一。由于汉语言传承了中华文明上下500]多年,词义可以是经常变化的。随着时间的推移,单词在不同的上下文中会有不同的含义[17]。例如,在汉语中,“负担”这个词根据上下文有不同的含义。目前使用的深度学习消歧算法有两种:有监督的词义消歧和无监督的词义消歧。下面的部分将深入讨论这两种算法。(1)有一些技术用于监督词义消歧。利用共享知识的词义消歧过程,可以将两种语言关联起来,并采用基于大量双语语料库的教学模式进行词义消歧。基于贝叶斯分类器的消歧工具。下面的语境与条件机会、语境和一些多义解释有关。两者都基于一个前提,即一个随机变量持有另一个随机变量的信息。假设两个随机变量Y和X的概率分别为p(Y),P(X),联合分布概率的代数式为p(X,Y),那么计算公式为:Ix;y=pX,YlogX,Y不断重复迭代训练的语料中,I(X;Y)继续减少,而I(X;Y)不再减少小时结束训练的次数。在机器翻译系统中,基于互信息的词义消歧是最有效的方法。不管是两种不同语言语料的局限性,还是多种语言语料能够识别歧义的情况,都是有限的。采用Bayes分类器词义消岐方法的主要思想是,在词义消岐的应用中,所有多义词的语义都与其所处的环境和所处的语境有关,贝叶斯定理用于估计某些情况下发生事件的可能性。语境和意义一般都是实现词义歧义的环境和语境。其根本原因在于中文多义词的意义都与该词所处的环境和所处的语境有关[18]。多义语义确定方法是根据词义语料库计算该多义语料库在当前环境和当前语境下的所有语义项目的概率,将概率最高的语义项目视为该多义语料库在当前环境和当前语境下的意义,假设语境记c,语义记s,多义词记w,而多义词记w在语境c下具有语义s概率p(s|c)。psc=p(c|s)p(s)/p(c)在p(s|c)中,语义的最大似然是S,而P(c)是定值的,此计算只需要考虑分子的最大值,因为上下文c由几个词v组成,所以可以将p(c|s)视为一个p(v|s),也就是说,要求最大的p(s|c),即求一个p(v|s)的最大值,而当文本数据很多时,常采用极大似然概率法来求p(s)。(2)无请注意解读单词含义的技巧。无监督词义识别是可行的,因为无监督词义消歧困难,且词义不需要标注。贝叶斯分类器常用于无监督词义消歧。然而,与基于贝叶斯的监督词义消歧方法不同的是,该方法只对训练语料的一部分进行标注。参数在训练过程中随机初始化,然后对参数所用的概率值进行重新估计,常用的算法是最大期望法,这里的参数估计不是基于有标注的训练预料,而是先随机初始化参数p(v|s),然后重新估计这个概率值,也就是对w的每一个上下文c计算p(c|s),这样可以得到真实数据的似然值,回过来再重新估计p(v|s),重新计算似然值,不断的循环迭代和更新模型参数,最终得到分类模型,可以对词进行分类,那么有歧义的词在不同语境中会被分到不同的类别里[19]。所以,遇到不同的语境时,同样的词会因为不同的意思被分到不同的语境里。2.2.5停用词的删除与结构性词语汉语中,许多词对语义没有影响,如“和”、“为”等词,只是作为文本的语法结构而存在。因此,在进行自然语言处理任务时,通常会将这些词移除,通过对比停用词表,可以将这些没有任何意义的词移除,从而简单化语料,大幅度的提升语料处理的效果。2.3本章小结这一章的第一部分首先介绍了Chatbot当中运用到的关键技术。由于中文并不使用空格,且中文语法结构比外文要复杂得多,因此第二小节对中文处理中使用的汉语文本分词、如何计算短文本的相似度、消除词语的歧义、删除停用词和句法分析等相关技术进行了介绍,其中最重要的技术就是短文本相似度计算方法。
第3章word2vec3.1文本的表示形式3.1.1分布式矩阵表示法:在这里,矩阵是指“单词-上下文”矩阵,它可以用来表示单词和句子的分布情况。在这些语言中,矩阵的行表示单词的分布,矩阵的列表示单词的上下文环境的分布,这样,会话矩阵中的所有元素都描述单词的上下文单词分布[20]。在这种情况下,矩阵中所有行和列的每一个值都是词和上下文词联合出现的计数,然后使用TF-IDF算法、进行加权和平滑处理。当遇到一个矩阵的维数比较高,且很稀疏时,当矩阵维数较高且稀疏时,矩阵分解为维数较低的稠密矩阵,分解方法是奇异值分解。以矩阵为基础的分布式表征的代表模型是用GloVe矩阵做表征的代表模型,其计算公式如下:(3-1)vi表示的是是单词i词向量vj是j的词向量,bj和bi是标量,N表示语料包中语料的数量,N(3-2)3.1.2分布式神经网络表示神经网络模型中使用的词嵌入技术被称为分布式表示技术,它是将人类语言术语转换为计算机能够理解的向量的过程,而神经网络模型具有很大的灵活性,更多的上下文信息就可以被存到由词嵌入技术产生的矢量[22]。Skip-Gram是一种神经网络模型,常用于词嵌入。图3-1显示了一种典型的神经网络结构。图3-1神经网络结构从图3-1可以看出,矩阵W和U分别为神经网络的输入和输出隐含层权重矩阵,矩阵P和Q为神经网络的输入和输出隐含层的偏差矩阵。如前所述,对于语料库中的词w,此时c是该词位于语料库前面的n-1个词,也就是说,w和c共同构造一个二元训练样本(c,w),c可以理解为该词w的上下文[23]。也就是说,输出层的输出是:(3-3)(3-4)隐藏层中有一个激活函数,tanh函数就是激活函数。操作后的yw(3-5)方程式3.5中的iw表示语料w在语料中的位置。当P(w|c)3.2关于WordEmbedding简而言之,词嵌入(也称为分布式向量)是一种将自然语言转换为计算机可读向量或矩阵的技术。由于必须考虑术语的语义(同义词)、语料库中单词之间的关系(上下文)以及如何处理动态向量的维度,,等等,现有的代码中有基于神经网络的word2vec、One-hot等,word2vec为了模拟从隐藏层到输出层的学习过程,使用了Huffman树。,摒弃了一些方法,大大简化了运算过程,对输入的全部词向量求均值,然后取平均值。该模型采用了逐级搜索技术,利用哈夫曼树实现了隐层到输出层的映射。3.2.1Hufman树的概念Hufman又称最佳二叉树,具有最短的路径长度。解释,见图3-2:图3-2哈夫曼树其中带权路径长度分别为:图a:WPL=5*2+7*2+2*2+13*2=54图b:WPL=5*3+2*3+7*2+13*1=48结果表明,图b的加权路径长度较小,从而证明了图b是Hufman树(又称最佳二叉树)。Hufman树的构建过程包括以下步骤:(1)先选出空节点:左子树和右子树都是作为根节点的空节点。(2)再中选择两个根节点权值最小的树,加到新数的左右两侧,左根节点和右根节点的权值个数用于衡量新树中其他根节点的权值。在这种情况下,右子树的权值应该大于左子树的权值。(3)将这两棵树从森林中移除,同时在森林中增加新树。(4)循环执行上述步骤的2、3步,直到只有在森林中,这棵树就是Huffman树。图3.3是Hufman树的构建过程:
图3-3哈夫曼树构建过程3.3语料处理技术3.3.1语料库在统计自然语言处理中人类用文本来代替语料,因为语料是不可观测到的。在语言学上,语料库一词指大量的文本。它具有三个显著特征:(1)语料库中储存的是实际使用该语言时确实存在的语言材料。(2)语料库以电子计算机为载体,提供基本的语言知识资源,但不等同于语言知识。(3)要使真正的语言材料成为有用的资源,必须加以处理(分析和处理)。语料库的内容和质量决定了模型最终能达到的高度,语料库的清理工作也十分重要,它直接决定模型的效果,甚至会影响模型的收敛性、答非所问、语法错误等等,因为语料库的选择处理很重要。这个项目是一个对话机器人项目,所以所选的语料主要是一些问答对,开放数据也有很多可以下载,存储格式是第一行为问题,第二列为答案,等等。从语料的数量和质量两方面选择招商银行金融语料。3.3.2语料预处理语料处理的主要流程如图3-4所示,在我们从网上获取到合适的语料库后开始对原始的语料库进行加工处理来满足模型训练的要求,提高训练效果。
图3-4语料处理流程图(1)语料清洗就是从语料中找出人们想要的东西,清理掉不要想要的、被认为是噪音的内容。常用的数据清理方法有:人工去掉重复语料、删除不要的等,或者设计出我们想要的内容规则利用代码批量化提取等等。因为语料本身可以实现大部分的清洗功能,所以我们只需进行分词、清除停用词等处理。(2)分词汉语语料库文本的集合,看你选择的语料库是包含的什么语料,通常是文章或者问答对话,一般来说,句与段之间的词语是连续的,他们不是毫无意义的。在文本挖掘,且分析过程中,我们希望文本处理的最小单位是单词或词语,因此需要分词算法来分割所有的文本。最终的分词效果如图2.3所示:图3-5分词效果图(3)句子规范化其实这一部分是进一步的数据清洗过滤,将句子规范化,主要处理的内容是分词后的空格,多余的符号以及无法使用的字符,主要的处理方式包括正则表达式,遍历判断等。其中主要的处理正则表达式的处理包括:取出分词处理后的语料;将斜杠\过滤;将较多的…,···,/.统统用…代替;将较多的。,/。统统用。代替;将较多的!,?分用!,?代替;将非中英文的字符以及"。,?!~·过滤;将ˇˊˋˍεπのゞェーω字符过滤3.4本章小结在这一章中,我们讨论了文本是如何表示的,矩阵分布表示和神经网络分布表示是目前最常用的。我们还详细介绍了单词向量训练模型word2vec和单词嵌入的相关原理,以及哈夫曼树的概念。由于中文间不含空白,且语法结构比较复杂,因此第三小节针对中文语料介绍了中文语料处理的相关技术,包括中文分词、语料清理、句子标准化等。第4章基于seq2seq的对话生成模型4.1RNNRNN通过在基本的多层BP神经网络的基础上构建,提高了隐藏层单元之间的水平相互作用。利用权重矩阵,当前的神经细胞接收到了将前一段时间序列中每个单元的值,在处理自然语言处理问题[23]中有记忆功能神经网络具有很好的应用价值。图4-1显示了RNN(RecurrentNeuralNetwork)的总体结构,图4-2显示了隐藏层的内部结构。图4-1RNN循环神经网络结构图4-2隐藏层内部结构如图4-1所示,RNN的层次结构比较基本,主要由输入层、隐藏层和输出层组成。时间记忆特征是通过在秘密层中使用箭头表示不变的数据更新来实现的。如图4-2所示为隐藏层的分层拓展图。t−1,t,t+1分别表示t前一个时间序列、时间序列t、t后一个时间序列。X表示输入的样本,样本在时间序列t处的记忆表示方法为st(4-1)其中W表示输入的样本权重,U表示输入的样本权重,V表示输出的样本权重。从t=1开始,一般初始化输入s0=0,随机初始化W,U,V,这里的W,U,V(4-2)(4-3)(4-4)其中,f和g均为激活函数.其中f通常是tanh,g最常见是用的Softmax,但它可能是任何东西。此时s1下一时刻的测量条件包括了先前时间的记忆状态的参与。即为(4-5)(4-6)(4-7)最终的输出值为:(4-8)(4-9)(4-10)每一次计算产生的输出值Ot都会产生一个误差值Et,则总的误差可以表示为:Et=tet由于每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,那么这种算法叫做反向传播算法,将并不是直接取输出端的误差值,而是反向传递,梯度下降法的作用下进行更新[24]。在这里我们以t=3时刻为例,按照链式求导法则可以计算出,当t=3时的偏导数为:
(4-12)(4-13)(4-14)4.1.1LSTM(长短时记忆网络)该算法能很好地解决时间序列问题,但仍存在一些问题,其中比较严重的就是梯度消失问题,主要指因时间过长而导致的记忆值变小的现象。所以出现了一些改进算法被提出了,在这里主要介绍LSTM(LongShort-TermMemory)算法。由于RNN无法解决当循环神经网络遇到对于长文本序列的输入,随着数据的不断输入,前段的数据会被遮盖掉序列后段的数据的问题,这样序列信息不能得到完全表达,造成部分数据无效。图4-3显示了LSTM的结构图。图4-3LSTM结构图最重要的是神经元状态(cellstate),即图4.8所示的LSTM神经元上方从Ct−1一直到Ct的直线,将前一个神经元的信息在LST图4-4cell状态LSTM有一个很重要的概念,即“门”,LSTM神经元基本包含三个“门”,这三个门各有不同,分别是有输入门、输出门、忘记门。"门"的作用是取信息,将不需要的信息剔除,需要的信息留下[25]。以下详述这三个「门」。(1)忘记门忘记门的功能是控制前一神经单元传递到后一神经单元信息的遗忘度。它查看ht−1(前一个输出)和xt(当前输入),并为单元格状态(4-15)图4-5遗忘门结构(2)输入门Sigmoid层,又被称为“输入门层”,输入门层决定哪些值应该更改,哪些应该保持不变。接下来的步骤是在tanh层中制作一个候选向量Ct,它将应用于细胞的状态。之前的状态值Ct−1已经更改为Ct,剩下的就是我们完成签名步骤并做出决定。将上一个状态值乘以ft,以此表达期待不被记住的部分。之后我们将得到的值加上ⅈt∗(4-16)
(4-17)(4-18)图4-6输入门结构(3)输出门输出门的作用是控制当前神经单元的信息输出,输出门的结构见图4-7。如图所示,输出门将输出矩阵中的每个元素都映射到[0,1]上,从而决定哪些信息被输出,哪些信息被过滤掉。(4-19)(4-20)图4-7输出门结构4.2Sequence-to-sequence模型对自然语言处理任务来说,传统的方法多数都是检索式的方案,这对材料的精确度要求很高,随着自然语言生成和自然语言理解方面的研究不断取得进展,并取得了一些突破性的成果,例如seq2seq模型,是当前自然语言处理技术中非常重要的一种模型,且随着他的成熟,变得十分流行。它开启了将传统的深度神经网络模型应用到翻译和功能问答这一系列序列任务的先河,并在各种主流语言间的互译以及语音助手中的人机短问快答应用中得到了很好的体现。Seq2Seq模型是一个序列到序列的转换模型范式,用于对话系统、语言翻译和自动响应等情况。seq2seq模型的结构见图4-8:图4-8seq2seq结构图4-13表示Encoder和Decoder结构。如图4-13所示,最终输出序列不是直接输出,而是通过每个神经单元输出部分。编码器将输入序列转换为定长语义向量C,而解码器将定长语义向量C转换为输出序列。RNN、LSTM、GRU等算法可以用来实现编码器的解码器。在seq2seq结构中使用频率较高的是RNN/LSTM。对于RNN,目前神经细胞的状态是由先前神经细胞的输入信息和当前神经细胞的输入X计算得到的,其计算公式如下:(4-22)(1)编码阶段在编码器处理之前,输入序列C的长度是可变的,是通过利用Encoder的处理,编码器把转换为固定长度的矢量,进行一系列非线性变换得到各隐含层的输出结果。(4-23)在此公式里,输入序列中单词的数目用下标t。最后一层隐含层的输出用ht(2)解码阶段当使用Decoder时,使用语言序列C和输出序列y2…yt−1做运算,下一个输出的单词yt(4-24)我们通常将会解码器指定生成文本的最大长度,也确定终结符,因此,在Decoder遇到输出并非文本,而是一种矢量,比如[00.10.200.500.20...],该矢量表示当前神经单元输出对应的词表分布,即该矢量中的每个元素表示当前该输出为某个单词的概率是多少,解码过程结束一般选择最有可能的输出结果,但是最有可能的结果往往是安全回复,如“好的”,“是的”。(4-25)在编码器和解码器中,传统的seq2seq模型只使用长度固定的语义序列C,这导致了seq2seq模型中经常出现的长距离依赖性问题,也就是容易导致序列数据被遮盖,对长文本序列的理解不够精确。4.3注意力机制注意力机制被大量的运用在处理序列相关的任务中。Attention模型是模拟人观察某事物的过程,当人观察某事物时,必须只注意该事物的一部分,注意力随着关注点的移动而移动,也就是说,当人观察某事物时,该事物各部分得到的注意是不一致的,一定是某部分得到的多,其余得到的少。因为自然语言处理中文本的输入也是按顺序进行的,在NLP中处理文本也是按先后顺序进行,对于长序列而言,关联也会随文本的顺序输入而转移,因此注意力机制能够解决seq2seq模型中长距离的依赖的问题[26]。在传统的seq2seq模型中,编码器和解码器是通过中间语义向量C来进行数据交换的,因为该向量c的长度已经被固定了的,所以这给模型带来了问题,即对于过长的序列文本,当进行输入时,序列前部分的信息就会被序列后部分的信息覆盖。因此在注意力机制里,通过保留Encoder对输入序列的部分输出结果,如图4.15所示的C1,训练模型不将会对这些输出结果的有选择的学习,在最后产生了相应的输出序列的时候有所关联[27]
图4-9seq2seq的Attention机制抽象图由图4-9可知,最终Decoder基于输入X预测输出的单词的概率为:(4-26)(4-27)上式里,y是输出词,si是当前隐状态,f,g输入序列全部隐状态h1,⋯,,⋯,hT的加权和计算得到语境向量ci,(4-28)上一个输出序列隐状态si−1和输入序列隐状态hj为神经网络a的输入,计算出一个xj(4-29)(4-30)其中函数a有多种实现方法,本文只是列出一种实现方法。如下所示:(4-31)v、Ws、Wh、编码与解码器里RNN的各个权项,加上偏移项、嵌入层参数等都是模型参数,都是需要学习的[284.4Beam搜索算法在标准Seq2Seq模型中,最大概率紧随其后的是Decoder的输出,但最大概率也是语料库中最常见的词语,通常是一个无意义的安全回复[2]。所以如何避免安全回复,也是seq2seq模型关注的焦点。要解决这一问题,可以使用BeamSearch算法。公式如下:P(4-32)这种算法类似动态规划,但即使在能用动态规划的问题下,它还比动态规划要简单,它的算法是:在每步计算时,只保留当前最优的前k个候选结果。比如取k=4,那么第一步时,我们只保留使得p(Y1|X)最大的前4个y1,其他的过滤掉,然后分别代入p(Y2|X,Y1)以机器翻译为例。我们的目标是将短语“IamChinese”和“我是中国人”分别翻译成英语和汉语。假设语言只有“我”、“是”和“中国人”。所以,如果beamsize是2。从图4-10中可以看出,在使用集束搜索算法方法的decoder过程中,在第一次输出时,我们选择两个词“我”和“是”,这两个词是概率最大的,而不仅仅是概率最大的词。图4-10Decoder第二次输出解码器的下一个输入是“我”,解码器计算Y2的输出概率分布。使用词语“是”作为下一个解码器的条目,并确定输出概率分布的Y2。术语“I”用作下一个解码器的输入,并确定输出概率分布
图4-11Decoder第二次输出4.5本章小结这一章首先介绍了RNN,它是目前比较常用的一种神经网络,但是若是单单使用RNN来实现模型的话,由于输入序列太长,记忆值较小,有部分序列容易丢失,所以我们选择长短时记忆网络和“gate”来解决这一问题,然后介绍了QA系统中最广泛运用的seq2seq模型,它在各种机器翻译以及人机对话等应用中都有很好的表现,但是传统的seq2seq模型存在着不能充分表达整个序列信息的问题,因此本文采用了一种注意力机制来解决seq2seq模型的远距离依赖问题,当句子序列过长,就容易造成部分序列被遮盖。在seq2seq模型中,解码器若直接输出概率最高的语句,这意味着会产生很多安全回复问题,因此本文采用集束搜索算法来解决这个问题。第5章聊天机器人模型的构建5.1模型设计5.1.1环境搭建文章使用了TensorFlow框架。TensorFlow是一个高性能计算开源库。TF是一个多层结构,可以在各种服务器、PC终端和网站上实现,支持可选的CPU、TPU、GPU数值测量,各种领域的科学分析,谷歌内部产品创建。TensorFlow是一个基于数据流图的处理架构[29],节点表示数值计算,边表示运行节点之间的数据交换。TensorFlow有两个字面含义:张量指的是节点之间传输的数据,通常是多维矩阵或一维数组。TensorFlow可以更直观地表示为数据流图。通过"节点"和"线"的定向图绘制数据流图。在图表中,“节点”描述了正在进行的数学计算,以及数据输入、输出或常量变量读写端点的开始。“节点”之间的数据交互用线条表示。段可以中继多维数据数组,数组的大小被动态修改(张量)。这个图被一个张量包围着。因此,该工具被称为"Tensorflow"[29]。当输入端全部张量准备就绪时,将“节点”分配到各个计算设备,以完成异步并行运算。由于笔者的设备GPU性能较弱,在训练模型时使用的是google的colab。但运行机器人模型并开展预测工作是在笔者的设备上表5-1Colab的实验环境软件环境框架平台Tensorflow操作系统Linux开发语言Python3硬件显存16GGPUTeslaT4表5-2笔者的设备运行环境软件环境框架平台Tensorflow操作系统Windows10开发语言Python3硬件显存4GGPUGTX960M5.1.2数据来源本文构建的聊天机器人模型需要较多的中文问答语料,笔者决定使用来自于招商银行金融行业问答数据的语料包,语料包中包含了人们日常生活中到银行或者办理金融业务时碰到的各类问题以及回答,更加切合本文的聊天机器人模型。图5-1为部分语料问答实例图5-1部分语料问答实例5.1.3Word2index(1)词表和索引生成在对语料库进行预处理之后,我们需要考虑如何将分词后的词和短语表达成计算机可计算的类型。显然,如果要计算,我们至少应该把中文分词串转换成数字,而数字在数学中应该是向量。因此,我们需要将每个单词数字化,在这里我们选择建立索引的方式并建立索引数据库每个单词在词汇表中都有唯一的编号,整个词汇表由0到n的值表示,VOCAB_SIZE定义此户表的大小。还需要定义还有问答句子长度范围。此外,还必须指定UNK、SOS、EOS和PAD的符号。UNK是未知单词的意思。例如,如果超出了VOCAB_SIZE的范围,您将认为它是一个未知单词。解码器开始处理的符号用GO来表示。EOS为回答结束符PAD用于填充,因为所有问答队必须放入同一个seq2seq模型,由于输出输出的问题与答案可能不一样长,所以短问题或答案需要用PAD填充。经过上面的操作我们还要将语料库所有单词的频率都统计起来,接下来是前面描述的VOCAB_SIZE(按频率排序)。此外,我们还必须得到该词的索引,以及该词对应的索引值的索引。函数相关代码如图5-2所示:
图5-2_fit_word_函数相关代码建立索引的效果如下图5-3:图5-3索引效果在得到索引文件w2i.pkl文件。(2)索引过程通常,用于索引数据库是根据词汇表提供的信息建立的。信息检索技术是在对原始文本进行预处理后,建立索引表进行检索。建立文档,记录下来的文档的特征再进行信息索引,通常采用表格倒排的形式。在用户活动期间,系统根据系统提取的关键字从索引表中检索并返回所有符合条件的段落。检索速度非常快,因为索引没有退出,而是保存在内存中。在一个段落被确定之后,语义解释和处理将开始。建立信息索引后,检索过程包括按权重排序,然后依次输出每个条目。分段权重的计算公式如下:第一,设置问题处理模块的输出关键字部分(包括其扩展名)的权重。第二,是各关键词分配权重;最终,检索到的段落的权重将被排序,答案将按此顺序输出出来。5.1.4生成batch的训练数据预先设定训练数据的大小,随机选择训练语料。将语料库问答中的单词转换为索引。为了消除不同的长度差,用PAD填充问答组,直到长度相同。最后,将每个对话框索引转
换为一个可以方便存储的数组返回值。函数具体代码如图5-4所示:图5-4next_batch函数具体代码5.2模型构建和运行结果目前关于聊天机器人的框架已经相当成熟,并不需要程序员们再从底层开始搭建框架,例如图灵API,可直接调用。但是它设计的语料库太庞大,而本系统专注于金融领域的问答。本文建立了seq2seq模型,但不是传统单一的seq2seq模型。长短时记忆神经单元能够很好地解决传统seq2seq模型无法捕获双向语义过长依赖的问题,注意力机制能够使seq2seq模型获得较为完整的长文本序列信息,避免了序列被遮盖,从而更好地理解语义,同时集束搜索算法避免了无意义的回复。5.2.1模型构建构建seq2seq模型我们大体上按照如下方式进行:初始化训练,预测所需要的变量构建编码器(encoder)seq2seq:用seq2seq模型把Encoder和decoder联系起来构建解码器(decoder)构建解码器的神经元->构建完整解码器构建优化器(optimizer)保存模型(save)整体框架:1.初始化训练,预测所需要的变量2.构建编码器(encoder)构建神经元->构建编码器的神经元->构建完整编码器3.构建解码器(decoder)构建解码器的神经元->构建完整解码器4.构建优化器(optimizer)。5.保存。
图5-5整体框架图5-6SeqToSeq框架流程图初始化初始化的关键目的是设置batch_size,即分词后整个语料库的大小。由于问答使用的语料库相同,所以大小相同。batch_size可以根据为显存的数量设置。然后选择LSTM。在海量数据集的情况下,LSTM在表达式方面表现最好。RNN单元细胞(neuralunit)中隐藏神经元的数量称为隐藏单元(hiddenunits),RNN层的数量称为深度。这种效果与神经元的数量、层次和训练时间成正比。初始化主要是设置batch_size,其实就是分完字之后整个语料库的大小,因为问答的使用的语料是相同,所以他们的大小是一样的。batch_size可以根据你的GPU(图形处理器)显存来设置大小。接下来循环神经网络单元我们选的是长短时记忆网络,在大数据集情况下,LSTM表达性能更好。hidden_units(隐藏单元)为RNN单元cell(神经单元)中隐藏神经元的数量,depth为RNN层数,,效果与神经元、层数、训练时间成正相关。图5-7初始化e接下来要定义inputs和targets的tf占位符,在此使用了tf的placeholder函数,给编码器-解码器的输入输出以及输出输出的长度占位。图5-8TF占位符初始化(2)构建Encoder循环神经网络里的神经单元cell是用tf的LSTMCell构建来构建的,n_hidden神经元个数,在深度网络中有可能发生梯度弥散/爆炸,我们将使用ResidualWrapper残差网络用来解决。在完成构建好的单个LSTM实例后,实现多层RNN只需要将单个LSTM实例传入到MultiRNNCell类里就完成了。图5-9:构建Encoder图5-9构建Encoder首先用tf.nn.embedding_lookup来对输入的batch做一个词嵌入当做encoder的输入。其中它的shape为[batch_size,time_step,embedding_size],训练模型中每一句话的长度为time_step,词向量维度是embedding_size。bidirectional_dynamic_rnn是双向动态RNN。在初始阶段时,encoder的神经单元传入已经预处理好的语料数据self.encoder_embeddings,self.encoder_inputs等等。序列前面的元素和序列后面的元素都会对双向RNN模型产生影响,RNN模型在学习使用序列模型时主要依赖上述知识。这就是为何叫做双向。比如说,序列中存在一个缺失值,想要预测这个缺失值,我们要考虑该缺失值上下文的元素。简单点来将两个RNN堆叠在一起,一个从后计算序列的output和state,一个从前计算序列的output和state,在赋值时同时给前向RNN:encoder_cell和后向RNN赋值:encoder_cell_bw。两个RNNs的hidden_state直接影响了最终的输出的计算。值得注意的是:后向和前向隐含层之间毫无关系,前向和后向分开独立计算,将各个维度所生成的output结果在各个维度进行拼接,得到了拼接结果后,在最后输出的时候把前向和后向的的状态向量encoder_final_state结合起来,这保证了展开图是非循环的。(3)Decoder编码器将所有输入序列编码为固定长度的语义向量C,并以编解码器格式对输出进行解码。因此,语义变量C包含原始列表中的所有内容。但是,当c的长度有限时,其长度成为制约模型性能的瓶颈。下图是带有Attention机制的Decoder:
图5-10有Attention机制的Decoder以LSTM为例,首先确定一个LSTM层,然后指定另一个注意机制的实例来实现注意机制。(比如BahdanauAttention),最后把LSTMcell和注意力机制实例都传给AttentionWrapper,返回封装后的LSTM。在设置decoder_cell时,笔者设置了跟encoder_cell部分相同的参数:采用LSTM并且隐藏神经元个数和depth采用相同的数据。但是在神经元的构建中,笔者添加了注意力机制(attention机制),我们采用BahdanauAttention。在解码器中,从第一个来自encoder的输出开始,是会将输入和上一步计算得到的attention拼接,送入decoder_cell(解码器神经元),一步一步拼接计算,依次类推,最后softmax求和。在进行decoder时训练阶段的执行过程是和预测阶段是有些许不同的:训练:seq2seq.TrainingHelper-->seq2seq.BasicDecoder-->seq2seq.dynamic_decode-->seq2seq.sequence_loss预测:BeamSearchDecoder-->seq2seq.dynamic_decode在完整编码器的工作流程为:先给decoder_cell,decoder_initial_state赋值,当模型的模式为训练模式时,借助TrainingHelper与BasicDecoder,TrainingHelper用于train阶段,next_inputs方法一样也接收sample_ids与outputs,但是只是从最开始时的inputs返回下一时刻的input。BasicDecoder的作用就是定义一个封装了decoder应该有的功能的实例,不同模式,能够帮助decoder实现不同的功能,当在训练模型的时候,不把输出重新作为输入,而在预测的时候,将输出可以直接接到输入。接着下来tf.seq2seq.dynamic_decode接收一个Decoder类,然后依据Encoder进行解码,解码完成后,就实现序列的生成(映射)。这个函数主要的一个思想是一步一步地调用Decoder的step函数(该函数接收当前的输入和隐层状态会生成下一个词),实现最后的一句话的生成。最后返回一个Loss对象。然而当模式变成预测模式时,同样给decoder赋值,接着调用tf.contrib.seq2seq.dynamic_decode,它的主要作用是接收一个Decoder类,然后依据Encoder进行解码,实现序列的生成(映射)。其中,这个函数主要的一个思想是一步一步地调用Decoder的step函数(该函数接收当前的输入和隐层状态会生成下一个词),实现最后的一句话的生成。BeamSearch算法能够在性能于消耗之间做到平衡,为的就是在序列中寻找出较优的路径,它是一种折中手段,当搜索的空间并不富裕时,从中找出其最优解,得出最优解,这个解就很大程度上接近于整个搜索空间中的最优解。,只有先处理了encoder的output、state、length,才能使用beam_search的话,方法就是使用tile_batch将batch_size变成batch_size*beam_size。beamsearch的方法只用在预测的情况,因为在训练过程中,每一个问答对都是有对应的答案,beamsearch就不需要再使用了。(4)优化器编码器——解码器构建完之后就是设置(优化器)。优化器笔者使用的是AdamOptimizer。在训练模型时,随着训练的进行,通常会推荐逐渐减小学习率,可以对训练有正面效果。笔者采用polynomial_decay多项式衰减的方式来更新Learningrate。如果没有梯度修剪这个方法,随着训练的进行,容易造成梯度爆炸,这里笔者加上一个clip_by_global_norm用于梯度裁剪。由于链式法则的导数,在梯度剪枝之前很有可能诱导梯度的指数衰减。你可以通过修剪梯度变来防止渐变梯度。最后,确保梯度参数集是最新的。图5-11设置优化器(5)永久保存模型到本地5.2.2使用训练模型预测结果语料库中的两个标记用于训练模型,一个是“[Q]”作为Encoder的输入,另一个是“[A]”作为Decoder的输入。但是实际上,并没有"[A]"标签,因此此时,Encoder的输出是Decoder的输入。图表5-12是seq2seq模型的预测结果。图5-12模型预测结果在训练的过程中,模型的学习率是随着训练的过程维持不变的,经过比对,进行了100轮与进行了200轮的训练模型出现的预测结果却别并不大。预测结果基本能解决用户提出的问题。5.2.3评估训练模型的结果首先评价Chatbot的很多指标都是从MT(BLEUscore)或者summarization(ROUGE,基于BLEU的metric)中借鉴过来的,这些intrinsicmetric容易快速对模型进行评价,虽然不太适合聊天机器人,但也没有什么大坑,因此被广泛地贴到paper里凑字数,实际上大家都懂得,主流的评价方式之一还是需要肉眼观察。笔者认为只要是符合实际的回答都可以算优秀回答。简单评估一下训练模型,其实的30个左右的epoch里,loss的下降率还是非常的可观,从4.5开始的loss,随着训练的进行,一路降到了0.5左右,在剩下的大约六十个epoch里,loss的值开始在0.5左右挣扎,数据下降得越来越少,从开始的一个epoch下降单位1的loss,到最后训练五十个epoch才能下降单位0.1个loss,在该网络计算量下,在该数据集上几乎达到优化极限。在最后学习率也是从设定的最大值0.001逐渐下降到了0.00087左右。下图5-13为loss的变化曲线。图5-13训练模型loss变化曲线5.3可视化前端5.3.1机器人架构设计一个聊天机器人需要:浏览器前端:为用户提供友好的机器聊天页面;机器聊天API服务:前后端通过异步的HTTP调用实现通讯,前端将对话请求提交给机器对话Web服务,完成后将结果返回前端进行展示;机器聊天后端:使用tf-seq2seq进行机器聊天模型训练,得到对应语言的模型文件。然后通过Python命令可以进行句级的聊天,机器聊天API服务调用该命令。逻辑功能架构如图5-14所示:图5-14逻辑功能架构5.3.2web分析与设计若希望用拥有户良好的体验,我们的产品就要设计一个好用的web界面给用户使用,用户完全接触不到底层,这样用户就能纯粹的体验我们的产品。主要组成部分简介Web界面的设计主要由HTML,CSS,JS文件构成,他们的主要功能如下。HTML又称为超文本标记语言,它是决定网页的结构和内容,即“显示“超文本”意味着一个页面可以有非常多的元素,比如包含图片、链接,甚至是非文本元素。什么”。“超文本”意味着一个页面可以有非常多的元素,比如包含图片、链接,甚至是非文本元素。CSS(层叠样式表)堆叠样式表单来设计网页的呈现样式,即“如何显示相关内容”。CSS样式信息与网页内容分开,是一种标记语言。每个元素的样式都使用CSS描述。它只用于使HTML页面看起来更好。JS(JavaScript)控制网页的行为(效果)。使用JS可以使前台交互,做到对用户的操作有所响应,常用于给网页添加提供更流畅、更美观的浏览效果。(2)分析与设计这是一个聊天机器人的对话界面,用户输入一句话,机器人输出一句应答的话。需要设计提供对外调用的API,该API接受到用户输入的问答信息,根据接受到的信息调用模型预测应答会话并返回给服务器。通过web服务器,调用API。Tornado是一个用Python编写web服务器,它的功能非常强大,也支持扩展。当服务器处理拥挤的网络流量时,它的健壮性表现得非常优秀,程序员在也能非常轻松创建和编写,适配性非常的强,以至于能够用于大量的应用和工具。因此,这里使用tornado来绑定API对象,设置监视端口,对用户的服务请求进行循环监视。设计HTML结构和内容,设置文章标题,对话框,文本输入框,发送信息,显示信息,加载背景和头像。引用js文件来响应浏览器事件,读取数据和更新页面。CSS是为了美化HTML页面而设计的,选择器为其长度、宽度和高度位置的布局设计选择元素。编写js脚本响应页面事件,动态更新页面,使用Ajax可以实现本地刷新,换句话来说就是在不更新整个页面的情况下,它也可以做到维护数据。有了这一特点,Web应用程序能够更快地响应用户的操作,有些信息并未更改,这就避免了网络直接发送它们。5.3.3工作流程RestfulAPI.py开启web容器,监听8000端口,聊天机器人前端网页通过ajax请求后端接口,返回机器人应答数据。具体流程如下:打开接口访问地址,本地服务器默认:8000/api/chatbot。浏览器加载index.html,引用css文件进行渲染,在有引用js的地方执行js。页面加载完成之后,chat.js就开始执行了,这时可以进行会话,输入问答信息,点击发送,启动一个事件。chat.js响应事件,将输入信息作为参数,通过ajax向服务器发送信息。服务器调用绑定的API,API通过传递的参数调用模型,生成预测会话,将会话返回给服务器服务器返回给ajax引擎json格式文件。chat.js通过ajax的函数将接收到的数据插入DOM树,再调用show函数更新网页,一轮对话完成可以继续输入信息进行对话,步骤如上。前端效果和聊天机器人对话效果分别如图5-15和图5-16所示图5-15前端效果1
图5-16前端效果25.4本章小结本章先是介绍了实验环境,使用的是学习框架TensorFlow,不管是在深度学习还是机器学习都是有广泛的应用,由于聊天机器人训练需要大量的对话数据,而且是面向解决金融问题,所以选用了来自招商银行的系统问答语料。详细介绍了在进行模型训
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5-6岁幼儿撒谎行为研究
- 2025年中职水产养殖技术(鱼类养殖实操)试题及答案
- 2026年墙面工程(墙面施工)考题及答案
- 2025年高职植物保护(植物检疫技术)试题及答案
- 2025-2026年三年级地理(土壤植被)下学期期末检测卷
- 2025年大学大四(会计学)会计学综合试题及解析
- 2025年中职(中西面点工艺)饼干制作测试题及解析
- 2025年大学动物医学(动物病理学)试题及答案
- 2025年中职计算机应用(多媒体制作基础)试题及答案
- 2025年高职公共关系学(公关实务)试题及答案
- 2025-2026学年教科版小学科学新教材三年级上册期末复习卷及答案
- 中投公司高级职位招聘面试技巧与求职策略
- 2026中国大唐集团资本控股有限公司高校毕业生招聘考试历年真题汇编附答案解析
- 统编版(部编版)小学语文四年级上册期末测试卷( 含答案)
- 养老金赠予合同范本
- 2025年河南中原国际会展中心有限公司社会招聘44名笔试备考题库附答案解析
- 推广示范基地协议书
- 消防员心理健康教育课件
- 2025年服装行业五年发展时尚产业与可持续发展报告
- 2025年社区电动汽车充电站建设项目可行性研究报告及总结分析
- 中药热奄包疗法
评论
0/150
提交评论