问答问题解析的七种方法及优化思路
这里说的七种方法都是看了文献后总结出来的,并不都是成熟、稳定、商业化的,目的只是提出思路供参考。
基于规则的方法通常在缺乏训练数据的情况下使用。因为它与下面的基于统计的方法有很大不同,所以被记录为零方法。
基于规则的解析系统通常由两部分组成:一是“规则库”,解析规则通常是CFG上下文无关文法;另一个是同义词数据库,记录了标准词中一些常见的同义词。
整个句法分析是一个上下文无关的语法归约过程。首先进行自动分词,然后根据同义词库将用户问题中的词归约为标准词,再将归约后的问题与规则库中的分析规则进行比较。一旦比对成功,用户问题就成功还原为分析规则对应的标准问题。
比如叙词表中有两条记录:“失败:不访问、不录入、不成功、错误”和“登录:登录、登录”,规则库中有一条规则:“账户登录失败:[账户][登录][失败]”。
有一个用户提问说“为什么我不能登录我的帐户?”。首先假设分词正确,分词的结果是“我怎么|账号|登录|上不去|”;之后进行减词,减词的结果是“我的账号怎么登录失败了?”;然后对比规则“账号登录失败:[账号][登录][失败]”,发现对比成功。这个用户问题成功简化为一个标准问题“账号登录失败”,我们将系统中“账号登录失败”对应的标准答案提供给用户完成交互过程。
这样可以在一定程度上解决问题,但是缺点也特别严重。首先,“规则库”和“同义词库”需要人工构建,需要巨大而长期的人力资源投入。因为语言的表达理论上是无限的,能想到的规则和同义词总是有限的;而且随着语言的发展或者业务的变化,整个规则库和同义词库的维护也需要持续的人力资源投入。
其次,编写规则库需要丰富的经验,对人员素质要求极高。由于解析规则相当抽象,在如此高的抽象程度下,即使编写人员有丰富的经验(如果没有经验就更糟了),不同解析规则之间的冲突也是不可避免的,即同一个用户问题会被多个标准问题的解析规则成功比对。在这种情况下,标准题选择/评分的问题需要另一个系统来解决。
换句话说,我们可以把根据用户问题找到标准问题的过程看作是一个输入查询获取文档的搜索过程。
我们可以尝试使用传统搜索引擎中使用的检索模型来分析用户问题。《论搜索引擎的基础(一)》中提到BM25是目前最好的检索模型,我们就以BM25模型为例进行分析。
BM25模型的计算公式如下:
BM25模型的计算公式综合了IDF因子、文档词频、文档长度因子、查询词频四个因子,用三个可自由调整的因子(k1、k2、B)来调整组合各因子的权重。
其中n代表文档总数,n代表有对应词的文档数,f代表文档中对应词的词频,qf代表查询语句中对应词的词频,dl代表文档长度。
BM25型号有三种使用方法。以标准问题、标准问题和标准答案、历史上与标准问题正确匹配的用户问题集为文档,通过公式计算其与用户问题的相似度,然后按相似度排序,取出得分最高的标准问题作为分析结果。
这个想法我没有实验过,但是我猜测这种方法虽然节省了很多人力,但是在这个封闭领域QA系统中的表现应该不如之前基于规则的方法,而基于检索模型的方法在开放领域中表现会更好。
另外,基于传统检索模型的方法会有一个固有的缺陷,即检索模型只能处理查询和文档的重叠词,而传统检索模型不能处理词的语义相关性。前一种方法通过人工词库在一定程度上解决了语义相关问题。
如上所述,完全基于检索模型的方法不能处理词的语义相关性。
为了在一定程度上解决这个问题,我们可以使用LDA/SMT等方法,通过语料库挖掘词与词之间的同义关系,为每个词自动构建同义词度高于阈值、大小合适的同义词表。在代入检索模型公式进行计算的过程中,如果在文档中发现被搜索关键词的同义词,可以根据同义词的程度乘以一定的权重,然后计入关键词的词频计算中。
《谈智能搜索与对话式OS》中有对LDA/SMT的介绍。
简单来说,LDA可以合理地将单词分类到不同的隐含主题中;并且通过计算两篇文章的话题向量θ的KL散度(相对熵),可以得到两篇文章的相似度。SMT模型来自微软,其目的是将翻译模型引入到传统的检索模型中,以提高检索模型处理语义相关词对的能力。百度也采用这种模式来提高搜索引擎返回结果的质量。
单词嵌入将单词表示为分布式表示,即低维向量空间中的单词向量。分布式表示下的词可以利用余弦距离计算词之间的语义相关度。对应于一热表示,一热表示下的词向量的维数与词表的维数相同,不同词的词向量是正交的。传统的词集模型(SOW)和词袋模型(BOW)采用一热表示法。
我们可以用深度学习的方法得到单词分布表示的单词向量。比如训练一个普通的神经概率语言模型,可以得到该词的词向量,或者参考word2vec中的方式训练CBOW或者Skip-gram模型。神经概率语言模型的引入,CBOW和Skip-gram都是在谈论智能搜索和对话式OS时提到的。
借助百度,用DNN建模的思路如下:
我们需要使用一组用户问题-标准问题对的正反例作为训练语料。借助上述方法,正反例均进行单词嵌入并发送给DNN,正反例之间的语义差异采用成对排序损失建模。
基于DNN的最后一种方法可以在一定程度上解决词的语义关联问题,但它没有恰当地处理句子中的短距离依赖,如无法区分“A到B”和“B到A”。
根据百度的评测结果,CNN在应对短距离依赖方面有更好的表现。
图片来自李航博士的《用于匹配自然语言句子的对流神经网络架构》中的ARC-1:
这种方法的基本思想是将问题中的每一个单词都嵌入,得到一个与每个单词对应的定长单词向量。我们把问题表示成一个二维矩阵,每一行表示问题中对应词对应的词向量。对这个二维矩阵进行多次卷积(卷积核的宽度与词向量的维数相同,高度多为2-5),最终得到一个一维的特征向量。我们用CNN同时处理用户问题和标准问题,得到库中用户问题和标准问题对应的特征向量。之后,这两个向量被拼接并发送到一个多层感知器,感知器计算两个问题的匹配度。
此外,有人指出,如果将两个特征向量直接拼接并发送到MLP,会丢失边界信息,因此我们将特征向量A、特征向量B和aTb同时发送到MLP,以计算相似度。
ARC-2结构也来源于李航博士的上述论文:
ARC-2相对于ARC-1的改进之处在于,ARC-2在获得类似ARC-1的结果的高层抽象表示之前,试图让两个句子相互作用,而不是通过CNN结构获得各自的高层抽象表示。
在ARC-1模型中,一个特征图只是一个列向量,或者一维矩阵,几个列向量组合起来形成ARC-1示意图中的图案(二维),而在ARC-2中,一个特征图变成一个二维矩阵,几个二维矩阵叠加起来形成ARC-2示意图中的图案(三维)。
之后的卷积和池化过程类似于CV中的CNN。与前面的方法类似,1D卷积涉及两个字向量的连接,也可以采用前面提到的方法来避免边界信息的丢失。
也有人提出,在ARC-2结构中,直接使用传统的单词嵌入方法得到的单词向量组成句子作为输入,并不是最佳方案,最佳方案是使用已经过LSTM的隐藏状态。
我们可以用LSTM结构训练一个RNN语言模型,如下图(以普通RNN为例):
从图中可以发现,当输出为“E”时,隐层向量中的第三分量最大,而当输出为“L”时,第一分量最大,当输出为“O”时,第二分量最大。我们可以用RNN的隐藏状态作为分布式表示的词向量,作为CNN(ARC-2)的输入,经过测试可以得到更好的结果。
可信度高的分词结果是后续句法分析步骤的基本前提。
在《自然语言处理基础(下)》中,我介绍了一些经典的分词方法,但都是比较早的研究成果。CRF方法是目前公认的最有效的分词算法。
CRF方法的思路很直接,就是把分词问题看成一个序列标注问题,对句子中的每个词标注词的位置:
CRF分词的过程是标注单词位置,然后在B和E、S单词之间形成分词。互联网上有很多公开的基于CRF的分词工具。
至少有四个角度可以在现有模型的基础上进一步提高解析质量,包括:问题规范化、用户状态、强化学习和多轮对话。
问题规范化的目的是为了对用户输入具有更好的容错能力。
简单的,比如:简繁体规范化,全角半角规范化,标点处理,大小写规范化。更复杂的东西,比如中文错别字的纠正。自动改错技术应用广泛,对于提升系统的用户体验能起到很大的作用,可以说性价比很高。
错别字纠正的常见做法是训练噪声信道模型。
我们可以从用户状态中提取特征,并在训练和分析期间将它们作为附加信息作为神经网络的输入。
可以考虑的用户状态至少包括:
其次,可以采用强化学习,设计合理的奖励机制,让分析系统在与环境交互的过程中自主更新策略。
与普通的监督学习方法相比,强化学习有两个明显的优势:一是更新强化学习策略所需的数据主要来自与环境的交互/采样,而不是昂贵的人工标记数据;另一种是强化学习产生的策略按照奖励机制独立迭代更新,会有一些创新的做法,而不仅仅是模仿人类提供的“标准”做法。
虽然QA问题解析不像游戏那样有“策略\创新玩法”的概念,但在解析优化上还是可以帮助节省大量的人工阅卷费用。
强化学习方法应用的核心问题之一是奖励机制的设计。在QA场景的奖励机制设计中,至少可以考虑以下几个角度:
多轮对话技术可以进一步提高与用户对话的连贯性。
我倾向于把多轮对话分为封闭域和开放域两种场景,不同场景的实现思路应该是不一样的。
封闭领域场景下多轮对话的特点是:系统能解决的问题是有限集合,多轮对话的目的是引导用户到我们能解决的问题。
开放领域场景下多轮对话的特点是系统需要解决的问题是一个无限集合,多轮对话的目的是根据上下文更准确地理解用户的需求。
在这种指导思想下,封闭域多轮对话的核心思想应该是“填槽”,而开放域多轮对话的核心思想是“语境替换”和“主体补全”。
《谈智能搜索与对话式OS》介绍,百度利用槽位填充技术做NLU,利用“上下文替换”和“主题补全”提升其DuerOS对话能力。
再者,槽位填充、上下文替换、主题补全的技术基础是“序列标注”。下面是百度的两个PPT:
根据百度的PPT,使用双向LSTM+CRF进行序列标记是商业上可行的方法。
选择合适的人工访问时机也是提高QA系统整体性能的方法之一,其核心问题在于平衡用户体验和投入成本。手动接入越早,用户体验越好,但成本越高。
下面是一个简单的提供蚂蚁金服服务的方法:如果系统连续三次向用户提供相同的答案,则显示手动进入按钮;如果用户连续两次问客服问题(如“我要人工”“你客服电话是多少”),会显示手动进入按钮。
问答系统的另一个重要部分是答案库。
答案录入的优化至少可以从三个角度考虑:
回答形式的多样性非常好理解。例如,马骁答题支持包括文本、链接、图片和视频在内的多种答题形式。
上述分析和优化中已经涉及到个性化(考虑用户状态的分析和优化),上述分析思路也可以应用到答案录入中。我们可以为不同注册时间、不同支付金额、不同访问路径等用户提供不同的个性化回答。
答案对用户的帮助看似抽象,但也很容易理解。总的来说,我个人对QA系统的答案按“地图级”、“导航级”、“专车级”进行评分:
按照人机对话系统原有的场景分类,提供“汽车级”答案的QA系统可以称为VPA。
对于答案库的优化,在答案录入完整的前提下(答案形式足够丰富,可以为不同用户提供个性化的答案),至少有两个优化点:
解析优化中强化学习方法奖励机制的设计思路也可以用来发现答案库中的问题,因为很多时候很难清晰区分用户的负面反馈是针对解析系统还是答案本身。
除了从用户的负面反馈中发现问题,对于以上两个优化点,我们还应该有一些预防机制来提前避免这些问题。
比如第一点“答案库中的标准答案有错误”,如果不是输入人员的素质问题,最大的可能来自于答案的时效性,也就是我们已经给用户提供了过期的答案。为了解决这个问题,我们可以在输入答案的时候加上一个“临时”的标签,表示这个答案时效性很强,需要及时更新。
至于第二点“部分问题的答案在答案库中缺失”,最大的可能性来自于突发事件和业务变化。比如系统服务宕机,安装了新版本的系统或者组织了一些运营活动,对于这些可能引起用户疑惑的变化,我们要提前准备一些FAQ,录入到答案库中。
另外,我们在输入新题型及其标准答案时,需要注意新输入题型与原分析系统的适应性,避免出现新输入题型难以被分析系统分析的情况。可以采用的方法有,比如在输入新问题的同时,主动输入一些不同的问题作为初始训练语料(网易奇鱼云客服的做法)。