研究人员提出了一种方法,通过识别用户在初次请求不成功时进行重述的情况,自动为某对话助手生成训练数据。
本月早些时候,在国际计算语言学大会上,我们的论文《利用对话系统中的用户重述行为自动为长尾话语收集标注》荣获行业赛道最佳论文奖。
在论文中,我们研究如何通过识别客户发出请求后,在最初响应不令人满意时重新表述的情况,自动为某对话助手的自然语言理解系统创建训练数据。
我们系统的初步实验表明,它在帮助对话助手学习处理大量、但各自出现频率低的“长尾”异常表达请求方面可能特别有用。
首先是一些术语。该对话助手的自然语言理解系统根据意图、槽位和槽值来表征大多数客户请求。例如,在请求“播放Weeknd的‘Blinding Lights’”中,意图是播放音乐,槽值“Blinding Lights”和“the Weeknd”分别填充了歌曲名称和艺术家名称槽位。
我们将使用相同槽位和槽值表达同一意图的不同表述称为重述:“我想听Weeknd的‘Blinding Lights’”和“播放Weeknd的歌曲‘Blinding Lights’”就是重述。请求的一般形式——“播放<歌曲名称> 由 <艺术家名称>”——被称为承载短语。
我们研究的情况是:客户发出一个请求,然后以导致交互成功完成的方式重述它(可能会打断最初的响应)。我们的目标是自动将成功请求中的意图和槽位标签映射到不成功的请求上,并将生成的标注示例用作对话助手自然语言理解系统的额外训练数据。
这种方法与对话助手自学习模型使用的方法类似,该模型每月已经纠正了数百万个错误。但自学习是在线工作且不更改底层自然语言理解模型;我们的方法离线工作并修改模型。因此,这两种方法是互补的。
我们的系统有三个不同的模块。前两个是机器学习模型,第三个是手工设计的算法:
通常,重述检测模型是在已标注的句子对数据集上进行训练的。但这些数据集不太适合与语音助手进行有目标的交互。因此,为了训练我们的重述检测器,我们合成了一个包含重述话语正负例的数据集。
为了生成每个正例,我们将相同的槽位和槽值注入到随机选择的、表达相同意图的两个承载短语中。
为了生成负例,我们获取给定请求相关的意图和槽位,并改变其中至少一个。例如,请求“播放Weeknd的‘Blinding Lights’”的意图和槽位是{播放音乐, 歌曲名称, 艺术家名称}。我们可能会将槽位艺术家名称改为房间名称,产生新的请求“在厨房播放‘Blinding Lights’”。然后我们将更改后的句子与原始句子配对。
为了最大化负例对的效用,我们希望使它们尽可能难以区分,因此变化是轻微的。我们还将自己限制在真实数据中出现的替换上。
作为摩擦检测模块的输入,我们使用四种类型的特征:
最初,我们还考虑了客户对对话助手处理请求的响应信息——例如,客户是否插话以停止歌曲播放。但我们发现这些信息没有提高性能,并且因为它使模型复杂化,我们将其删除了。
摩擦模型的输出是一个二进制分数,表示交互成功或不成功。只有那些在短时间内发生、其中第一个不成功而第二个成功的重述,才会传递到我们的第三个模块,即标签投射算法。
标签投射算法获取成功的重述,并将其每个词语映射到不成功的重述上或空集上。
目标是找到一个最小化重述之间距离的映射。为了测量该距离,我们使用Levenshtein编辑距离,该距离计算将一个词变为另一个词所需的插入、删除和替换的次数。
保证最小距离的方法是考虑每个可能映射的结果。但通过实验,我们发现,贪婪算法(即为第一个词选择最小距离映射,然后为第二个词选择,依此类推)在节省大量处理时间的同时,导致的性能下降非常小。
经过标签投射后,我们得到了一个新的训练示例,其中包括不成功的话语以及来自成功话语的槽位标注。但除非该示例被其他不成功和成功话语对佐证了最低次数,否则我们不会将其添加到新的训练数据集中。
我们使用三种不同的语言(德语、意大利语和印地语)测试了我们的方法,在德语中效果最好。在我们实验时,印地语自然语言理解模型仅部署了六个月,意大利语模型为一年,德语模型为三年。我们相信,随着印地语和意大利语模型变得更加成熟,它们生成的数据噪声会更少,也会从我们的方法中获益更多。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。