整理到第四天越来越心虚了,因为发现好多专业的技术都不知道,比如关于语义的分析提取之类的,后面打算专门针对这些专业性的“玩法”整理下。那么今天,就继续整理下人机问答的原理实现吧!
更多内容参考:
背景
在很多的领域其实都需要这样一个问答系统,问答系统有很多种交互的方式。先来目睹一下问答系统的风采吧:
比如在线的聊天机器人
想要体验一下的话,可以点击传送门
比如智能的搜索平台
关于这种问答系统,好坏的评测很简单,直接人工肉眼就能判断出来回答的是否是自己想要的,因此小白的体验用户也可以直观的评测一个问答系统效果是否足够好。
基于问答库的实现方法
首先可以设想一下:
如果即没有任何高大上的机器学习算法,也没有任何复杂的公式,怎么设计一个问答系统?
如果现在只使用java和mysql(想要个页面也可以加上jshtml....),那么只要我们的数据库里问答的内容足够多,就能支撑这样的问答系统。不过数据支持的搜索过于简单,只支持普通的%
的模糊搜索。
接下来,我们可以引入一些分词工具(lucene),或者直接借助全文检索的系统(solr、elasticsearch)。这样我们输入的内容就可以以全文检索的形式进行查询了。不过基于全文检索,即TF-IDF词频逆文档频率算法,效果仍然有限,比如一些词语的位置无法识别、同义词等无法识别。
为了解决这个问题,可以再引入一些自然语言处理的技术手段,比如实现一些同义词的识别、词性的转换等等。
总结起来,大致的流程就是:
- 判断类型的问题,用于锁定问题的精准范围(可以采用一些分类的机器学习算法)
- 信息提取:提取关键词
- 基于关键词的搜索,可以直接基于TF-IDF算法搜索,也可以基于word2vec转变空间向量使用相似词进行搜索
- 结合问题的主题等信息对候选集的答案进行打分
- 返回得分最高的TopN候选答案
基于知识图谱的实现方法
基于问答库的做法,已经能实现一个基本的问答系统了。但是他其实并不智能,因为所有的答案都需要事先录入好。没有准备的问题,就无法找到对应的答案....试想一下,人类说话的方式多种多样,稍微变一下,就可能得不到想要的答案,这得是多么烂的系统啊。
随着最近知识图谱的兴起,人机问答系统又迎来了一波春天....关于知识图谱可以简单的说一下,知识图谱里面有这样几种类型:
- 实体,比如刘德华、北京、奔驰
- 属性,比如年龄、地址、性别
- 关系,比如夫妻、父子、前任
有了这样的定义,就可以基于我们自己拥有的知识库建立知识图谱了。
举个例子,在电商领域阿迪、耐克、三楼、白色都是实体,阿迪
和白色
之间是一种属性的关系,比如颜色
,因此可以得到这样的图:
阿
迪与耐克之间又有一些关系,比如竞争
:
有了这样的知识图谱之后,我们就可以进行一些智能的搜索了。
在问答系统系统中一般有这样几种方法:
基于语义解析
语义解析一听就是跟语言学有关的东西,由于我缺少这方面的背景,所以只能讲个大概,也许还会有很多纰漏。我们在小学学习语文的时候,老师就教过主谓宾定状补
,现在不知道大家还记不记得:
- 主语:一个句子的主体,也是整个句子的核心,所有的操作行为的发起者
- 谓语:主体做的动作
- 宾语:动作的承受者
- 定语:描述一些程度
- 状语:时间地点
- 补语:做一些数量、状态的补充
比如明明(主语)在不二心(状语)吃(谓语)了六个(补语)超好吃(定语)的肉包子(宾语)
,而在英文里面词性又不一样了,英文中不是主谓宾定状补
而是名词``代次``形容词``副词``动词
...一般来说为了统一表示,在自然语言处理里面,都是使用统一的代号进行处理的,比如:
S表示句子;NP、VP、PP是名词、动词、介词短语(短语级别);N、V、P分别是名词、动词、介词。
比如下面两个语法树:
那么有了这样的语法树,就可以基于语法树形成特定的查询语言,直接基于知识库进行查询了,比如转化成SPARQL
进行查询,比如:
Number of dramas starring Tom Cruise?
可以转化成查询语言:
基于信息提取
信息提取的方式,跟之前的语义树查询的方式稍有不同。对于这样的问题:
what is the name of Justin Bieber brother?
会形成语法的依存树,然后根据依存树再生成问题图:
基于这样的问题图,我们很容易能到知识图谱里面查询到相关的实体,然后得到基于这个实体的子图。得到子图后,就可以从这个实体出发,把所有的关系对应的实体都做为回答的候选集。当然不仅仅是一层的关系,也可以收集两层的图作为候选集。有了这样的候选集就剩下寻找最优答案的问题了,寻找答案的方法有很多,比如抽取答案的特征与问题的特征两两组合,基于朴素贝叶斯算法选取概率最大的候选答案。
基于word embedding
说完基于特征的信息提取,就要说说这个word embedding,word embedding是一种概念,即区别于普通的One hot编码。
- one hot:一位有效编码,一般都是该维有N个值,那么就会用N-1位来表示该维度的数据,从而方便机器学习进行模型的训练和计算。然而one hot有个缺点就是无法识别词之间的关系,比如父亲和母亲、北京和上海
- word embedding:也叫做词嵌入,常用的方法有word2vec。这种方法是基于大量的语料库去分析词语被表达的向量,中间的过程暂且不谈,最终的效果就是父亲-母亲 = 男-女,也就是说在用夹角余弦计算相似度的时候,同种类型的词语往往相似度都比较高。
那么在问答系统中,就是对问题进行特征的提取,然后转变成word embedding的表示方法;再对知识库中的答案提取特征,形成word embedding,最终基于计算两者的关系,来寻找最匹配的答案。这种基于word embedding的表达方式寻找最佳的匹配,也被应用到了推荐系统的场景,因此还是值得好好研究一下的。
基于深度学习
由于word embedding其实也是基于特征词的,因此在提取特征词的时候都会忽略掉位置等等的因素。比如,谢霆锋的爸爸是谁?
和谢霆锋是谁的爸爸?
就是两个完全不同的问题。但是在深度学习中,如果使用一些循环神经网络,就可以把每个词作为下一个词分析的输入,也就变相的考虑了词语的顺序特征。具体的就不详谈了,能力有限...
对深度学习如何在问答系统中应用,可以参考知乎专栏——揭开知识库问答KB-QA的面纱
参考
- 基于KB-QA知识库的问答系统:https://zhuanlan.zhihu.com/p/25735572
- 什么是知识图谱:http://www.jianshu.com/p/ae871569af02
- 图灵机器人体验处:http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp
- 人机问答系统的工作原理:http://www.csdn.net/article/2014-08-13/2821188
- QA问答系统中深度学习的技术实现:http://www.52nlp.cn/qa问答系统中的深度学习技术实现
- 百度问答系统:https://www.leiphone.com/news/201702/LDdGVnuiyP9HiPXa.html?viewType=weixin