课外天地 李树青学习天地信息检索原理课件 → [转帖]领域应用 | 基于知识图谱的厨房领域问答系统构建


  共有3529人关注过本帖树形打印复制链接

主题:[转帖]领域应用 | 基于知识图谱的厨房领域问答系统构建

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1789 积分:23743 威望:0 精华:24 注册:2003/12/30 16:34:32
[转帖]领域应用 | 基于知识图谱的厨房领域问答系统构建  发帖心情 Post By:2017/5/23 8:48:13 [只看该作者]

Tip:索答科技已经将 50w 菜谱本体信息在 OpenKG 上开放出来,每个菜谱包含菜名,食材,味道,烹饪时间等属性。链接

http://openkg.cn/dataset/summba-recipe

 

 
第一个部分就是我们厨房这个领域的问答,到底我们有哪些问题,或者我们应该怎么去做问答;接下来就是在问答系统当中,我们有很多的方式都可以去解决一个问题,那最后我们选择目前看来比较科学的一种方式,就是知识图谱技术;之后会跟大家分享一下,我们在整个的过程当中踩过的一些坑,就是遇到的一些问题,最后也给大家探讨一下我们遇到的一些困难。
 
1 厨房领域的问答系统
 


首先我们看一下,在我们这个厨房产品当中,我们有四个部分的回答。第一个部分就是菜谱,菜谱我们分成了很多的维度,通过问答系统,你可以知道哪一道菜,比如说红烧肉怎么做等等。第二个部分就是音乐,那在厨房里面这个枯燥的时间,我们可以说:“我想听一个轻松的音乐”等等。视频也是类似的,比如说我想看《人民的名义》第九集等等。最后一块是厨电的控制,那我们的清单是把厨房的厨电部分,做了一个中控系统,就是说我可以打开油烟机,比如说打开灶具,你可以做到这样的一个联动,再比如说我想炒鸡蛋,那可能你的灶具跟你的油烟机,要同时打开来这样的。
 
那么接下来的部分,我们主要是探讨菜谱这一块的内容,就是我们如何用知识图谱这样一种方式,去处理这样的一个菜谱的问答的问题。

 

那菜谱首先是这样的,比如说我们以水煮鱼为例,它不仅仅是水煮鱼怎么做,就这样结束了对吧。它有很多很多的维度,就比如说你这个水煮鱼的食材到底是什么,你是用草鱼制作,还是用鲫鱼制作,然后你这个水煮鱼是什么样的味道?然后它有什么样的功效等等。那我们就把它形成了这样的一张图,那这个图中间的这个点就是我们菜谱的名称,然后后面有各种各样的属性,以及它的属性值,我们大体要做这样的一个原始的,一个最小化的节点就是这样的。


那下面我们有三种不同方式的可以去跟它沟通。第一个就是同意表达,就是说我就说了“水煮鱼的做法”就这样的一句话,那这个时候可能我们的用户在使用的时候,是各种各样的问法,因为你不清楚大家,你要怎么去问他。这个里面随便列了一些,就比如说我针对厨房的一款产品,就跟他说水煮鱼,那你说它应该要出来一个什么样的结果,因为它这是有一个场景的限定的。另外比如说我想知道水煮鱼的菜谱,或者是查一下水煮鱼的做法,我应该怎么做水煮鱼等等。那么只要是大家问到这样的类似的,或者是同意的一种表达,那我们应该出来的结果都是同一个,就是我要教你做这个水煮鱼,怎么去做它,然后在同一个问题当中,我们现在是统计了一下,目前的语料当中显示,我们现在有超过40种的方法,都是同一个问题是这样的,我们要解决这样的一个问题。

 

第二个就是多个维度的问题。我们刚才说的这个话题,一个水煮鱼我们怎么去问它,下面就是说在这个水煮鱼,我们从第一幅图看来,它有很多很多周边的一些维度,那么比如说就像食材,那食材我可以说洋葱能做什么菜,我也可以刚才说的那个草鱼能做什么菜,可能水煮鱼只是它的一个部分是这样的,然后还有功效,比如说减肥要吃什么菜对吧,尤其是现在健康饮食也是得到大家越来越关注的一个点。比如说一个肚子比较大的人,可能问他的时候,就问减肥要吃什么菜,还有菜系,比如说粤菜、川菜等等。另外还有一种组合的问法,比如说我现在冰箱里只有土豆和牛肉,那它能做什么菜,或者是能做什么不辣的菜,这样的一些非常复杂的一些问法,然后我们目前的这个维度一共有8个,如果把这8个维度,跟我们的食材本身,让它们交叉,相互的这样去组合的话,其实它的问法是无穷无尽的,你不清楚别人到底要怎么去问,所以这样的一个问题,你是没办法罗列,或者是用规则的方式去处理这样一个问题。

 

另外一个就是页面上的一些指令。这些指令跟我们本身的页面是有关系的,右下角的这张图,就是说宫保鸡丁怎么做,怎么做之后我们就会出来一个页面,这个页面上面有三个信息,一个就是有它的视频,右边是它的食材,再下面是它的步骤。那在这个页面的时候,我可能就不会再说我想看一下宫保鸡丁的视频,那在这个页面,我可能就会跟他说看一下视频,那这个就需要这样一个看信息,那在这个页面说看一下视频,那特指就是宫保鸡丁的视频,步骤也是一样的,然后除此之外,可能到步骤页面之后,我只会跟他说下一步,我不会说第三步或者是第四步等等。所以这一个菜谱,领域范围里面所有的这样的,我们说到三个部分的一些问法。


 

那么整个的厨房领域里面,我们处理流程是这样的,首先我们的这个产品,是用语音去跟它交互的,所以第一个部分我们要进行语音的识别。语音识别它不是一直都是监听的过程,就是说首先这个就像跟人说话这样的一个交流过程是一样的,那我可能首先打个招呼,然后再去跟你说话,那这个部分我们叫做语音唤醒。然后唤醒之后,我们就可以用语音去跟它说话,说完之后,它要把这个语音变换成文字。那这个环节叫语音听写,变成了文字之后,这个文字其实有很多的,也是有错误的信息的,那么前面这个部分,目前国内应该是科大讯飞做的是最好的,另外还有思必驰都会做这一块。那目前前面这个部分,我们也是调上科大讯飞的接口,那么调完了之后,我们就得到了文本。

那这个文本我们会发现,里面有很多很多不是我们想要的,举个例子说,就像鱼香肉丝怎么做?那最后我们调到检索之后,出来的文本是“雨”香肉丝,那么这个时候你再到实体里面去做匹配的时候,就会出错。所以我首先在做语义分析之前,第一步要进行文本的纠错,那文本纠错我们这个里面,主要用到两种方式,一种方式就是一个概率模型,就在我们的语料库里面,然后我们做了一个字跟词之间,序列这样的一个概率模型,那么一句话来了之后,我就会看,这个词它出现下一个词的概率是多高,然后对它进行纠错。另外还有一些本身实体,本身的名称,我们就到实体铺里面,去给它进行纠错是这样的。那么纠完错之后,下一步我们是进行垃圾过滤,因为我们这个里面一共有四类,其实我们分类的结果,应该是五个类别,就是4+1,那这个里面的垃圾来自于我们是不是在跟机器说话,或者说我问的是不是跟它相关的问题,或者我是不是在跟别人说话,以及我们这个里面,还有一些什么其他的,就是跟它无关的这样一些垃圾,要把它过滤掉。那么过滤的这个准则,主要还是用检索这样的一种方式,就是我们有问题相关的实体库,然后你来这一句话,我会跟它进行比较是这样。第三步我们进行文本分类,这些地方的主要工作,是分本分类的技术,我们已跨过了两个台阶。首先我们做了一些问句的模板,就比如说什么怎么做,或者是什么菜怎么吃,我们把所有的跟菜谱相关的动词都拿下来了,应该是 231 个,然后再根据它的上下文,去做这样的一个事情。那么第二个步骤,我们现在应该全部把它放到 Deep Learning 里面去用 CNN 去训练。因为我们目前它的分类的文本的 training set 已经足够大了,也就是说我所有的正文本的标注是足够的.那这样的话,任何一句话来了之后,我们在每一个里面做了一个二分类这样的一个问题,现在基本上全部转换成 Deep Learning 这样一种方式。文本分类之后,我们就知道它是哪一个类别的,那这个时候我就把它里面的实体以及属性把它抽取出来,就比如说红烧肉怎么做,那我就把红烧肉拿出来,以及“做”这样的一个动词拿出来,那我就知道它们的组合方式,接下来我就会生成这个逻辑表达式,逻辑表达式我们现在生成的就是“与或非”之间的关系,比如说就像土豆、豆角它们两者其实是连着的关系,比如辣不辣是“非”的关系。然后最后我们要到知识图谱中查找的时候,我们会生成这个SPARQL查询语句,这个语句还是 Apache Jena 里面开源出来这样的一种方式,后面我们也会提到。

做好了语义分析的这一步之后,我们就可以得到我们想要的答案了,那这个答案我们是分在三个地方的,一个就是数据库,比如说我们有一些图片的 ID,或者是实体的 ID,这些就在数据库里面根据 ID 把它拿出来。另外一个部分,有一些实体,我们是放在 Elasticsearch 里面的,这样的话我们从里面检索出来就好了。但我们有一些语义跟实体之间的推理关系的时候,那我们就把它放在知识图谱里,然后从知识图谱里面出答案。在这个的这个流程当中,是我们目前的一个基本的流程。

 

之前的话,我们也曾经尝试用 Elasticsearch 去做过这样一件事情。那也就是说 ES 其实它只是个检索的功能,就是在 Lucene 存储的基础之上然后做的一个分布式的一个框架。那在这个里面,它主要是基于关键字这样的一个搜索方式来做的,是否包含着这个关键字。但是知识图谱,它会有关键词的上下位这样的一层关系,就是说它具有推理的功能。那下面举个例子,比如我们说萝卜能做什么菜,会发现有胡萝卜什么炒肉,或者是白萝卜什么炖汤,那这样的就找不出来了。就是说在一个仅仅是从词匹配的角度上来说,那只能做到这一步,那这个时候如果我们有上下位的关系,那我知道这个萝卜下面它是包含着红萝卜或者是白萝卜,并且它们都是食材的这样一个分类。大家如果是一直跟着 CCKS 这样的一个规律,就会发现这个图其实跟 CCKS 第二届的时候,漆桂林教授讲的一个知识图谱分类的那一张特别像,当时写的是疾病的那样的一张图,其实我们把它运用到这样的一个食材当中来了。那这个就是我们目前所做的这一个领域问答里面的相关问题。
 
2 知识图谱技术的运用

 

 

下一个话题我们来说一说我们的知识图谱,在我们刚刚说的这样的一些问题当中,是怎么得到解答的。首先我们看一看,目前这样的一个整体框架。

2.1 整体框架

2.1.1 数据存储
我们从下往上看,首先数据我们要把它存在什么地方。我们要把它的基础数据,目前是用这样的一个分布式框架,那么基础数据,我们会放在 Hbase 里面,就比如说我们菜谱的图片数据,那这样的数据它是很大的一个数据集,那就会放在 Hbase 里面。然后我们需要处理的一些数据,一些原始数据,我们也会放在 Hbase 里面,然后我们通过 MapReduce 的程序去得到我们想要的一个结果,我们想要这个结果的时候,我们就会把它同步到Mongodb里面去。因为 Hbase 跟 Mongodb 它们各有优势,Hbase 写入的速度,如果跟 Mongodb 比起来的,它要快了更多,但是它读取的速度,是不如 Mongodb。那也就是说我最后呈现的数据,要从 Mongodb 里面呈现出来,那么 Hbase 主要是做基础数据的存储是这样的。然后还有一些关系性特别强的数据,我们会放在 Mysql 里面,但是这一块基本上已经非常弱化了。

那么第二个部分就是图数据,那么图的数据,就是我们刚才讲的那个三元组的这样一种方式,那么三元组它会一个实体、个数跟三元组,三元组的个数会是实体个数的好多倍这样的一种关系。因为它们之间要不同的组合,那这个时候,我们采用的是网络本体语言就是 OWL 这样的一种表示方式,但是这个除此之外,前面应该还有 RDF 这样一种方式,其实我们是直接伴随了 RDF,因为现在有参考了很多的论文之后,OW L其实是比 RDF 更先进的一种方式,那我们才开始采用的是这样一种方式。

然后对于大量的数据存储,那我们就必须要找一个持久化的工具,因为 OWL 它是一个文件格式的一种方式,Neo4j 我们做了,但是最后我们线上的系统并没有采用它,原因是什么呢?因为 Neo4j 首先它是个收费的,它那个节点的个数是有限定的。那我们现在采用的是 TDB 的方式,TDB 也是 Apache 基金会里面出来的 TDB,后来我们也会讲它。

另外我们有一些索引的数据,比如说我们有小的指令级的,就像我们刚刚说的上一页、下一页、翻页、换页这样的生成并不多,并且它匹配的准确率又非常高,就是它在一模一样的情况下,我才会让它去做,这个地方,可能就不需要做泛化,所以我就会把它放到 Trie 树里面去。然后有一些实体会放到 Elasticsearch 里面去查询,还有一些小的数据集也要索引,那我就会放到 Lucene 里面,然后之后的缓存数据,还是用的 Redis 这样的一个分布式的缓存处理。

2.1.2 数据采集

那么下面一层就是数据采集,那么我们要想达到这样的一些数据把它存储起来,所以我们要采集 8 万个数据。首先我们做菜厨,所以一些垂直网站,就比如说掌厨,下厨房,还有豆果网一些数据,另外我们人工编辑了很多的数据,比如说问句。因为这个问句人工也是不可能一步把它收集完了,但这个里面我们也有一个算法去做这种大量的问句,我们说了刚才的问句,同一个问题的问句是非常非常多的,那这个时候往往大致过程是这样的,首先把这个问句进行分析,首先找种子问句,种子问句拿到了之后,我们会对它进行分词,然后把每一个词到 word2vec 里面去训练,就是找它相关的词出来,相关的词把它们的位置序列记好,然后做笛卡尔积。这样的做完了,我就会生成大规模这样问句的数据,当然里面有一些是不正确的句子,那这个时候我们也会用我们文本纠错的马尔可夫链的方式,做它的概率模型去纠正它,那这样的话,我会生成大量的这样一些问句,然后人工也会筛选一些是这样的。其实我们也申请了一个专利,就是我们怎么进行问句生成的。然后动词的收集,就是跟领域相关的这些动词,我们觉得它是有穷尽的,就是它是能够拿的到,虽然我们的问句是无穷无尽的,那我们收集了200多个跟菜谱相关的动词,以及同义词的收集。比如说番茄炒蛋怎么做你能够出来,然后西红柿炒鸡蛋你就出不来了,这样是不对的,所以我们这个里面也做了大量的同义词的专门的训练。

之后还有一些开放的知识库,比如说同义词词林出来的,刚才漆教授给大家分析的这个 OpenKG,OpenKG 其实有很多的这种开放的数据源,而