一、前言
本文对之前做过一段时间的Query改写(纠错,本文不严格区分这两种叫法)做一些总结,算法原理可以参考亚马逊的这篇论文:Feedback-Based Self-Learning in Large-Scale Conversational AI Agents。
二、方法
以前做Query纠错的一些通用思路是:基于大规模的线上日志训练一个相对置信的语言模型,基于相似度、编辑距离等方式挖掘一批高频词汇改写对,譬如说对于“伴奏兄弟”-->“半吨兄弟”这么一个改写对,原始ASR识别后的query有可能是:“播放伴奏兄弟的歌”,在经过中控的改写模块时,进行n-gram替换,按照语言模型的打分,发现:
Score(播放 伴奏 兄弟 的 歌)> Score(播放 半吨 兄弟 的 歌)
并且分数值满足一定的阈值设定,那么可以把改写的query和原始query一起送入下游意图识别模块,看召回情况,再打分。
这种改写方式,有理有据,但相应的短板也非常明显:
-
高精度,但召回相对欠佳
-
改写词汇对维护成本高
-
意图打分模块,策略较重
另外还有一些seq2seq系列的方法,也做过相应的实验,这类改写方法过于不可控,当做玩具试试是可以的,包括也有Paper结合Bert来做的。
那么,有没有方法可以弥补上述经典纠错方法的短板呢?
亚马逊的这篇Paper,提供了一种新的思路,笔者之前也已复现并小幅改进了该篇论文,效果属实惊艳。Paper干的事情,其实就是提出了一种挖掘Query改写对的方法,基于用户和chatbot的历史交互数据,挖掘改写对,并把改写对提供给线上改写模块,进行整句替换,像Alexa、小爱、天猫精灵等,都有着对应的应用场景。
那么,Paper是怎么干的?流程如下:
-
用户query->dis映射
-
Session数据构造
-
Markov离