前言
意图识别是通过分类的办法将句子或者我们常说的query分到相应的意图种类。举一个简单的例子,我想听周杰伦的歌,这个query的意图便是属于音乐意图,我想听郭德纲的相声便是属于电台意图。做好了意图识别以后对于很多nlp的应用都有很重要的提升,比如在搜索引擎领域使用意图识别来获取与用户输入的query最相关的信息。举个例子,用户在查询"生化危机"时,我们知道"生化危机"既有游戏还有电影,歌曲等等,如果我们通过意图识别发现该用户是想玩"生化危机"的游戏时,那我们直接将游戏的查询结果返回给用户,就会节省用户的搜索点击次数,缩短搜索时间,大幅提高用户的体验。再进一步说,做好意图识别以后,我们可以将一个用户的query 限定到一个垂直领域比如通过意图识别以后发现该用户输入的生化危机就是想找"生化危机"的游戏进行下载,那么我们在游戏这个领域下进行搜索可以得到更高质量的搜索结果,进一步提高搜索体验。
机器人 我们再举一个目前最火热的聊天机器人来说明一下意图识别的重要性。目前各式各样的聊天机器人,智能客服,智能音箱所能处理的问题种类都是有限制的。比如某聊天机器人目前只有30个技能,那么用户向聊天机器人发出一个指令,聊天机器人首先得根据意图识别将用户的query分到某一个或者某几个技能上去,然后再进行后续的处理。如果一开始的用户意图识别识别错了,那么后续的工作直接就是无用功了,会给用户带来非常不好的用户体验。
说了这么多,其实只是想说明意图识别是一件非常重要的工作。我们再来看看目前工业界的水平,就业界来看,目前一些公司的在特定领域的意图识别准确率已经可以达到96%甚至更高了,在可以预见的未来意图识别的准确率只会更高,覆盖范围只会更广, 在通用领域达到99%,甚至99.9%也只是时间早晚的问题。而这个时间也许在两到三年来就可以到来。
做好了意图识别以后,那种类似于电影场景里面人机交互就有了实现的可能,用户向机器发来的每一个query,机器都能准确的理解用户的意图,然后准确的给予回复。人与机器连续,多轮自然的对话就可以借此实现了。想起来真的是非常的激动。
意图识别的前提
在做这个工作之前,我们首先得想好意图的划分问题,这种划分业界有很多叫法,比如技能。我们的聊天机器人有30个技能,潜在意思便是我们的意图有30类。在2018年的CES上面,Google Assistant 号称有100万个技能,这个真的只能说太厉害了。还有一种很通用的叫法叫领域 或者doamin,搜索引擎中的垂域搜索的意思是把用户的query分为很多特定的领域比如电台领域,音乐领域。搜索的时候根据意图识别认为这个query属于电台领域,于是便在电台领域进行搜索。如果意图识别的准确率比较高的话,这样便可以大大加快搜索的速度和准确性。
很多Google Assistant的技能也许只是简单的堆叠,但是对于聊天机器人来说,我们业界一直有个观点,意图识别虽然是聊天机器人非常重要的一个部分,但是解析用户的语义已经慢慢不再成为对话机器人的核心,识别用户的意图以后提供的服务开始成为对话机器人的产品差异化的核心。Goole Home 的100万个技能,绝对是这个领域杀手级别的竞争力。
其次是应该想好意图识别的可扩展能力,尤其是在搜索领域,对话系统领域,随着意图覆盖的范围急剧增加,如何保证意图的识别的准确率不下降甚至还能有提升其实是个很困难的事情,但是也非常的重要,甚至也许是意图识别最重要的一件事。不然你覆盖的技能数上去了,但是意图识别的准确率下来了,其实很多时候是没有什么意义的。
意图识别可扩展能力的另外一方面体现在简单技能的自动化生成,复杂技能的半自动化生成或者第三方开发者的开发技能的快速接入。在可以预见的未来,对话机器人的技能增加速度会非常的快。类似于Google Assistant 的100万个技能,单凭人力或者某一家公司去开发100万个技能,得开发到猴年马月去了。自动化生成对话系统的技能,并且保持足够的开放性是每一家有追求的聊天机器人厂商应该严肃思考的问题。从业界来看,很多国内聊天机器人的公司这一块可能才刚刚起步,嘴上说着要开放,内心其实比较抗拒,工作排期排的很后。至于技能自动化生成也许还没有思考到这一步来。
最后一个方面是技能的评价问题,当一个开发者开发完一个技能或者模型自动化生成一个技能以后如何评价一个技能生成的好坏也是非常重要的。简单一点来说虽然我们生成了一个技能,但是也不能生成一个技能就接入到我们的搜素引擎当中或者对话系统中来,必需得符合一定的标准。比如我们在搜索引擎当中开发了音乐 domain的垂域搜索.当我们的意图识别准确的判别用户的query"我想听周杰伦的歌"属于音乐这个domain,并将query分过来到音乐领域进行垂域搜索。如果音乐的垂域搜索做的很差给用户返回的都是陈奕迅的歌。用户体验也不会很好。就我看来,技能评价应该至少包括两个方面评价。第一个方面是效果上面的,如果我们用precision和recall来评价的话,每一个接入的domain或者技能 的F1值必需大于某个值才可以接入。第二个方面是工程上面的,每个接入的技能都必须考虑到访问量大了以后不能宕机。这个对本公司开发的技能不会有大的问题,但是第三方开发的技能,很多时候只考虑了功能的实现和效果上面的问题,往往不会考虑访问量或者qps大了以后怎么处理,结果就会造成整体服务超时。所以这一点也是需要慎重考虑的。
意图识别的基本方法
1.基于词典以及模版的规则方法
不同的意图会有的不同的领域词典,比如书名,歌曲名,商品名等等。当一个用户的意图来了以后我们根据意图和词典的匹配程度或者重合程度来进行判断,最简单一个规则是哪个domain的词典重合程度高,就将该query判别给这个领域。这个工作的重点便是领域词典便须得做的足够好。
2.基于查询点击日志
如果是搜索引擎等类型业务场景,那么我们可以通过点击日志得到用户的意图。
3.基于分类模型来对用户的意图进行判别
使用分类方法是我们本次博客的重点,我们将会使用paddle作为模型的基本框架以CNN外接softmax 和LSTM外接softmax来进行意图识别方面工作的探索。本系列也初步定为三篇博客,本篇会作为开端篇做一些意图识别方面的介绍。第二篇是会使用LSTM+softmax来进行文本分类。第三篇会使用CNN 外接softmax来进行文本分类。
意图识别的难点
当前意图识别工作的难点有很多,在之前的介绍中也提到了一些,但是最大的难点其实是在于标注数据的获取。目前标注数据的获取主要来自两方面,一方面是专门的数据标注团队对数据进行标注,一方面是通过半监督的方式自动生成标注数据,我后续会在调研以后,来专门进行这方面的介绍。本次会利用已有的标注数据来进行介绍。
总结
本次介绍了意图识别是什么,意图识别的重要性,意图识别的难点以及后续的博客计划,本质上来说意图识别是属于文本分类的一种,和情感分析这类工作没有什么很大的区别。但是相比于情感分析,意图识别的分类种类要比之前多了很多,准确性以及可扩展性的要求也高了不少。敬请期待后续博客的更新。