精华内容
下载资源
问答
  • 智能问答系统的设计与实现
  • 本代码实现是基于python实现的基于复旦大学崔万云博士的learing question answering over corpora and konwlege bases ,代码实现与论文有所出入,原因是本实现用的语料是中文做...,而实体识别是智能问答思想关键...
  • 该项目是基于知识图谱的农业智能问答系统,从0到1的去搭建一个以农场品为中心的知识图谱,面向的用户群体是:农民和普通民众。 项目目的: 对农民而言让他了解某些农场品的种植方式,基本属性,种植成本,经济效益...
  • 基于电影知识图谱的智能问答系统,有助于搭建基于import-基于电影知识图谱的智能问答系统
  • 第七届中软杯(智能问答系统) 非常感谢杨大帅比和张小可爱为项目所付出的所有心血,最后一次虽有遗憾却不后悔的中软杯 bilibili视频地址: 实际上整个项目完成度还很欠缺,多个地方因时间原因未完成,或者只是仓促...
  • 一个基于Python模块REfO实现的知识库问答初级系统. 该问答系统可以解析输入的自然语言问句生成 SPARQL 查询,进一步请求后台基于TDB知识库的Apache Jena Fuseki 服务, 进而得到问题的结果。
  • 智能问答系统演示,word2vec语义匹配 数据 链接: ://pan.baidu.com/s/1KYpyC42pi8xDT19sH02EZw密码:g22n 结果 you:我账号被人盗了 [('账号被盗了',0.859556081969784),('我的号被盗了',0.8302024684697034...
  • Spring-Boot集成Neo4j结合Spark的朴素贝叶斯分类器实现基于电影知识图谱的智能问答系统 博客地址: 项目博客地址: 升级Spark依赖,由原来的2.3升级到2.4,GitHub官方提醒> = 1.0.0,<= 2.3.2之间的版本容易受到...
  • python智能问答系统.txt

    2021-07-21 15:54:32
    python做的简单的问答系统源代码
  • 资源包含了电影知识方面的几个问题训练集样本数据,以及特征词汇表和问题分类器【模板】,资源中也包含了基于电影知识图谱智能问答系统的核心代码ModelProcess
  • 摘要 摘 要 随着社会经济的发展人们生活水平的提高汽车已成为人们出行必不可少的交通工 具人们购买汽车的需求日益增长但汽车方面的信息比如汽车品牌车型以及相关价 格等众多用户无法精准地找到适合自己的车辆因此...
  • 采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...
  • 概括性的描述了目前的问答系统,同时用示例做了一个小例子,可以直接用于实际应用。
  • 基于知识图谱的电网模型本体智能问答系统研究.pdf
  • 智能问答系统需求分析(全) 目录 1 引言. 2 1.1? 编写目的. 2 1.2? 项目背景. 2 1.3? 定义. 2 1.4? 项目概貌. 2 1.5? 参考资料. 3 2. 功能描述.
  • 智能问答系统设计

    2017-08-16 16:06:49
    智能问答
  • 基于云计算的数字图书馆智能问答系统设计.pdf
  • 使用LSTM网络实现简单的智能问答系统 问答系统最重要的一步就是对问答者的问话进行错误分析,只要识别出提问者的提示,就可以调用相应的处理模块进行进一步的信息提取和相应的处理模块进行回答。 使用LSTM神经网络...
  • 基于Web服务组合的智能问答系统,曾承,,现有的智能问答系统局限于针对简单问题,寻找最适合的答案,无法满足用户日益复杂的个性化问题要求。本文基于需求元描述框架RGPS��
  • 智能问答系统产品设计详解

    千次阅读 2020-02-24 20:59:36
    问答系统的概述 我想大家肯定看过很多关于自然语言处理(简称:NLP)技术方面的书籍或者论文,但在这里我不会详细叙述NLP技术方面的知识,而是想通过产品化思路结合NLP相关技术来搭建一个基础版的问答系统。本文通过...

    问答系统的概述
    我想大家肯定看过很多关于自然语言处理(简称:NLP)技术方面的书籍或者论文,但在这里我不会详细叙述NLP技术方面的知识,而是想通过产品化思路结合NLP相关技术来搭建一个基础版的问答系统。本文通过基于问答对的问答型机器人作为引入,逐步分解其设计流程,用通俗易懂的语言描述问答型机器人的产品设计思路。

    好了,现在进入正题,让我先介绍一下问答系统对企业来说它能满足企业哪些业务需求,以及产生的价值有哪些?

    问答系统是基于满足B端企业降低人力成本、提高工作效率的智能化产品,为客服人员赋能。其最大的隐性价值是在实际场景中得到标准化后的数据积累,可以在挖掘客服价值信息中起到降本增效的作用,后续还可以作精准营销和产品升级。一套问答系统最困难的是如何提升客服系统的使用效率。

    就问答系统的使用效率,其根本原因是在于是否能够为企业降低人工服务次数和服务时间占比,甚至是提升公司的营业业绩。

    什么是问答系统
    问答系统是信息检索系统的一种高级形式,它可以通过链接知识库方式检索到用户问题的答案。问答系统与信息检索中的语义搜索有点类似,把用户输入的问题转换为一个有结构的语义表达式,然后从知识库中寻找答案,并直接反馈给用户。

    问答系统的答案可以从结构化知识库获取,用于规章制度、规则条款等问答形式,也可以通过结合一些已有的知识库和数据库资源,利用百度百科、维基百科等非结构化文本信息,用信息抽取的方法提取关键信息,并构建知识图谱作为问答系统的后台支撑,再结合知识推理等方法为用户提供更深层次语义理解的答案。

    在这里主要讲解的是针对特定领域的知识进行一问一答,也称之为单轮对话、问答对或FAQ,即直接根据用户的问题给出精准的答案。

    问答系统的业务场景应用
    适用于特殊环境下所限定的信息需求,在日常生活中,用户会经常碰到很多复杂的规章制度、规则条款。比如:乘坐火车时,能不能带宠物上火车;3岁小朋友是否需要买票等。

    在工作中,也会面对公司多样的政策。比如:商业保险理赔需要什么材料,工作几年可以办理暂住证?这些情况下,经常需要各种查询或者检索才能回复并解决用户的疑问。基于这类常见的业务场景就能更快速的搭建一套智能问答系统。

    问答系统的价值
    现阶段智能问答系统最大价值就是为客服人员赋能,而非独立于让机器自行解决众多目前还有很多错误率和不确定性的问题。

    问答系统的产品策略
    现阶段下的智能问答系统是有局限性的,这也是为什么需要落地到行业中某个垂直业务领域的主要原因。所以需要通过问答系统做出一个符合业务实际需求的产品策略,这样能够最大程度的提升用户体验和增加用户对系统的信心。

    比如系统遇到不知道的问题,可以通过产品的兜底策略及时转换其他服务(如:转人工客服)或给出用户可能想问的问题,为用户提供一个便捷的方式,让用户有继续操作的意愿。这样大大提升了系统的可用性,而不需要完全依赖于算法。这样成本也会低很多,效果也会好很多。这就是用产品策略来弥补算法本身的不足。然而在不同业务场景下所采用的兜底策略也是不同的,最重要的还是如何将兜底策略做的更加智能化。

    上述介绍了一下问答系统的基本概念和产品的价值以及产品策略,后面为读者分享的是如何搭建一套基于结构化知识库的问答型机器人。

    问答型机器人搭建
    问答型机器人(简称FAQ问答系统)目前被大量使用在电商、金融、银行、旅游等行业中。本文就以旅游行业为例,详细介绍如何设计并实现一个基于结构化知识库的问答系统,数据来源:东方航空官网http://www.ceair.com(会员常见问题为例)。

    系统介绍
    用户诉求

    通过最短的对话轮次(一问一答),获得精准、直接的答案以及更好的完成任务,来满足用户的需求。

    实现目标
    系统根据用户输入问题,理解用户的问题后,通过标签分类里的问题中匹配相似问句,并将答案反馈给用户,以此来为用户提供服务。

    系统功能
    在特定的垂直业务领域下,问答系统可以回答用户所提出的一系列问题,其主要功能包括问句预处理、问句理解、问句相识度匹配和标签分类。

    1)问句预处理:将用户问句进行分词和词性标注

    2)问句理解:提取问句中的关键词

    3)问句相似度匹配:将问句与每个标签分类下的问题进行相似度计算后召回

    4)标签分类:为问句添加标签,在标签分类下的问题匹配相似问题,以此来提升机器理解能力和匹配精度,同时也可以对问答对进行分类化管理,可以按业务分类、问题所属业务部门等自己需要的维度来管理问答对,提高问答对的管理效率。标签分类根据实际业务场景需求进行分类,切记标注标签分类的时候需要保持数据的一致性

    产品结构
    用户问题分类:
    首先我们需要对问答系统需要支撑的业务进行分析,然后把用户将会问到的问题进行归类整理,并设计符合实际业务场景需求的分类。

    问答型机器人适用场景:
    适用于回答非用户个性化的问题(即一问一答),返回的是静态知识,无需调用外部数据接口或调用知识图谱返回答案。

    问答型机器人处理流程:
    图1:问答系统处理流程图

    问答系统流程如下:
    1)用户提问:怎么样才能注册东方万里行会员

    2)问句预处理:将问句进行分词和词性标注(词法分析)
    分词: 怎么样 / 才能 / 注册 / 东方万里行 / 会员
    **词性标注:**代词 名词 动词 名词 名词
    **注:**在对问句进行分词处理时,可以加入领域词库进行同义词扩展,如“上海”扩展为“沪”、“申城”;“东方航空”扩展为“东航”,需要结合关键词词库进行识别

    3)问句理解:提取问句中的关键词
    关键词提取: 怎么样 注册 东方万里行 会员
    **注:**关键词可以是名词、动词、助词、代词,是描述某一类特征的词,关键词的颗粒度可以很粗(例如“我要申请”、“帮我申请”、“申请”),也可以有一定限度的泛化能力(例如:如何办理东方万里行会员中的“如何”就可以与“怎样”、“怎么样”)的代词一起作为关键词,并在计算句子相似度方面只考虑这些关键词。

    对于特定句某个名词、代词、动词、形容词或副词不一定是该句中的主语、宾语或谓语成分,但相对于句中所有的词构成的词序列而言,关键词序列却具有一定的句法结构信息表达能力,至少可以了解句子中的哪些词在组成句子框架结构方面是比较重要的。在此基础上进行相似度计算,比一般基于词的方法更准确。

    4)问句相似度计算:将用户问句与每个标签分类下的问题进行相似度计算后召回,同时返回相似度最高的标准问题和所属标签分类。

    **注:**在这里主要讲解的是产品设计思路,告知读者在设计问答型机器人过程中会用到哪些NLP相关技术,而不会详解技术实现过程。

    **问句相似度计算方法1:**基于多重信息的方法(关键词加权的语句相似度计算),结合了语法和语义信息的改进句子相似度计算方法。首先计算两个句子的语法相似度(词形、句长),借鉴基于词信息和句法分析的方法,综合考虑词的相似度和句子结构(长度)信息,结合同义词词林进行句子语义的相似度计算。最后,考虑关键词、句长、语义多重信息的一种融合算法,值得注意的一点是该方法需结合词库一起使用,其目的是提升分词、关键词提取、词性权重标注准确率。

    **注:**在计算语法相似度的时候需要注意的是关键词出现的频次应该采用大规模语料进行统计,而在限定领域问答系统中,可以用简化的方法。根据经验,在实践过程中发现名词和动词在句子中起着非常重要的作用,并且名词比动词承载着更多的信息量,一个句子的中心信息基本上都是围绕着名词和动词来展开的。

    所以在进行计算时也特意加大了名词和动词的重要程度,将句子的重心落在名词和动词上面,经查阅论文资料根据实际经验,将句子相似度计算中权值分别是名词类权重(W)为0.3;动词类权重(W)为 0.3;形容词、代词、副词类权重(W)为 0.2。

    **问句相似度计算方法2:**基于向量空间模型的方法。该方法把问句用向量来表示,计算2个句子的相似度就是计算2个向量的距离。

    本文使用word2vec对句子进行向量化表示,以作为 LSTM (即长短记忆神经网络)神经网络的输入实现问句相似度计算。而基于神经网络的词向量模型,可以从大规模的文本数据中自动学习数据的本质信息,得到低维实数向量,很好地解决了传统的词向量模型。因为词语独立性假设带来的语义建模困难和维度爆炸问题。

    用户问句:
    Q:怎么样注册东方万里行会员

    FAQ库中的句子:
    R1:如何办理万里行会员(标签分类:会员办理)
    R2:如何获得会员卡(标签分类:领取会员卡)
    R3:东方万里行会员申请电话是多少(标签分类:咨询电话)
    R4:东方万里行会员应该怎样申请(标签分类:会员办理)

    返回结果:(使用word2vec计算得出)
    R1:如何办理万里行会员
    0.8045011574330355
    R2:如何获得会员卡
    0.6247308971541259
    R3:东方万里行会员申请电话是多少
    0.7638216222999513
    R4:东方万里行会员应该怎样申请
    0.9042637469903886

    以上案例从人的主观判断可以看出问句Q实际上和R1,R4是同一个问题,与人的主观判断完全一致,同时也返回R4的标签分类“会员办理”。

    5)答案:精准匹配,则将R1问题的答案返回给用户

    整体产品结构图
    以下是问答系统整体产品结构图,主要围绕核心模块有问答管理、模型训练、关键词管理、未知问题管理。则其余模块不会做详细讲解。
    图3:问答系统产品结构图

    问答管理模块
    问答型知识构建是基于问答对中的问题匹配算法来设计的,所以首先需要搭建问答对,而问答对是由标准问题和相似问题以及答案组成,通过新增相似问题来提升问答机器人的准确率。

    而标签分类能有效的对问答对进行分类化管理,可以按业务分类、问题所属业务部门等自己需要的维度来管理问答对,提高问答对的管理效率。标签分类的用途是在特定标签分类里的问题中匹配相似问题,其目的是找到用户问题的所属标签分类。
    图4:问答管理-新建标签分类

    问答对是由标准问题、相似问题、答案组成,而标准问题与答案的组合称之为问答对。问答对支持一对一、一对多、多对一和多对多;当问题中包含多个答案时,答案随机呈现。相似问题是标准问题的泛化,其表达的意思与标准问题是一样的,其目的是匹配用户问题最相似的问题,并反馈给用户答案,问题样本越多匹配的准确率也就越高。
    图5:添加问答对产品原型

    模型训练模块
    是将编辑好的问答对或新增相似问题加入到算法中进行训练并生成模型,模型需要生效后才可使用。

    关键词管理模块
    关键词在问答管理模块中已经有详细的描述关键词对整个问答管理模块来说其重要性,以及关键词的使用和发挥的作用。
    图6:关键词管理产品原型

    图7:添加词典值产品原型

    未知问题管理模块
    未知问题是用户与机器人在对话过程中未识别的问题,用户可以对未知问题进行标注并添加至问题样本中通过模型进行训练。
    图8:未知问题管理产品原型
    图9:转问题样本产品原型

    结束语
    问答型机器人能否实现智能化,最直接的体现就是能否回答人类自然语言的问题,本文通过详细介绍问答型机器人产品设计思路,以及深入研究问答型机器人处理流程。问答型机器人最核心的就是问句相似度计算,以及用户自定义词库拓展同义词来提高匹配准确率,还有就是未知问题的处理并加入模型进行训练。

    本文还介绍了问句相似度计算的2种方法,一个方法是关键词加权的语句相似度计算;另一个方法是word2vec结合LSTM神经网络的问句相似度计算。试验证明,word2vec来计算问句匹配的准确率明显要好。

    至此,因本人一直从事NLP领域的智能问答系统产品设计工作。所以想把一些经验分享给大家,相互学习和交流,后续还会持续更新基于知识图谱的问答系统和多轮对话的产品设计。

    展开全文
  • 基于CNN的智能问答系统构建

    万次阅读 热门讨论 2019-07-08 20:17:26
    摘要 之前小的不才,发表了一篇文章,有些道友希望有源代码,特此附上进阶篇,... 本论文主要是对于CNN实际应用,其中也可以看出CNN对于人工智能来说也不是全能的,这也是目前这个研究领域的瓶颈。 对了,该代码W...

    摘要

    之前小的不才,发表了一篇文章,有些道友希望有源代码,特此附上进阶篇,本次java代码在GitHub:https://github.com/2518881238/QA_NLP,仅供参考,语料啥的需要自己测试整理相应格式的就行,如有不足之处,望各位道友批评指正。

    本论文主要是对于CNN实际应用,其中也可以看出CNN对于人工智能来说也不是全能的,这也是目前这个研究领域的瓶颈。

    对了,该代码Word2vec部分是借用的,自己有些改动,但主要还是得力于大神,在此表示感谢。参考项目地址:https://github.com/NLPchina/Word2VEC_java

    在互联网席卷全球的时代背景下,智能化的自然语言问答是处理语言信息的重要手段。实现高效,全面,更具有实用性的智能问答也是自然语言智能化的重点研究方向之一。目前普遍的问答社区模块中主要存在回答信息有误,回答信息冗余和回答信息不精确等问题。由于这些问题的困扰,导致了用户体验感变差,问答系统也满足不了日益增长的用户问答需求。针对这一现状,本系统致力于解决一般问答社区信息冗余问题和提高问答效率,能从语义,语境和语言结构方面更加智能化的语句识别,致力于构建一个更加实用的问答系统。

    本论文研究智能问答系统是基于问答社区积累的大量问答信息,采用Word2vec构建词向量问答相似矩阵,利用中文分词技术分词,然后利用卷积神经网络(CNN)构造分类器进行分类处理,再构建问答匹配算法,最终实现问答匹配。国内研究智能化问答系统主要有通过问题相似度实现问答匹配,通过构建知识库进行关键字匹配来实现问答匹配和利用关键字进行全文检索实现问答匹配三种方式。本系统构建主要采用问题相似度进行问答匹配,这样可以实现不限领域的开放式问答,同时也可以实现复杂问题的问答,并且利用基于统计的神经网络算法构建词向量,实用CNN神经网络来实现语义的识别和匹配,使系统问答更加注重语义之间的匹配而非表面上的关键字匹配。本系统利用问答信息来构建问答系统,实现了语义上的问答匹配,解决了普通问答社区的信息冗余和问答信息不精确等问题。

    关键词:问答社区,智能问答系统,词向量,神经网络,问答匹配。

    Intelligent Question Answering System Based on Software Knowledge

    ABSTRACT

    In the background of the Internet sweeping the world, intelligent natural language question and answer is an important means to deal with language information. It is also one of the key research directions of intelligent natural language to achieve efficient, comprehensive and practical intelligent question and answer. At present, the answer information is incorrect, the answer information is redundant and the answer information is not accurate. Due to these problems, the user experience has deteriorated, and the question and answer system can not meet the growing user question and answer needs. In view of this situation, this system is committed to solving the problem of general question and answer community information redundancy and improving the efficiency of question and answer. It can be more intelligent in terms of semantics, context and language structure, and is committed to building a more practical question and answer system.
    In this paper, the intelligent question and answer system is based on a large amount of question and answer information accumulated by the question and answer community. Word2vec is used to build a similar matrix of word vector question and answer, Chinese word segmentation technique is used, and then the convolution neural network(CNN) is used to construct a classifier for classification processing. Then build the question and answer matching algorithm, and finally achieve question and answer matching. The intelligent question and answer system in our country mainly includes question and answer matching through question similarity, question and answer matching by constructing a knowledge base for keyword matching, and question and answer matching by using keywords for full-text retrieval. This system mainly uses question and answer matching with problem similarity, which can achieve open-ended question and answer in the field, but also can achieve complex question and answer, and use statistical neural network algorithm to build word vectors. The application of CNN neural network to achieve semantic recognition and matching makes the system question and answer pay more attention to the matching between semantics rather than the surface keyword matching. This system uses Q&A information to construct Q&A system, realizes the semantic Q&A matching, solves the problems of information redundancy and inaccurate Q&A information in ordinary Q&A communities.


    Key words: question and answer community, intelligent question and answer system, word vector, neural network, question and answer matching.

    1 绪论

    1.1论文研究背景

    随着互联网的风暴席卷而来,人们每天的生活都在发生着翻天覆地的变化。面对信息爆炸而无力选择想要的信息的现状,人们往往会迷失在这茫茫信息的海洋之中而难以找到准确的答案。在信息的持续爆炸增长情况下,问题难以匹配到答案。各种传统问答模式面对海量的数据信息也越来越吃力,传统的关键词匹配问答方式存在信息检索不精确,问答信息冗余问答错误等问题。这也说明停留在语句上的问答匹配是不足以解决人们的问答需求。很多问答社区面对问答信息的冗余,虽然信息库变得越来越强大,但是相反问答效率会变得越来越低下。

    目前,对于深度学习和语言智能化技术研究也是逐渐成熟,对于语言的智能识别程度也逐渐提高。随着单词向量化模型的诞生,神经网络算法的进一步发展,自然语言识别在深度学习的背景下提高了自我学习的力度。随着CNN,RNN等模型在文本中取得的优异成果,智能问答不仅仅停留在语句结构上的理解,更多的通过自我学习达到语义或者语境上的匹配,从而提高问答质量和精准度,尤其最近Google推出的Bert更是刷新了NLP界的新纪录。

    从社会需求条件和问答技术的发展支持下,构建一个能满足当下乃至未来的问答需求,能更加准确,高效提供问答服务的系统是十分有必要的。研究前景好,未来发展潜力巨大。

    1.2论文研究目

    在传统问答效果不满足于现有信息检索需求下,在自然语言智能识别技术高速发展的背景下,构建一个更高效,精确的问答系统显得非常有必要。

    本论文致力于构建解决问答社区信息冗余问题和提高问答效率的智能问答系统。面对传统问答存在的问题,本论文通过研究语言数据结构化算法实现语句分词构建和词语的多维度描述构建来解决传统语句统计算法带来的问答不精确问题。通过深度学习和CNN等神经网络模型的构建来提高问答识别度,构建语句结构和语义方面相结合的智能问答识别系统。本论文通过构建自动检索和问答智能化匹配来解决问答信息冗余的问题,通过语义上的匹配和语句相似度的匹配来提高问答效率。利用深度学习模型构建的智能问答将会更全面,更适合普通问答社区。

    1.3论文研究课题现状

    从20世纪60年代起,智能问答相关技术研究开始萌芽。由于对于语言学的重视和传统搜索引型的需求增长,到80年代智能问答已有了长足的进步。基于中文的智能问答系统的研究于70年代才开始,相比英文的智能问答起步较晚,但是目前为止,中文智能问答相关的技术已经取得了很大进展。

    国外智能问答的研究应用比较早。1961年,国外出现了第一个限定域智能问答系统,该系统是由Green构建并且是为棒球领域提供问答服务。目前国外的问答系统也是数不胜数。有像Siri,Google Now和Start等著名的问答系统。

    国内智能问答的研究虽然起步比较晚,但是已经取得了很大的进步。国内也有着很多诸如百度,知乎和360问答等优秀的问答系统。随着深度学习的发展,自然语言智能识别智能化程度越来越高。目前很多学者在中文智能问答方面利用深度学习和相关神经网络模型取得了很好的效果。并且对医疗,专业等限定域的研究更为深入。

    1.4论文研究主要内容

    本论文致力于解决传统问答方式的局限性,利用深度学习和神经网络模型等相关自然语言智能识别技术解决传统问答社区的信息冗余和问答效率低下的问题。

    本论文利用现有的,比较成熟的中文分词,词向量构建等基础的自然语言智能识别技术做语言数据结构话处理,利用目前应用效果比较好的的神经网络作为构建分类器的训练模型。利用深度学习的各种算法实现基于问答语料的智能问答匹配。针对目前传统问答社区出现的问题,采用问答语料匹配解决传统问答社区信息冗余的问题。利用词向量矩阵和神经网络模型解决问答正确性并且提高问答效率。

    1.5论文结构简述

    本论文分为五个部分介绍该问答系统。第一部分是绪论,主要是对智能问答背景,所面临的问题和发展现状以及本论文课题的主要研究内容以及论文论述结构做相关介绍和说明。第二部分是对于本论文所要实现的问答系统做相关的系统设计和模块设计。第三部分是本论文课题的实现流程,所用模型,具体实现过程,模型优化以及实现结果分析。第四部分是总结和展望,该部分主要介绍了对于本论文研究课题的总结,对于研究课题未来展望。第五部分是致谢,主要介绍对于本论文研究课题的相关人员的感谢。

    2 基于软件知识的智能问答系统设计

    2.1数据来源分析设计以及爬虫设计

    本论文是基于问答社区积累的问答语料库构建的智能问答系统,构建的基础知识库是来源于问答社区。获取方式是采用爬虫的方式对于问答社区进行问答信息抓取。语料来源于问答社区积累的现有语料,语料具有如下形式的语料:

     

    其中代表现有问题集合,Q代表问题,A代表回答。

    爬虫设计一共有如下五个步骤:

    1. 网站的选择:国内有很多的问答社区,常见的百度问答和知乎问答等著名的问答社区都有很强大的反爬虫机制。如需爬取,需要构建浏览器机制,用户名密码等权限验证。比较麻烦,本论文的爬虫爬取的是红网问答社区的问答语料,该网站反爬虫机制不是很强,爬取信息较为容易。
    2. 网页构成分析:该网站采用一般的分页式布局,每页有10条内容,故采用分页式的网页爬取,找出分页规律,分别对其进行爬取。针对网页问题的超链接,采取问题和答案匹配爬取。
    3. 针对网页的爬虫设计:由于同时爬取多个网页,利用多线程实现分布式爬取,减少爬取时间和提高爬取效率。
    4. 将爬取到的文本进行文本预处理,转化成需要的文本格式。
    5. 将爬取好的问题和答案集合写入文件并保存。

     

    2.2 数据中文分词的分析与设计

    分词技术是指把语句按照一定的规则进行划分,通过划分的各个部分可以更加充分理解整个句子的各个元素。分词手段通常可以分为词表对照的分词方法,语义理解的分词方法和基于统计学的分词方法[]。中文分词相较于英文分词难度更大,英文分词通常可以按照空格来划分语句的各个模块,中文分词则比较复杂,中文存在很多的歧义词,组合词和新生词。通常中文分词需要检查筛选歧义词,新生词,最终得到的分词结果才会更加准确。

    本论文针对爬虫爬取到的问答数据,将问题集合进行分词处理。本论文中的问答语料来自于问答社区,语料具有不固定性,所以采用基于词表的分词方式将会更加准确,通常基于词表的分词方式有标准分词,NLP分词和jieba分词。本论文采用使用最多的jieba分词。

    2.3 构建中文词向量的分析以及模型设计

    2.3.1 词向量构建算法设计

    本论文采用的词向量实现方式为目前最受欢迎的Word2vec,Word2vec是利用神经网络训练得到,可以自行输入维度大小等参数控制,并且词向量的生成非常的高效。其核心神经网络的算法主要是CBOW和skip-gram算法,针对这两种算法Word2vec也是对其进行了不同方向的优化。目前最常用有两种优化算法,从层次结构优化和负面采样优化[]。

    本论文采用的是层次结构优化(Hierarchical Softmax),相比传统DNN算法,主要进行了两个方面的改进:

    1. 从输入层到隐藏层采用取平均值的方式代替了传统复杂的交叉权值计算。
    2. 从隐藏层到输出层采用的是赫夫曼树来进行优化,其优化结构如下图所示。

    图 1 赫夫曼树优化模型

     

    在核心算法上本论文采用CBOW算法。CBOW是基于统计和神经网络训练模型的算法。CBOW算法输入为上语句附近一定步长的单词词向量,输出为目标词的词向量。目标词输出的最佳词向量的值为预测上下文相关词出现平均概率最大的一次。这也是利用神经网络训练而得。其公式为:

    其中V是描述词向量W(n)的值,n为词向量位置,N为上下文相关词计数,j为概率词的相对位置描述,p为先验概率,利用Softmax函数刻画。log()为对于先验概率取对数的函数。

    CBOW算法为词袋模型,不在乎上下文词语的距离,在CBOW算法看来,上下文相关词开始时都是同样的权重。神经网络算法图示:

     

     

    图 2 CBOW神经网络结构图示

     

    2.3.2 词向量构建模型设计

    本论文利用Word2vec实现词向量矩阵的构建,Word2vec文件包是Google推出的开源工具包[],该工具包不具有实际编码性,因此本论文采用其他语言实现的开源代码。目前有python和java两个实现的版本,python直接导入gensim包即可使用,非常的简便。Java目前没有开源的jar包,幸运的是,java也有Word2vec的实现版本,使用也是非常的方便,需要根据代码和项目的实际应用进行一定程度的修改和调试,调试过程需要一定程度的了解其代码实现原理。

    有了实际的编码环境,利用分词文本可是实现词向量的构建。但是完成单词的词向量的构建还不够,需要完成单词词向量的相似度计算,也就是需要输出两个单词之间的词向量相似度值输出,并且最好是利用softmax实现归一化。这一切在python里面非常的简便,所有的工具和函数也是非常的齐全,所以上述功能需求在python里可以直接调用函数直接实现。而相对于java来说就比价麻烦,java在前辈学者的基础上需要自行实现相似度的自行计算。

    本论文研究课题是利用Word2vec的java版本的实现算法来构建模型。把目标问题和语料问题进行对比,通过模型训练出词向量矩阵。词向量构建形式为Wn(n1,n2,...,ni),其中W为词语,ni为W在某个维度的向量值。接着利用词向量构架相似度,得到相似度矩阵。最后达到如下图所示的词向量结构:

    图 3 构建词向量矩阵示意图

    2.5 CNN神经网络分类器的分析以及模型设计

    2.5.1 卷积神经网络模型设计

    CNN采用局部感知的策略,局部感知可以大幅度的简化传统神经网络的复杂度[]。CNN是一种前馈神经网络并且擅长局部提取特征作为识别依据,所以本论文采用用CNN来实现自然语言语句特征提取。

    本论文首先构建好基础的四层CNN。依次为数据输入层,卷积层,池化层,全连接层。

    本论文中的自然语言智能识别是通过词向量来构建数据矩阵。卷积层是对输入数据做模型训练,权值集合为卷积核,通过卷积核的局部感知实现特征提取。矩阵公式计算如下:

     

    池化层是为了防止过拟合和去除不必要的数据,采用max-polling或者avg-pooling两种方式。max-polling池化方式是取局部矩阵词向量特征值中的最大值,avg-pooling是取局部向量值的平均值。全连接层则是采用Softmax函数实现归一化输出。

    2.5.2 卷积神经网络的算法设计

    针对基础的CNN模型设计出适合本论文智能问答处理CNN模型架构,采用矩阵算法实现常规的卷积核池化操作,最后达到分类效果,其模型如下图所示:

    图 4 构建的CNN基础架构模型

     

    在本模型中,输入矩阵数据来源于Word2vec构建的词向量,利用卷积公式对该矩阵循坏进行卷积操作,池化操作。本论文CNN模型图中,卷积操作的计算过程为:

     

    上述公式D表示进行一次卷积的下一次输出矩阵的值,D00到D01之间的距离就是卷积的移动步长。其中卷积操作为主要局部特征提取,池化操作中使用max-pooling方法来提升局部特征的明显性,也可以使用avg-pooling来实现一定程度上防止过拟合化。计算过程为:

    上述公式同样表示进行一次卷积的下一次输出矩阵的值,D00到D01之间的距离就是卷积的移动步长,每卷积一次或者池化一次矩阵维度下降步长值个单位并得到相应结果。

    2.5.3 卷积神经网络的模型优化

    在本论文的CNN基础模型的基础上,需要针对智能问答对模型进行优化,优化好的模型如下图所示:

    图 5 构建的CNN优化模型

     

    如上图优化后的模型所示,主要进行以下三点的优化:

    1. 防止过拟合。从输入层到卷积核池化的中间层,会出过拟合的现象,所以本论文采用L1,L2或者标准差的方式监督算法的整个过程,拟合程度达到一定的范围便不再对矩阵值进行计算,直接进入全连接层。
    2. 采用RELU算法对于不必要的特征进行剔除。在前馈神经网络执行时使用RELU激活函数实现去除与模型无关的特征,该函数公式为:

    1. 利用问题测试集进行反馈,调参。通过调参,可以实现模型的最优值。

     

     

    2.6 基于知识图谱的问答系统设计

    在简单的开放域问答系统的构建中一般都是基于构建知识库来构建问答系统[]。知识库的搭建依赖于大量而且充分的问答语料,构建的知识库一般依赖于JSON或者XML文档格式来构建。本论文在基于知识图谱的问答系统构建中,为了完善本系统并且提高用户的实用性,设计实现基于知识图谱的API来实现简单问答机器人。其设计思路有如下3点:

    1.调用API途经:本论文选用知识库比较强大的图灵问答机器人API,其优点在于知识库强大,问答准确性高。

    2.调用方式:获取问答API的地址和密匙,通过HTTP协议访问API,使用JSON解析问答API的信息。

    3.实现方式:采用java语言中的HTTP协议和JSONObject对象完成对问答API的调用。

     

    2.7 系统软件模块设计

    2.7.1系统语料预处理算法设计

    基于现有问答文本语料的基础上构建问答系统,由于语料数量很大,所以对于体统算法的复杂度和空间复杂度要求也是有限制。本系统构建的算法复杂度为:

    其中n表示现有语料库语句条数,m表示CNN算法复杂度,需要根据实际CNN执行次数确定,x和y分别表示构建词向量矩阵的长度大小和宽度大小。由此可见,主要影响该算法复杂度的主要因素是n。也就是需要控制语料的条数,针对智能问答的非开放域问答实现效果较好,所以设计该算法首要考虑文本预分类算法或者要求数据预分类格式。本论文所抓取的语料就是分类语料,采用朴素贝叶斯进行分类,这样可以减小对资源的占用,同时也可以提高词向量矩阵构建精准度和CNN模型的精准度。

    预分类算法实现采用性能比较好的朴素贝叶斯分类算法,本论文设计使用的是多项式模型,该算法实现思路如下:

    1.实现文本分词处理,并预先以一定相对广泛的定义分类。

    2.统计词的出现占比。记p为目标词出现占比概率值,记n1,n2...ni为输入词,m1,m2...mi为预分类里出现的词各个分类。故构成输入词集合x=(n1,n2...ni),分类集合y=(m1,m2...mi)。

    3.计算先验概率:p(w|t)=(w在样本中出现次数/总文档数)

    4.计算类条件概率:

    p(x|w)=p(x类下w出现次数+本身出现一次|总文档计数次数)

    由于前期的分类处理,智能问答的响应时间大大较少,增加了系统的可用性。

     

    2.7.2 系统界面模块设计

    本系统实现了基于CNN的复杂问答和基于知识图谱的简单问答。系统实现采用java web实现软件的前后端搭建,所采用框架为springMvc,由于没有数据库端的实现,所以只采用一个转发框架springMvc即可。

    前端采用jsp网页或者html以及一些常用的js,jq和css3技术。设计模块如 下:

    图 6 问答系统模块设计

    3.基于软件知识的智能问答系统实现

    3.1 基于CNN神经网络分类器的问答系统

    3.1.1语料库及其预处理

    本论文爬取红网问答语料库,需要根据超链接去访问问题和答案的匹配集合,红网网页需要对个分类大约600多个网页进行分页爬取,并对每个网页进行回答的超链接进行大约10个超链接网页的爬取,完成一个分类文本大约需要对6600多个网页进行爬取,爬取量非常的大,所以采用多线程的方式效率会有提高[]。Python里面试下多线程使用的是import threading,其实现方式也比较简单。爬取核心代码模块如下:

    #获取网页代码
    def getHttpText(url):
    #获取红网问答标题
    def getTitle(HttpText):   
    #获取单页问题集
    def getQuestion(HttpText):
     #获取所有问题集
    def getAllPage(HttpText):
     #得到问题集
    def mainMethod(url):
    #循环遍历问题集
    def allPage():
    #遍历问答集
    n = getHttpText("http://ask.rednet.cn/question/178535")

    #d多线程爬取
    def QAThread():

    爬虫爬取20个网页,一共200条问答信息示例运行如图示:

    图 7 爬虫爬取20个网页示例

     

    由于本论文CNN模块研究的是复杂问答,故采用限定域问答方式。其分类文本问题集效果图如下图所示:

    图 8 爬取文本集图示

    上图展示的是限定为法律范围的限定域问答,其问题作为问答库。由于文本回答过长,所以采用标号的方式储存回答文本,先匹配出相似问题,再去寻找答案并展示。

    3.1.2 分词构建

    得到问答语料并且通过预处理得到目标问答语料集,接下来就是对于问题集合进行分词处理。本论文采用最常用的jieba分词。所采用的java实现需要导入的jar包为:

    import com.hankcs.hanlp.HanLP;

    import com.hankcs.hanlp.seg.common.Term;

    import com.hankcs.hanlp.tokenizer.NLPTokenizer;

    import com.huaban.analysis.jieba.JiebaSegmenter;

    实现核心代码为:

    JiebaSegmenter jiebaSegmenter = new JiebaSegmenter();

    List<String> strings = jiebaSegmenter.sentenceProcess(str);

    其中jiebaSegmenter.sentenceProcess(str)为结巴分词。

    详细分词结果如下图所示:

    图 9 三种分词结果图示

    上图所示是利用java实现的三种分词形式,从结果可以看出基于词表的分词方式效果都基本相同。

    3.1.3 利用Word2vec构建词向量

    利用Word2vec的java实现版本实现词向量矩阵的构建,得到两个词之间的相似度,这部分在java的Word2vec的实现版本中需要自行实现,具体核心实现代码如下:

    public float wordDis(String queryword1, String queryword2) {

    //获取现有wordMap词表映射关系,wordMap为已经训练好的词表

    float[] vector1 = wordMap.get(queryword1);

    float[] vector2 = wordMap.get(queryword2);

     

    float dist = 0;

    if (vector1 == null || vector2 ==null) {

    return 0;

    }

    for (int i = 0; i < vector1.length; i++) {

    dist += vector1[i] * vector2[i];//根据各个词向量维度计算相似度

    }

    return dist;

    }

     

    接下来就是根据相似度分词和java中的jieba分词构建词向量矩阵,本论文构建的词向量矩阵如下图所示:

    图 10 词向量分词矩阵构建图示

    3.1.4 利用CNN神经网络构建分类器

    本论文选取CNN作为文本分类器,利用3.1.3中的词向量矩阵作为输入,利用CNN神经网络作为分类器来训练词向量矩阵。首先对该输入矩阵进行卷积核池化,根据卷积算法,核心算法的java实现版本代码如下图所示:

    图 11 CNN卷积层实现卷积算法

     

    如上图所示,该示例算法为二维的卷积核的卷积算法实现,其核心为对输入举证的局部特征进行一次的提取。池化层相对实现算法比较容易,下图为卷积一次和池化一次的数据值对比:

    图 12 CNN卷积和池化输出结果图

    另外,为了防止过拟合化或者特征提取不充分,该模型使用标准差来实现模型精度监测和防止过拟合化,下图为防止过拟合效果展示:

    图 13 CNN防止过拟合效果图示

    由上图可知防止过拟合化后提高的效果明显。标准差减小,得到数据平均值增大。另外前馈神经网络执行时使用RELU激活函数实现去除与模型无关的特征,该函数公式为:

    例子1:

    如下两个字符串:

    String str0 = "哪些交通违规行为可以不被处罚";

    String str1 = "不被处罚的交通行为有哪些";

    相似度结果如下图:

    图 14 CNN模型输出示例1

    例子2:

    如下两个字符串:

    String str0 = "哪些交通违规行为可以不被处罚";

    String str1 = "机动车驾驶人的哪些驾驶行为会被扣分";

    相似度结果为:

    图 15 CNN模型输出示例2

    由例1和例2可知,都是相同领域的问句,句意相同的标准差收敛的很快,效果较好。而句意相反,表达相似的句意标准差收敛比较慢,最后相似度效果较差。

    3.1.6 模型评估与结果分析

    本系统利用人工选取一定的测试集合对模型进行评估,分别实现了初始化模型的结果和优化后的模型结果。本模型评估测试集是基于语义上的匹配,也就是这个测试集语言表达方式会有大幅度的不同,而语义层面上却是相同的测试集。相对而言结果也会存在误差。在预料结果之内。评估结果入下表所示:

    图 16 CNN模型评估

    目前实现本论文智能问答实现模型为CNN模型,CNN模型非常适合图像识别领域。构建多通道和不同的卷积权值。相比CNN在图像领域的模型构建,CNN在文本特征提取方面显得更简单而且直接。为了保留文本的原有特征,卷积权值一般初始化为单位值1。相比变化的卷积权值效果更好。而且通常CNN在文本领域都是以单通道作为入口进行计算,模型简单而且取得了不错的效果。

    3.2 基于知识图谱构建问答系统

    基于语言结构关系构建知识库来实现问答匹配是目前处理简单问答的主要应用技术[]。构建知识库主要需要两个步骤,建立实体关系和实体关系链接[]。建立实体关系就是抽取出问答信息库中的实体,建立起实体之间的关系描述,通过实体关系链接来确定实体关系并作出回应[]。主要的实现方式有语义判断,实体信息抽取和词向量描述。本论文为了完善该问答系统,调用现有比较强大的图灵知识库api来实现简单的聊天问答,实现步骤为:

    1. 获取知识库API并解析。通过用户注册得到应用图灵知识库api的权限。获取到使用密匙和调用URL。

    图 17 图灵API调用key和访问地址

    1. 利用java中的JSONObject对象解析图灵api的json数据格式。

     

    输入json格式:

    图 18 调用图灵API输入JSON格式

     

    输出json格式:

    图 19 图灵API调用输出格式

    调用java的JSONObject对象解析即可实现api的调用。

    1. 调用该api实现简单提问并获取回答,实现效果如下图:

    图 20 调用图灵API问答效果图

    3.3 问答匹配算法和系统可视化的构建

     由于系统设计是实现开放域问答,目前使用的CNN分类器在限定域分类想过较好,所以系统采用朴素贝叶斯算法来实现预分类处理,其实现java代码模块如下:

    //获取关键词

    getKeyWord();

    //从文件中读取出分类的数据

    readData();

    //统计关键词出现在分类文本中的次数

    getCountKeyWordClass();

    //计算关键词出现在分类文本中的概率

    getChanceKeyWord();

    //统计关键词出现在总文本中的次数

    getCountKeyWordAllText();

    //统计关键词同时出现在所有文本中的概率

    getChanceKeyWordSameTime();

    //使用朴素贝叶斯算法求出分类的概率

    classByBayes();

     

    其分类测试效果如下:

    图 21朴素贝叶斯分类效果图

     

    系统构建目的提高用户体验系数,所以适合采用简洁,美观,大方的模块设计。系统可视化构建模块如下:

    问答模块:

    图 22 问答系统问答模块界面设计

    用户登录注册模块:

    图 23问答系统登录注册模块设计

    用户管理模块:该模块直接后台操作即可。


    4 结论

    由分类模型结果来看,CNN模型在文本分类领域同样也有非常好的效果。利用局部感知同样也可以延伸到全局。本论文实现的CNN模型针对文本特征进行了模型改造和优化,开始使用贝叶斯公式进行预分类,提升了CNN词向量矩阵的准确率,从开放域问答缩小到非开放域问答,其实现效果得到了提升。其次对于CNN模型进行了拟合化监测和反馈神经网络的调参。这在一定程度上完善了CNN模型,提升了CNN的模型分类准确率。

    本系统还实现了对于CNN不同维度的卷积核调试,得到最佳结果维度选择。本系统同时也对于CNN卷积层的通道,卷积核的参数值进行了相应的调整,达到最符合文本相似度的模型预期。

    其次,本系统还构建了简单问答系统,通过调用问答API实现简单问答,提升了系统的可使用性。本系统通过构造简洁,美观的系统构建了智能问答系统。本系统具有 很高的可使用性。

    最后,本系统也存在一定需要改进的地方,在文本匹配准确度当然越高越好。本系统的语料库构建还比较小,导致了后续词向量和分类构建的不准确性,在一定程度上限制了模型的实现能力。期望后续能构建充足的语料库和更高效的算法来提升该系统的问答效率。

    参考文献

    []本刊讯.Google开源BERT模型源代码[J].数据分析与知识发现,2018,2(11):18.

    [] 张华,李超.Java课程智能问答系统设计与实现[J].计算机时代,2018(12):12-15.

    []张素荣. 智能客服问答系统关键算法研究及应用[D].南京邮电大学,2018.

    []李翠霞.现代计算机智能识别技术处理自然语言研究的应用与进展[A].中国知网.2012. 

    [] 曹艳蓉. 基于中文社区的智能问答系统的设计与研究[D].南京邮电大学,2018.

    [] 何冠辰.人工智能与中文分词的研究[J].中国新通信,2019,21(04):66-68.

    []周练.Word2vec的工作原理及应用探究[A].中国知网.2015.吴军.数学之美[M].北京:人民邮电出版社.2012.

    []宋添树,李江宇,张沁哲.基于CBOW模型的个人微博聚类研究[J].电脑与电信,2018(04):69-72.

    [] Tomas Mikolov.Word2vec project [EB/OL].[2014-09-18].https://code.google.com/p/word2vec/.

    []Huang Xian-ying, Chen Hong-yang, Liu Ying-tao, et al.A novel feature word selecting method of micro-blog short text[J].Computer Engineering&Science, 2015, 37 (9) :1761-1767. (in Chinese).

    []胡美玉,张云洲,秦操,刘桐伯.基于深度卷积神经网络的语义地图构建[J/OL].机器人:1-12[2019-05-16].https://doi.org/10.13973/j.cnki.robot.180406.

    []Yoon Kim.Convolutional Neural Networks for Sentence Classification.Wed, 3 Sep 2014 03:09:02 GMT (41kb,D).Cornell University Library.

    []刘建平.卷积神经网络(CNN)模型结构[J].博客园,[2017.03.01].https://www.cnblogs.com/pinard/p/6483207.html

    []]Huang Xian-ying, Chen Hong-yang, Liu Ying-tao,et al.A novel feature word selecting method of micro-blog short text[J].Computer Engineering&Science, 2015, 37 (9) :1761-1767. (in Chinese). 

    []Dinghan Shen1.Martin Renqiang Min2.Yitong Li1.Lawrence Carin1.Learning Context-Sensitive Convolutional Filters for Text Processing[J]. Duke University1.NEC Laboratories America2.2018.

    []陈优敏.知识图谱构建方法探究[J].中国新通信,2019,21(05):215.

    []李文宽,刘培玉,朱振方,刘文锋.基于卷积神经网络和贝叶斯分类器的句子分类模型[J/OL].计算机应用研究:1-6[2019-05-16].https://doi.org/10.19734/j.issn.1001-3695.2018.07.0525.

    []邵晓文.多线程并发网络爬虫的设计与实现[J].现代计算机(专业版),2019(01):97-100.

    []袁若瀛.知识图谱系统研发[J].现代信息科技,2019,3(05):13-17.

    []李星宇,王丽娟.基于古诗文知识图谱的诗词创作系统[J].计算机产品与流通,2019(04):106.

    []结合卷积神经网络和词语情感序列特征的中文情感分析[J]. 陈钊,徐睿峰,桂林,陆勤.  中文信息学报. 2015(06).

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • NLP: 基于文本语义的智能问答系统

    千次阅读 2021-02-09 08:35:00
    向AI转型的程序员都关注了这个号????????????人工智能大数据与深度学习 公众号:datayx问答系统是自然语言处理领域一个很经典的问题,它用于回答人们以自然语言形式提出的问题,...


    向AI转型的程序员都关注了这个号????????????

    人工智能大数据与深度学习  公众号:datayx

    问答系统是自然语言处理领域一个很经典的问题,它用于回答人们以自然语言形式提出的问题,有着广泛的应用。

    经典应用场景包括:智能语音交互、在线客服、知识获取、情感类聊天等。

    常见的分类有:生成型、检索型问答系统;单轮问答、多轮问答系统;面向开放领域、特定领域的问答系统。

    本文涉及的主要是在检索型、面向特定领域的问答系统**——智能客服机器人。**

    传统客服机器人的搭建流程

    通常需要将相关领域的知识(Domain Knowledge),转化为一系列的规则和知识图谱。构建过程中重度依赖“人工”智能,换个场景,换个用户都需要大量的重复劳动。

    深度学习-智能问答机器人

    深度语言模型会将问题和文档转化为语义向量,从而找到最后的匹配答案。本文借助Google开源的Bert模型结合Faiss开源向量搜索引擎,快速搭建基于语义理解的对话机器人。

    案例分享:FAQ问答机器人

    FAQ是Frequently Asked Questions的简称。假定我们有一个常见问题和答案的数据库,现在用户提出了一个新问题,能不能自动从常见问题库中抽取出最相关的问题和答案来作答呢?在这个项目中,我们会探索如何构建这样问答机器人。

    项目核心技术点:

    • 通过深度学习模型判断问题与答案的匹配得分

    • 使用BERT模型特征提取并判断问题相似度

    • 使用检索引擎Faiss索引构建和检索

    • 构建在线FAQ问答系统


    0-1 学什么

    结合Faiss和bert提供的模型实现了一个中文问答系统。旨在提供一个用Faiss结合各种AI模型实现语义相似度匹配的解决方案。最后通过项目案例实现:文本语义相似度文本检索系统和FAQ问答机器人。

    0-2 在线系统DEMO

    • 文本语义相似度匹配检索

    • 文本语义FAQ问答机器人

    项目实现以一种平台化思路建议系统,是一个通用的解决方案。开发者只需要按照数据规范即可,不需要修改代码就可以运行系统了

    1 对话系统整体简介

    1-1 对话系统概念

    对话系统可以根据人的输入自动选择或者生成出相应的回复,来达到帮助人们在特定领域或者开放域解决一定的问题。(最后,通过医疗数据提供FAQ智能问答: aiwen2100)

    • 用途:任务型、问答型、闲聊型对话系统;

    • 场景:封闭域、开放域对话系统;

    • 使用方法:检索式、生成式对话系统

    1-1-1 不同对话任务对比

    • 问答型(案例:提供基于文本语义-bert 和 faiss 的通用解决方案)

    用户希望得到某个问题的答案,机器人回复来自于特定知识库,以特定的回复回答用户

    • 任务型

    用户希望完成特定任务,机器人通过语义执行后台已对接能力,帮用户完成指定任务

    • 闲聊型

    用户没有明确目的,机器人回复也没有标准答案,以趣味性的回复回答用户

    1-1-2 检索式对话系统

    基于检索的模型不会产生新的文字,只能从预先定义的“回答集”中挑选出一个较为合适的回答。

    • 缺点

    检索式对话系统不会产生新的回复,其能够回复类型与内容都由语料库所决定。一旦用户的问话超脱了语料库的范围,那么对话系统将无法准确回答用户。

    • 优点

    相对严谨可靠,可控性强,不会回复令人厌恶或违法法规的文本。

    一般处理流程:

    1.问答对数据集的清洗

    2.Embedding(tfidf,word2ec,doc2vec,elmo,bert…)

    3.模型训练

    4.计算文本相似度

    5.在问答库中选出与输入问题相似度最高的问题

    6.返回相似度最高的问题所对应的答案

    1-1-3 生成式对话系统

    基于自然语言理解生成式对话策略:即通过机器学习算法构建深层语义模型,结合句词分析

    等统计规律提取特征,让模型从大量的已有对话中学习对话规则,利用训练好的模型预测结果。

    • 缺点

    评估问题,需要依赖人工评定;生成内容,控制不好会回复令人厌恶或违反法规的文本。

    • 优点

    智能对话,回复内容丰富。

    1-1-4 任务型对话系统

    任务型对话的最终目标是完成指定任务,比如小度智能音箱,需要在每一轮对话都采取合适的决策,保证自己执行正确的指令(即识别出用户的正确意图)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5W9MrmV-1606198473806)(https://uploader.shimo.im/f/iOwhzmol8N1oJdI5.png!thumbnail)]

    多轮对话是一种在人机对话中初步明确用户意图之后,获取必要信息以最终得到明确用户指令的方式。

    这里介绍一种对话管理的一种方式:Frame-Based Dialogue Control,预先指定了一张表格 (Frame),聊天机器人的目标就是把这张表格填满。

    通过一个实际场景的案例来解释上述实现具体执行过程:

    我:『去北京大兴机场多少钱』

    意图:行程花费计算

    槽位:【起始地:当前位置;目的地:北京大兴机场;使用货币:???】)

    智能客服:『您好,请问是使用人民币吗』

    我:『是的』

    意图:行程花费计算

    槽位:【起始地:当前位置;目的地:萧山机场;使用货币:人民币】)

    智能客服:『200元』

    1-2 对话系统关键技术

    1-2-1 相关工具

    1.编程语言:python( 模型 或者服务) ,C++,Java,go 在线服务

    2.数据处理及机器学习相关库:pandas、scikit-learn、jieba

    3.深度学习框架:tensorflow、pytorch

    4.开发工具:pycharm、visual studio code

    5.其它工具:ElasticSearch搜索引擎、向量检索引擎Faiss/Milvus

    1-2-2 检索式相关技术介绍

    1、分词算法

    • 传统算法:HMM隐马尔可夫模型、CRF条件随机场

    • 深度学习:LSTM、Bi-LTSM

    2、文本向量化表示

    OneHot 、N-Gram 、TFIDF等词袋模型、Word2Vec、Doc2Vec、Glove

    Bert(本案例文本向量化表示选择bert) 、XLNet等神经网络模型

    3、文本相似度计算(项目中:我们采用余弦相似度,计算得分)

    余弦相似度、欧式距离

    4、检索方法

    • ElasticSearch搜索引擎

    • 向量检索引擎Faiss(本项目采用,Facebook AI 研究院开源相似性的检索引擎,5000万 ms)

    1-2-3 生成式相关技术介绍

    闲聊系统

    1、Seq2Seq模型

    2、Seq2Seq + Attention模型

    3、Transformer

    4、Bert模型

    1-2-4 任务型相关技术介绍

    重要,在我们实际工作中,很多场景都会用到

    1、意图识别

    2、填槽、对话管理

    3、多轮对话

    分类

    NER识别

    多伦对话(模型,规则。。。。)

    1-3 智能客服调研分析

    客服机器人指帮助客服回答问题提高人工客服效率的机器人。客服机器人可以用于回答客户的常规、重复性的问题,但不是替代,而是辅助人工服务,改变客服工作的模式,进一步提高客服工作效率。

    1-3-1 调研分析

    纯机器人完全替代客服的并不多,人机结合模式使用广泛。分析一下主要有以下几个原因:

    1、机器人响应速度快,且可同时接待多位客户,而且客户不需要等待;

    2、机器人替代人工处理咨询中的重复问题,人工客服不易陷入烦躁情绪,客户体验好;

    3、遇到复杂问题,人机结合模式可以无缝切换人工来处理,顾客体验不会中断。

    1-3-2 智能客服的优势

    1、机器人可以7 X 24 小时在线服务,解答客户的问题。

    2、常问的问题,重复的问题都可以交给机器人来自动回复,省去很多重复的输入及复制粘贴。

    3、可以辅助人工客服,在人工服务的时候,推荐回复内容,并学习人工客服的回复内容。

    1-3-3 如何设计智能客服系统

    1、时间特性要求。系统极限相应时间到底是多少

    2、灵活性。系统的各个模块应该在可控的状态内,每一个模块可插拔,保证线上质量。

    3、安全性。内外网隔离,注意网络完全,系统安全,用户安全,数据安全。

    4、可扩展性:系统的各个模块支持扩展,支持跨平台,支持多种语言,算法模型可以灵活切换。

    5、可靠性:系统和集群稳定运行,主要的集群实现双机热备;实现灾备;当单个节点发生故障可以迅速切换。

    6、可用性:系统的各项功能可用,系统上线必须符合一定的正确率

    1-4 阿里小蜜介绍

    https://blog.csdn.net/qq_40027052/article/details/78672907

    1-4-1 智能客服发展阶段

    • 传统的服务模式

    • 经典的服务模式

    • 智能问答服务模式

    1-4-2 人机交互基本流程

    阿里巴巴于2015年7月推出了阿里小蜜产品,在面世的仅仅几年中,阿里小蜜发展之迅速令人难以想象。阿里小蜜给出了一个典型的智能对话系统的架构。

    自然语言处理(NLP)是对话系统的核心部分

    • 智能问答模块用来完成问答类任务(FAQ问答系同,可以基于语义匹配检索来完成)

    • 智能聊天用来完成闲聊类任务

    • 对话系统自然语言理解采用的是frame semantics 表示的一种变形,即采用领域(domain)、意图(intent)和属性槽(slots)来表示语义结果

    2 应用场景介绍

    CSDN 问答系统:https://ask.csdn.net/

    百度知道:https://zhidao.baidu.com/

    360问答:https://wenda.so.com/search/

    2-2 文本搜索场景

    2-3 论坛相似问答系统

    汽车之家拥有全球最大的汽车社区论坛。积累了丰富的用户问答数据,能够解决用户在看车、买车、用车等方面遇到的各种问题。针对用户在平台上提出的各种问题,从海量的高质量问答库中匹配语义最相似的问题和答案

    文本数据具有表达多样化、用语不规范(如:车型车系用语存在大量缩写、简写、语序颠倒等现象)、歧义性强(如:“北京”可能指汽车品牌,也可能指城市)等特点,这给传统基于关键词匹配的搜索方法带来了很大挑战。因此,在传统关键词匹配的基础上,进一步引入语义搜索技术,将精华问答库的问题映射为多维向量,进行语义匹配,提升问题匹配准确性。

    2-4 智能对话闲聊系统

    数据格式:query-answer 对如下

    不要骂人 好的,听你的就行了

    不要骂人严重的直接禁言 好的,听你的就行了

    不要骂人了吧 好的,听你的就行了

    不要骂人哦 好的,听你的就行了

    不要骂人小心封号啊 好的,听你的就行了

    不认识你不记得你 你当我傻逼啊

    不认识你昂 你当我傻逼啊

    不认识你老哥了 你当我傻逼啊

    3 问答系统发展现状

    FAQ检索型问答流程是根据用户的新Query去FAQ知识库找到最合适的答案并反馈给用户。

    检索过程如图所示

    其中,Qi是知识库里的标准问,Ai是标准问对应的答案。

    具体处理流程为:

    • 候选集离线建好索引

    • 线上收到用户 query ,召回一批候选集作为粗排结果传入下一模块进行进一步精确排序;

    • 利用matching模型计算用户query和FAQ知识库中问题或答案的匹配程度;

    • 利用ranking 模型对候选集做 rerank 并返回 topk个候选答案。

      • matching 模型负责对 (query, reply) pair 做特征匹配,其输出的 matching score 通常会作为 ranking 模型的一维特征;

      • ranking 模型负责具体的 reranking 工作,其输入是候选回复对应的特征向量,根据实际需求构造不同类型(如:pointwise, pairwise, listwise)的损失函数,其输出的 ranking score 是候选回复的最终排序依据。

      • 有些检索系统可能不会明确区分 matching 和 ranking 这两个过程。

    3-1 智能问答常用解决方案

    针对FAQ检索式问答系统,一般处理流程

    • 问答对数据集的清洗

    • Embedding

    • 模型训练

    • 计算文本相似度

    • 在问答库中选出与输入问题相似度最高的问题

    • 返回相似度最高的问题所对应的答案

    搭建一个FAQ问答系统一般实现方法

    • 基于ES的智能问题系统

    (通过关键词匹配获取答案,类似电商、新闻搜索领域关键词召回)

    • 基于TF-IDF方式

    (计算每个单词的tfidf数值,分词后换算句子表示。TF-IDF 方式也在用在关键词提取)

    • 基于Doc2Vec 模型(考虑词和段,相比于word2vec来说有了段落信息)

    • 通过深度学习语言模型bert 提取向量,然后计算相似度

    方案可以扩展到的业务需求(本文介绍的是一种文本语义匹配通用解决方案)

    • 智能客服领域语义匹配

    (对话系统检索式智能问答系统,答案在知识库中且返回唯一的数据记录)

    • 以图搜索(resnet 图片向量化表示)

    • 新闻领域文本相似推荐(相似新闻推荐等)

    • 基于文本语义匹配检索系统(文本相似性rank )

    针对这类问题,重点文本等通过某种方式进行向量化表示(word2vec、doc2vec、elmo、bert等),然后把这种特征向量进行索引(faiss/Milus) ,最终实现在线服务系统的检索,然后再通过一定的规则进行过滤,获取最终的数据内容。

    3-2 传统文本匹配方法存在问题

    传统的文本匹配技术有BoW、VSM、TF-IDF、BM25、Jaccord、SimHash等算法,主要解决字面相似度问题。

    面临的困难:

    由 于中文含义的丰富性,通常很难直接根据关键字匹配或者基于机器学习的浅层模型来确定两个句子之间的语义相似度。

    3-3 深度学习文本匹配

    深度学习模型文本做语义表示逐渐应用于检索式问答系统。

    相比传统的模型优点:

    • 能够节省人工提取特征的大量人力物力

    • 从大量的样本中自动提取出词语之间的关系,并能结合短语匹配中的结构信息和文本匹配的层次化特性,发掘传统模型很难发掘的隐含在大量数据中含义不明显的特征

    本文采用相似问题匹配来实现一个FAQ问答系统。

    问题:什么是相似问题匹配?

    答案:即对比用户问题与现有FAQ知识库中问题的相似度,返回用户问题对应的最准确的答案

    深度语义匹配模型可以分为两大类,分别是representation-based method 和 interaction-based method,这里我们针对Represention-based Method这种方法进行探索。

    这类算法首先将待匹配的两个对象通过深度学习模型进行表示,之后计算这两个表示之间的相似度便可输出两个对象的匹配度。针对匹配度函数f(x,y)的计算通常有两种方法: cosine 函数 和 多层感知器网络(MLP)

    对比两种匹配方法的优缺点

    * cosine 函数:通过相似度度量函数进行计算,实际使用过程中最常用的就是 cosine 函数,这种方式简单高效,并且得分区间可控意义明确
    * 多层感知器网络(MLP):将两个向量再接一个多层感知器网络(MLP),通过数据去训练拟合出一个匹配度得分,更加灵活拟合能力更强,但对训练的要求也更高
    
    • 1

    • 2

    4 问答系统关键技术

    Google 的 BERT 模型在 NLP 领域中具有巨大的影响力。它是一个通用的语言表示模型,可以应用于诸多领域。本文的项目是将 Faiss与 BERT 模型结合搭建文本语义匹配检索系统,使用 BERT 模型将文本数据转成向量,结合 Faiss特征向量相似度搜索引擎可以快速搜索相似文本,最终获取想要的结果

    4-1 Faiss

    Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现。相关介绍参考《Faiss:Facebook 开源的相似性搜索类库》

    4-2 BERT

    BERT 模型是 Google 发布的一个新的语言表达模型(Language Representation Model),全称是 Bidirectional Encoder Representations from Transformers,即双向编码表征模型。BERT 模型的优势体现在两方面。

    • 一方面,它使用基于特别设计的注意力机制(Attention Mechanism)的简单全连接网络取代了复杂的 CNN 和 RNN 网络。不但大大减少了训练时间,同时有效地提升了网络性能。

    • 另一方面,BERT 模型是第一个真正捕获上下文语义信息的预训练语言表示模型。这是因为 BERT 模型使用了 Transformer 作为算法的主要框架,而 Transformer 框架能更彻底地捕捉语句中的双向关系。

    Google 提供了一些预先训练的模型,其中最基本的两个模型是BERT-base 模型和 BERT-large 模型。具体参数如下表所示:

    BERT-base 模型和 BERT-large 模型的参数总量大小和网络层数不同,BERT-large 模型所占计算机内存较多,所以本文项目选用 BERT-base 模型对文本数据进行向量转化。(注:其中,层数(即 Transformer 块个数)表示为 L,隐藏尺寸表示为 H ,自注意力头数表示为 A 。)

    5 问答系统实现

    关于main.py 主要参数

    $ python main.py --help

    usage: main.py [-h] --task TASK [–load] [–index] [–n_total N_TOTAL]

    [–search] [–sentence SENTENCE] [–topK TOPK]

    optional arguments:

    -h, --help show this help message and exit

    –task TASK project task name

    –load load data into db

    –index load data text vector into faiss

    –n_total N_TOTAL take data n_sample ,generate it into faiss

    –search search matched text from faiss

    –sentence SENTENCE query text data

    –topK TOPK take matched data in topK

    第一步:知识库存储 < id,answer>

    $ python main.py --taskmedical–load

    第二步:索引构建<id,question>

    $ python main.py --taskmedical–index --n_total 120000

    第三步:文本语义相似度匹配检索

    $ python main.py --taskmedical_120000–search --sentence 得了乙肝怎么治疗

    备注:medical_120000中task_${索引记录数} 组合

    完成上述功能后,我们可以在此基础上,根据业务不同搭建一些相关应用,例如:

    • 可以实现FAQ智能问答

    • 可以实现新闻资讯内容类文本语义匹配召回

    • 可以实现基于文本语义的中文检索系统

    第四步:基于文本语义检索服务实现FAQ问答

    $ python main.py --taskmedical_120000–search --sentence 身上出现 --topK 10

    第五步:基于文本语义检索服务Web服务

    启动服务python app.py --taskmedical_120000,然后访问地址http://xx.xx.xx.xx:5000/

    我们这里呢,使用上述基础服务完成一个FAQ问答机器人

    5-1 数据规范

    项目数据集包含三个部分:问题数据集+答案数据集+问题-答案唯一标识,数据是一一对应的。

    针对不同的业务系统,我们只需要提供这种数据格式,通过本文的模板就可以快速搭建一个demo了,祝大家学习愉快。

    5-2 系统整体架构

    本文的文本语义匹配搜索项目使用的 Faiss和BERT的整体架构如图所示:

    (注:深蓝色线为数据导入过程,橘黄色线为用户查询过程。)

    • 首先,本文项目使用开源的 bert-serving , BERT做句子编码器,标题数据转化为固定长度

    • 为 768 维的特征向量,并导入 Milvus 或者Faiss库。

    • 然后,对存入 Milvus/Faiss 库中的特征向量进行存储并建立索引,同时原始数据提供唯一ID编码,将 ID 和对应内容存储在 PostgreSQL 中。

    • 最后,用户输入一个标题,BERT 将其转成特征向量。Milvus/Faiss 对特征向量进行相似度检索,得到相似的标题的 ID ,在 知识库(PostgreSQL/MySQL/SQLite。。。) 中找出 ID 对应的详细信息返回

    6-3 文本向量服务 bert-serving

    使用bert as service 服务

    第一步:安装tensorflow

    Python >= 3.5

    Tensorflow >= 1.10 (one-point-ten)

    ubuntu系统-gpu下载离线安装文件并pip安装

    tensorboard-1.15.0-py3-none-any.whl

    tensorflow_estimator-1.15.1-py2.py3-none-any.whl

    tensorflow_gpu-1.15.3-cp37-cp37m-manylinux2010_x86_64.whl

    也可以通过下面的方式快速下载(这里下载cpu版本)

    pip install tensorflow==1.15.0 --user -ihttps://pypi.tuna.tsinghua.edu.cn/simple

    验证是否安装

    import tensorflow as tf

    print(tf.version)

    第二步:bert-serving 服务搭建

    ( 我们在ubuntu系统搭建完成bert-serving ,目录:/home/ubuntu/teacher/ )

    通过bert-serving服务,帮助我们解决:文本-> 向量的转换

    1、参考github 提供的代码

    git clonehttps://github.com/hanxiao/bert-as-service.git

    2、安装server和client

    pip install bert-serving-server # server

    pip install bert-serving-client # client, independent of bert-serving-server

    3、下载pretrained BERT models

    Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters

    https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

    解压模型:

    chinese_L-12_H-768_A-12

    ├── bert_config.json

    ├── bert_model.ckpt.data-00000-of-00001

    ├── bert_model.ckpt.index

    ├── bert_model.ckpt.meta

    └── vocab.txt

    bert_config.json: bert 模型配置参数

    vocab.txt: 字典

    bert_model: 预训练的模型

    4、启动bert-service

    nohup bert-serving-start -model_dir chinese_L-12_H-768_A-12 -num_worker 1 -max_seq_len 64 >start_bert_serving.log 2>&1 &

    ( CPU和GPU 模式都可以 )

    针对每个字段进行说明

    workers = 4 表示同时并发处理请求数

    model_dir 预训练的模型

    max_seq_len 业务分析句子的长度

    关闭服务

    bert-serving-terminate -port 5555

    5、测试文本-> 向量表示结果

    from bert_serving.client import BertClient
    bc = BertClient()
    result = bc.encode(['First do it'])
    print(result)
    
    • 1

    • 2

    • 3

    • 4

    5-4 向量相似度搜索引擎

    产品学习手册

    5-5 知识库存储

    知识库:可以存储mongo/PostgreSQL/mysql 根据数据量进行选择

    本文给大家分享的内容,数据存储在mysql上。

    备注:关于mysql 的具体安装,大家去上网查找一下。(root,12345678)

    大家在学习过程中,如果有任何的问题:可以网站留言(或者weixin: aiwen2100)

    create database faiss_qa;

    use faiss_qa;

    CREATE TABLE answer_info (

    id int(11) NOT NULL AUTO_INCREMENT,

    answer mediumtext COLLATE utf8mb4_bin,

    PRIMARY KEY (id),

    KEY answer_info_index_id (id)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

    5-6 索引构建

    $ python main.py --taskmedical–index --n_total 120000

    5-7文本语义相似度匹配搜索

    $ python main.py --task medical --search --sentence 小安信贷

    完成上述功能后,我们可以在此基础上,根据业务不同搭建一些相关应用,例如:

    • 可以实现FAQ智能问答

    • 可以实现新闻资讯内容类文本语义匹配召回

    • 可以实现基于文本语义的中文检索系统

    对输入数据微小的差别看看有什么不同?

    5-8文本语义FAQ问答机器人-API接口

    首先,我们启动服务:python app.py

    然后,请求API 服务地址查看检索检索


    $ curl -H “Content-Type:application/json” -X POST --data '{“query”: “乙肝怎么治疗”}'http://localhost:5000/api/v1/search| jq

    5-9文本语义FAQ问答机器人-Web界面

    启动服务 python app.py,然后访问地址http://xx.xx.xx.xx:5000/

    用户表达的细微差别,通过文本语义匹配总之能找到最佳的答案,最终反馈给用户。

    例如:两种语言表达看看效果

    第一句:小孩子感冒吃什么

    第二句:小孩子感冒不能吃什么

    上述明显表达的是两个含义,而通过文本语义的方式也很好得识别出来了,效果还不错。

    我们看看后端服务地址数据

    注意:FAQ系统依赖bert-serving 服务,请确认正常工作。

    [http://xx.xx.xx.xx:5000/status
    正常情况下的返回结果格式如下:

    {

    “status”:“success”,

    “ip”:“127.0.0.1”,

    “port”:5555,

    “identity”:“cbc94483-1cd6-406d-b170-0cb04e77725bb”

    }

    6 总结展望

    在 AI 高速发展的时代,我们可以使用深度学习模型去处理各种类型的非结构化数据,例如图片、文本、视频和语音等。本文项目通过 BERT 模型可以将这些非结构化数据提取为特征向量,然后通过Faiss 对这些特征向量进行计算,实现对非结构化数据的分析与检索。

    本文利用Faiss搭建的FAQ问答系统也只是其中一个场景,展示了Faiss在非结构化数据处理中的应用。欢迎大家导入自己的数据建立自己的FAQ问答系统(或者文本搜索、智能客服等新系统)。Faiss向量相似度检索引擎搜索十亿向量仅需毫秒响应时间。你可以使用 Faiss探索更多 AI 用法!

    原文地址 https://wenjie.blog.csdn.net/article/details/107823959


    阅读过本文的人还看了以下文章:

    TensorFlow 2.0深度学习案例实战

    基于40万表格数据集TableBank,用MaskRCNN做表格检测

    《基于深度学习的自然语言处理》中/英PDF

    Deep Learning 中文版初版-周志华团队

    【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

    《美团机器学习实践》_美团算法团队.pdf

    《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

    特征提取与图像处理(第二版).pdf

    python就业班学习视频,从入门到实战项目

    2019最新《PyTorch自然语言处理》英、中文版PDF+源码

    《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

    《深度学习之pytorch》pdf+附书源码

    PyTorch深度学习快速实战入门《pytorch-handbook》

    【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

    《Python数据分析与挖掘实战》PDF+完整源码

    汽车行业完整知识图谱项目实战视频(全23课)

    李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

    笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

    《神经网络与深度学习》最新2018版中英PDF+源码

    将机器学习模型部署为REST API

    FashionAI服装属性标签图像识别Top1-5方案分享

    重要开源!CNN-RNN-CTC 实现手写汉字识别

    yolo3 检测出图像中的不规则汉字

    同样是机器学习算法工程师,你的面试为什么过不了?

    前海征信大数据算法:风险概率预测

    【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

    VGG16迁移学习,实现医学图像识别分类工程项目

    特征工程(一)

    特征工程(二) :文本数据的展开、过滤和分块

    特征工程(三):特征缩放,从词袋到 TF-IDF

    特征工程(四): 类别特征

    特征工程(五): PCA 降维

    特征工程(六): 非线性特征提取和模型堆叠

    特征工程(七):图像特征提取和深度学习

    如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

    Machine Learning Yearning 中文翻译稿

    蚂蚁金服2018秋招-算法工程师(共四面)通过

    全球AI挑战-场景分类的比赛源码(多模型融合)

    斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

    python+flask搭建CNN在线识别手写中文网站

    中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

    不断更新资源

    深度学习、机器学习、数据分析、python

     搜索公众号添加: datayx  


    机大数据技术与机器学习工程

     搜索公众号添加: datanlp

    长按图片,识别二维码

    展开全文
  • A校招生咨询智能问答系统主要功能模块包括资讯数据管理、用户注册管理、留言管理、网上咨询管理、智能问答、系统管理,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应...
  • 基于知识图谱的智能问答系统python实现(复旦大学论文基于qa语料和知识库的问答系统)_python 智能问答,python 智能问答系统-机器学习代码类资源本代码实现是基于python实现的基于复旦大学崔万云博士的learing ...
  • 为此本文提出了基于高考领域知识图谱, 使用中文分词模型和朴素贝叶斯分类算法, 设计并开发了针对高考学业规划的智能问答系统. 与传统的搜索引擎不同的是, 基于人工智能的问答系统能够对考生所关注的问题和搜索结果...
  • 平安人寿的技术分享ppt,关于其搭建智能问答系统的一些技术探索和实践
  • 旅游行业问答系统设计旅游行业问答系统设计(仅供学习和参考)
  • 基于知识图谱的智能问答系统

    千次阅读 2020-05-31 12:47:52
    本次实验拟设计一个智能问答系统,并应当保证该智能问答系统可以回答5个及其以上的问题。由于本实验室目前正在使用知识图谱搭建问答系统,故而这里将使用知识图谱的方式构建该智能问答系统。这里...

    公众号关注 “ML_NLP”

    设为 “星标”,重磅干货,第一时间送达!

     

    来自 | 知乎

    地址 | https://zhuanlan.zhihu.com/p/58248608

    作者 | 张墨一

    编辑 | 机器学习算法与自然语言处理公众号

    本文仅作学术分享,若侵权,请联系后台删文处理

     

    1 任务背景:

    本次实验拟设计一个智能问答系统,并应当保证该智能问答系统可以回答5个及其以上的问题。由于本实验室目前正在使用知识图谱搭建问答系统,故而这里将使用知识图谱的方式构建该智能问答系统。这里将构建一个关于歌曲信息的问答系统。以“晴天”为例,本系统应当能够回答晴天的歌词是什么,晴天是哪首专辑的歌曲,该专辑是哪一年发行的,该专辑对应的歌手是谁,该歌手的的基本信息是什么。

    本系统的环境配置过程以及全部代码均已上传Github。下面的文章主要介绍的是系统总体结构以及部分代码解析。

    zhangtao-seu/Jay_KGgithub.com

    2 系统总体工作流程图

    在搭建系统之前,第一步的任务是准备数据。这里的准备的数据包括周杰伦的姓名,个人简介,出生日期,以及发行的所有专辑名字,《叶惠美》专辑的名字,简介以及发行日期,《以父之名》、《晴天》的歌曲名和歌词。

    准备好数据之后,将数据整理成RDF文档的格式。这里采用手工的方式在protégé中构建本体以及知识图谱。本体作为模式层,这里声明了三个类,包括歌手类、专辑类和歌曲类;声明了四种关系,也叫objectProperty,包括include,include_by,release和release_by。其中include和include_by声明为inverseOf关系,表示专辑和歌曲之间的包含和被包含的关系。Release和release_by声明为inverseOf关系表示歌手和专辑之间的发行和被发行的关系;声明了8种数据属性,也叫DataProperty,分别为singer_name,singer_birthday,singer_introduction,album_name,album_introduction,album_release_date,song_name和song_content。将上述准备好的数据以individual和dataProperty的形式写进知识图谱。至此,就准备好了我们的RDF/OWL文件了。

    接着,为了使用RDF查询语言SPARQL做后续的查询操作,这里使用Apache Jena的TDB和Fuseki组件。TDB是Jena用于存储RDF的组件,是属于存储层面的技术。Fuseki是Jena提供的SPARQL服务器,也就是SPARQL endpoint。这一步中,首先利用Jena将RDF文件转换为tdb数据。接着对fuseki进行配置并打开SPARQL服务器,就可以通过查询语句完成对知识图谱的查询。

    最后,将自然语言问题转换成SPARQL查询语句。首先使用结巴分词将自然语言问题进行分词以及词性标注。这里将专辑名字和歌曲名字作为外部词典以保证正确的分词和词性标注。以“叶惠美”为例,结巴分词将“叶惠美”标注为nr,即人名,这里“叶惠美”作为专辑名字应该标注为nz,即专有名词。对于不同类型的问题,我们将问题匹配给不同的查询语句生成函数从而得到正确的查询语句。将查询语句作为请求参数和Fuseki服务器通信就能得到相应的问题结果。上述工作流程图如图2-1所示。

     

     

    图2-1 系统工作流程图

    3 系统实现

    3.1 系统实现工具和环境

    使用protégé构建知识库的本体和知识图谱。首先是定义模式层,包括class,objectProperty和dataProperty。以歌曲类为例,其RDF代码为:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲 -->
    <owl:Class rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲">
     <rdfs:subClassOf>
     <owl:Restriction>
     <owl:onProperty rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#song_content"/>
     <owl:allValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
     </owl:Restriction>
     </rdfs:subClassOf>
     <rdfs:subClassOf>
     <owl:Restriction>
     <owl:onProperty rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#song_name"/>
     <owl:allValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
     </owl:Restriction>
     </rdfs:subClassOf>
    </owl:Class>

    可以看出class “歌曲”包含了song_name和song_content两个dataProperty。以include的关系为例,其RDF代码如下:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include -->
    <owl:ObjectProperty rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include">
    <owl:inverseOf rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include_by"/>
    <rdfs:domain rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#专辑"/>
    <rdfs:range rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲"/>
    </owl:ObjectProperty>

    可以看出该关系和include_by是inverseOf的关系,其关系主语是专辑,宾语是歌曲。以singer_introduction的dataProperty为例,其RDF代码如下:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#singer_introduction -->
    <owl:DatatypeProperty rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#singer_introduction">
    <rdfs:domain rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌手"/>
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
    </owl:DatatypeProperty>

    可以看出其主语是歌手类,其宾语是字符串。

    接着是数据层。图3-1和图3-2是系统的知识图谱可视化的结果。可以看出,“七里香”是一个专辑,“东风破”是一首歌曲。

     

     

     

    图3-1专辑知识图谱可视化

     

     

     

    图3-2 歌曲知识图谱可视化

    使用Feseki启动SPARQL服务器,可以在localhost:3030中实现数据的查询。以查询“以父之名”的专辑为例,图3-3展示其查询代码和查询结果,可以看出如下语句可以得到查询结果“叶惠美”。

     

     

     

    图3-3 Feseki平台的查询情况

    3.2 自然语言处理核心代码分析

    使用结巴分词将自然语言句子实现分词和词性标注。其核心代码如下:

    import jieba
    import jieba.posseg as pseg
    class Word(object):
    def __init__(self, token, pos):
     self.token = token
     self.pos = pos
    class Tagger:
    def __init__(self, dict_paths):
     # TODO 加载外部词典
     for p in dict_paths:
     jieba.load_userdict(p)
    @staticmethod
    def get_word_objects(sentence):
     # 把自然语言转为Word对象
     return [Word(word.encode('utf-8'), tag) for word, tag in pseg.cut(sentence)]

    这段代码可以将句子作为一个输入,输出句子的分子和词性,以“叶惠美是什么发布的?”为例,可以得到以下结果:

     

     

     

    图3-4 结巴分词示意图

    将句子作为参数传递给Rule对象,根据关键字匹配相一致的查询语句的生成函数,Rule对象和关键字匹配的代码如下:

    from refo import finditer, Predicate, Star, Any, Disjunction
    import re
     
    class W(Predicate):
     def __init__(self, token=".*", pos=".*"):
     self.token = re.compile(token + "$")
     self.pos = re.compile(pos + "$")
     super(W, self).__init__(self.match)
     
     def match(self, word):
     m1 = self.token.match(word.token.decode("utf-8"))
     m2 = self.pos.match(word.pos)
     return m1 and m2
     
    class Rule(object):
     def __init__(self, condition_num, condition=None, action=None):
     assert condition and action
     self.condition = condition
     self.action = action
     self.condition_num = condition_num
     
     def apply(self, sentence):
     matches = []
     for m in finditer(self.condition, sentence):
     i, j = m.span()
     matches.extend(sentence[i:j])
     return self.action(matches), self.condition_num
    # TODO 定义关键词
    pos_person = "nr"
    pos_song = "nz"
    pos_album = "nz"
    person_entity = (W(pos=pos_person))
    song_entity = (W(pos=pos_song))
    album_entity = (W(pos=pos_album))
    singer = (W("歌手") | W("歌唱家") | W("艺术家") | W("艺人") | W("歌星"))
    album = (W("专辑") | W("合辑") | W("唱片"))
    song = (W("歌") | W("歌曲"))
    birth = (W("生日") | W("出生") + W("日期") | W("出生"))
    english_name = (W("英文名") | W("英文") + W("名字"))
    introduction = (W("介绍") | W("是") + W("谁") | W("简介"))
    song_content = (W("歌词") | W("歌") | W("内容"))
    release = (W("发行") | W("发布") | W("发表") | W("出"))
    when = (W("何时") | W("时候"))
    where = (W("哪里") | W("哪儿") | W("何地") | W("何处") | W("在") + W("哪"))
     
    # TODO 问题模板/匹配规则
    """
    1.周杰伦的专辑都有什么?
    2.晴天的歌词是什么?
    3.周杰伦的生日是哪天?
    4.以父之名是哪个专辑里的歌曲?
    5.叶惠美是哪一年发行的?
    """
    rules = [
     Rule(condition_num=2, condition=person_entity + Star(Any(), greedy=False) + album + Star(Any(), greedy=False), action=QuestionSet.has_album),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + song_content + Star(Any(), greedy=False),
     action=QuestionSet.has_content),
     Rule(condition_num=2, condition=person_entity + Star(Any(), greedy=False) + introduction + Star(Any(), greedy=False),
     action=QuestionSet.person_inroduction),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + album + Star(Any(), greedy=False),
     action=QuestionSet.stay_album),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + release + Star(Any(), greedy=False),
     action=QuestionSet.release_album),
    ]

    匹配成功后,通过action动作出发相对应的函数能够生成相对应的查询语句。以查询“以父之名是哪个专辑的歌曲?”为例,其生成查询语句的代码如下:

    # TODO SPARQL前缀和模板
    SPARQL_PREXIX = u"""
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
    PREFIX : <http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#>
    """
    SPARQL_SELECT_TEM = u"{prefix}\n" + \
     u"SELECT {select} WHERE {{\n" + \
     u"{expression}\n" + \
     u"}}\n"
    class QuestionSet:
    @staticmethod
     def stay_album(word_object):
     # 以父之名是哪个专辑的歌曲
     select = u"?x"
     sparql = None
     
     for w in word_object:
     if w.pos == pos_song:
     e = u" :{song} :include_by ?o."\
     u" ?o :album_name ?x.".format(song=w.token.decode('utf-8'))
     sparql = SPARQL_SELECT_TEM.format(prefix=SPARQL_PREXIX,
      select=select,
     expression=e)
     break
     return sparql
    最后,将得到的查询语句作为请求参数和SPARQL服务器进行通信并对得到的结果进行解析就能得到我们想要的答案,其核心代码如下:
    from SPARQLWrapper import SPARQLWrapper, JSON
    from collections import OrderedDict
     
     
    class JenaFuseki:
     def __init__(self, endpoint_url='http://localhost:3030/jay_kbqa/sparql'):
     self.sparql_conn = SPARQLWrapper(endpoint_url)
     
     def get_sparql_result(self, query):
     self.sparql_conn.setQuery(query)
     self.sparql_conn.setReturnFormat(JSON)
     return self.sparql_conn.query().convert()
     
     @staticmethod
     def parse_result(query_result):
     """
     解析返回的结果
     :param query_result:
     :return:
     """
     try:
     query_head = query_result['head']['vars']
     query_results = list()
     for r in query_result['results']['bindings']:
     temp_dict = OrderedDict()
     for h in query_head:
      temp_dict[h] = r[h]['value']
     query_results.append(temp_dict)
     return query_head, query_results
     except KeyError:
     return None, query_result['boolean']

    以上就是将自然语言转换成SPARQL查询语言并与Feseki进行通信的核心代码。

    3.3 代码运行结果

    这里分别从歌手的简介,专辑的发行时间,歌手的所有专辑,歌曲属于哪个专辑以及歌曲的歌词等5类问题做问答,均能达到良好的表现效果。其问答情况如图3-5所示。

     

     

    图3-5 问答系统运行结果实例

    最后:

    代码部分参考了:

    知识图谱-给AI装个大脑zhuanlan.zhihu.com

    配置部分参考了:

    https://blog.csdn.net/keyue123/article/details/85266355blog.csdn.net

     

    重磅!忆臻自然语言处理-学术微信交流群已成立

    可以扫描下方二维码,小助手将会邀请您入群交流,

    注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]

    例如 —— 哈工大+张三+对话系统。

    号主,微商请自觉绕道。谢谢!

     

     

    推荐阅读:

    PyTorch Cookbook(常用代码段整理合集)

    通俗易懂!使用Excel和TF实现Transformer!

    深度学习中的多任务学习(Multi-task-learning)——keras实现

    展开全文
  • 震惊!!!史上最强 python 智能问答系统现世

    多人点赞 热门讨论 2021-08-16 19:51:01
    欢迎来到史上最强 python 智能问答系统,以下代码价值不菲,请尽快收藏学习。 编不下去了,直接上代码: def is_chinese(str_): # 判断字符串是不是汉字 for ch in(str_): return True if '\u4e00' <= ch <=...
  • 本文将从大数据+Python爬虫技术出发,运用Python语言打造便捷、高效的智能问诊服务平台;本平台基于日常聊天库、医学知识库等,运用对话交互技术,解决患者医疗、健康类咨询需求。比如医院科室位置、就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,076
精华内容 10,430
关键字:

智能问答系统