三、知性会话关键技术
(一)知识图谱构建
1. 知识图谱的构建方法
这里我引用复旦肖老师总结的知识图谱构建方法,第一步是做模式设计,我们要定义有哪些类或概念、哪些属性或关系。
第二步确定我们的知识从哪来,所谓的数据来源,这里可以通过对一些结构化的数据、非结构化的数据做转换、对非结构化的数据,即文本,从里面去信息抽取。
第三步,知识图谱里最重要的是词汇的挖掘,各种同义词、缩略词、短语等等。
第四步,有词汇不够,我们要把同义词聚集为一个概念,也就是所谓的实体发现,包括实体实现、实体归类、实体链接等等。
第五步,除了实体之外,知识图谱里还有边,也就是关系,我们要做关系的抽取。
第六步,因为我们的知识图谱可能来源于不同的数据源,所以我们要做知识的融合,主要是实体对齐、属性融合、值的规范化。
最后,对知识图谱的质量做检查控制,包括知识的补全,有错的话要纠错,还有知识更新,最后形成一个领域的知识图谱。
2. 知识图谱的评估方法
如果你不知道怎么评价知识图谱的话,就根本不知道你的知识图谱建得好还是坏、有用还是没用。评估的方法基本可以分为四大类别:最重要的类别是第二类基于应用,把知识图谱在应用里看效果怎样,通过应用效果来间接评估知识本体。我们不要先找几十个人花一两年建知识图谱然后再去找应用,而是知识图谱必须是应用驱动的,根据应用效果来评价知识图谱,这是推荐的一个方法。
还有基于黄金标准评估,也就是说如果我们有些好的知识图谱,或者我们可以建一个小的知识图谱,根据这个标准知识图谱去评估我们建的知识图谱的情况。我们可以看看计算概念和关系的覆盖率,即有多少出现在标准知识图谱中的概念和关系被包含了,这可以评价我们的建的知识图谱是否完整。
另外,简单的评估方式基于指标。可以定一些统计指标,比如这个知识图谱里有多少概念、多少关系、关系属性,然后我们还可以对它进行抽查,看它的准确率、一致性等指标。
3. 敏捷构建
我们现在做应用很多情况都是做敏捷开发,也就是说可能半个月或者一个月就会发一次版本,这时候我们知识图谱也要跟着应用快速迭代,这时候是需要对知识图谱敏捷构建的过程。这里强调我们要对知识图谱做自动化的测试,测试完之后要判断它是否能够发版,发版之后要继续分析它目前的问题。可以把知识图谱看成一个软件,它是不是有哪些 bug 或者需要哪些新功能,根据这些制定下一个版本的发版计划。核心想法就是把知识图谱也看成是一个软件,也要有版本管理,也要有敏捷的开发。
(二)实体发现与链接
需要解决的问题:如果我们这时候已经有知识图谱了,现在还依赖于实体发现与链接技术。这个技术解决刚才那个问题,「Thinks,not Strings」,它最重要的问题是把字符串和知识图谱的实体关联起来。它要解决两个问题,一个是我们同一个意义可能有表达不同的形式,像「科比」、「黑曼巴」、「科神」很多是指的科比这个人。还有一个是自然语言或者字符串本身有歧义性,就像「苹果」可能是指苹果电脑、苹果手机,也可能是一个水果。
解决方法:所以它的做法是分两步,实体发现和实体链接,实体发现是发现文本中的 mention,就是字符串,像「这个苹果很贵」的「苹果」是 mention。实体链接是把这个 Mention 和知识图谱里的实体关联起来,知识图谱里的实体关于「苹果」可能有多个实体,有苹果公司,还有苹果这个品牌,还可能是苹果手机、苹果电脑,还有水果叫苹果等等,这里的「苹果」到底指哪个呢?可能要靠上下文的判断。
1. 基于实体的多源数据融合
我这里举个很简单的知识图谱,谢霆锋的女友是王菲,王菲唱了《传奇》这首歌,《传奇》这首歌的原唱是李健。
我们在对话这块的数据来源有几个:一个是聊天库,像「你喜欢歌手谢霆锋吗」「喜欢,他很酷。」,还有 FAQ 库,我们可能从百度知道或者很多地方可以找到社区问答的数据,就像这里说「谁能说说李健的音乐风格?」「李健的风格,有民谣的简洁,但比民谣华丽得多。」
我们也会从网上找到很多文档,包括百科的文档或者网页性的文档,我们对这些文档、聊天库、FAQ 库、文档库,我们都要去做实体链接,把这里面出现的歌手和我们知识图谱的歌手关联起来。
2. 如何进行实体发现与链接?
第一步预处理,首先建立一个 mention 到 entity(实体)的关系,这也是目前这个算法的局限性,我们事先要知道一个 mention 可能对应到哪些实体。然后抽取实体相关特征:
一是实体的先验概率。就像苹果可能是水果的先验概率为 40%,是苹果手机的先验概率为 60%,如果我们说葡萄呢?可能葡萄是水果的先验概率有 90%,10% 是其他东西。二是实体上下文的词分布,我们看这些实体周边到底是什么词,或者它篇章的主题词,就像苹果手机出现在文章里都是科技类的主题词。三是实体之间的语义关联度,因为知识图谱是一个图的结构,所以每个实体环绕它周边都有些其他的实体,这些实体都是相关的特征。
第二步,这时实体链接就变成一个排序问题,找到 mention 之后,我们可以根据前面 mention 关系表找到它的候选实体,现在保持只需要对候选实体排序,返回一个最可能的实体。
第三步,对候选实体进行排序,可以用最基本的方法。这个有两大类:一个是实体本身的信息,还有一个是可以利用实体和实体之间的协同关系做排序。如果是苹果旁边的实体都是偏电脑类的,那这个苹果可能就指苹果电脑。
(三)融合知识的话语理解
做完实体链接处理以后可以做真正的对话系统这一块,对话系统里最基本的是对用户话语的理解,我们怎么去理解用户说的一句话。
第一步要做实体的发现与链接,像刚才那个例子,「你喜欢谢霆锋吗」,我们要把谢霆锋跟知识图谱的实体关联起来。
第二步做指代发现,比如「你知道他女朋友是谁」,那这个「他」到底是指谁,我们首先要发现他是一个指代词,然后再根据上下文去判断「他」在这个例子里面是谢霆锋这个实体。
另外,我们做语义理解还有一种情况是结合知识做消歧义。比如用户说「周巧文的生日」,因为《生日》是一首歌的名字,周巧文是这个歌的歌手,这时候我们理解它是个音乐,因为本来就在音箱下面,这时我们可以直接播放周巧文的《生日》这首歌。但是如果系统又问一下「刘德华的生日」,这时候虽然我们的命名实体识别很有可能把「生日」也可能打成歌名的标签,刘德华打成歌手的标签,歌手的歌名,很容易以为是播放音乐,但是我们通过知识的验证知道刘德华并没有唱过这首歌,这时候要转成问答,这不是一个操控性的指令。直接返回他的生日,说「刘德华的生日是 1961 年 9 月 27 日」。
这几个例子是我们通过知识帮助去理解用户的指令。我下面再讲一下怎么把知识和聊天结合起来。
(四)融合知识的聊天
1. 上下文
现在学术界都用深度学习模型,所以我会简单讲一下深度学习的方法,把它的基本思想讲一下。我们现在一般在学界把聊天变成一个 Sequence-to-Sequence 的模型,就是有一个 encoder对输入进行编码为向量, 通过 decoder 把应答生成出来。这时核心问题变成怎么把上下文加进去,最基本的方法是把上下文的文本跟当前文本的向量合在一起作为 encoder 的输入;另外我们可以把上下文作为向量,在 decoder 阶段输入;或者用主题模型对这个 session 去建模,把这个 session 主题模型也作为 decoder 的输入,这样就可以实现一并上下文的效果。
2. 一致性
聊天还有一个很重要的问题是一致性。我们刚才说语境里面有一个agent画像,跟我聊天的对象虽然是机器人,但是它有统一的人格,它的性别、年龄、籍贯、爱好应该是一致的,这是目前聊天机器人里面最难的一点。你对机器人问它「多大了?」它可能说「18 岁」,如果你再去问一下「你今年高寿」,它很有可能回答「我今年 88 岁」,或者问你「芳龄几许」,它很有可能回答「小女子今年芳龄二八等等」。
为什么会出现这种情况?因为目前聊天的机器人都是靠从各个来源去收集各种语料堆在一起的,对这种语料并没有做归一化处理,因为有的语料说「我今年 88 岁」,有的语料里面可能说「我今年 18 岁」等等,这时候换个方式问它可能会出现问答不一致的地方。更复杂的例子,你问它「你出生地在哪里?」它说「我在北京」,然后问它「你是中国人吗?」它可能就回答不了,虽然人类常识知道北京属于中国等等。
在深度学习里如果想把这些所谓的机器人的信息,进行建模或向量化处理导入到 decoder 模型里去,这时候它会优先从身份信息的词向量去生成应答,这样也能达到一定一致性的效果。
3. 融合知识
另外,做问答的时候,像我们这个例子问「姚明有多高」,我们生成比较自然的问答,说「他是两米二六,他是唯一一个可以从太空看到的人类。」当然,这是开玩笑的。这种聊天就融合了知识,它知道姚明的身高。这时候通过深度学习模型做 decode 时,除了生成常规的应答之外,有部分的应答还要从知识库里去检索,然后再把这个应答跟文本的应答拼在一起。
更多的类似工作可以看看获得今年IJCAI杰出论文奖的黄民烈老师的工作。
(四)基于知识的问答
知识问答主要有两种方法:一种是基于 Semantic Parsing 的传统方法,它是把一个问题解析成一个形式化的查询语言,再把查询语言知识库里面做查询。这个方法的最大难点是把自然语言的问题转成这样一个形式化的查询语言。同样也有很多方法,最简单的基于规则、基于模板,复杂点的基于翻译模型、基于深度学习模型等。
目前学术界比较多的是基于机器学习的知识库的问答方法,这里面它的基本思想是把问题建模成一个 embedding,然后对知识图谱也做 embedding,变成一个个向量,这个问答就转换成了一个相似度匹配的问题,把知识库里的子图的向量跟问题对应子图进行相似度匹配。
还有很多其他方法,目前比较多的是基于网络的方法,基于带注意力机制的循环神经网络的方法。这块我给一个参考,大家可以看一下《揭开知识库问答 KB-QA 的面纱》这篇文章,讲得非常详尽、非常好。我个人的观点是现在基于深度学习的知识库问答目前在工业界这块不是很成熟,它的效果不太可控,我们在系统里还是用基于传统的 Semantic Parsing 问答。
在 CQA 上也有很多把知识结合进去的方法。CQA 最核心的问题是我们要算用户的问题和在我们问答库里问题的语义相似度,这里的核心问题是怎么能把知识放到对句子的向量表示里。最近的 SIGIR2018 中提到,把知识和注意力的神经网络结合在一起的方法。现在这种论文基本都是一个网络图。另外一篇文章也是类似的,总体是在文本做排序时把知识向量化。
(五)基于知识的主动会话
这个实际上是非常关键的。在我们人机对话系统,特别是在 VUI 交互下, VUI 音箱是没有界面的,这就意味着你无法知道这个音箱到底支持哪些功能。当你面对音箱的时候,你怎么知道它的功能,到底哪些话能说,哪些话不能说,或者它有什么东西?这时候很需要机器人主动的对话,能引导用户用它,知道它的功能。
再举个例子,如果一个用户说「来首《传奇》」,机器可以主动问他说「播放以后还想听听李健原唱吗?」其实它的思想很简单,就是根据我们的知识图谱里面,看看相同实体下面有没有其他关系或者属性,或者推荐一个相同关系下面其他的实体。
这里一篇百度的文章思想也是类似的,如果觉得聊天聊不下去了,会先在上下文里去做实体分析和实体链接,找到作为聊天主题的实体之后再根据知识图谱找相关的实体,根据相关的实体产生话题。