查看原文
其他

语义意图在语音机器人中的应用

周维 58技术 2022-03-15



背景
语音机器人是58同城TEG架构平台线AI Lab自主研发的具有自动电话拨打、多轮语音交互、智能意向判断等多种功能的通用智能对话机器人。语义意图是一个比较广泛的概念,在语音机器人中有两层含义,一是在与用户交互过程中对用户说话的理解,帮助系统完成通话,二是在整轮通话结束后,对用户打上的意向标签,作为后期分析使用,本文主要介绍前者的内容。
 
为了让语音机器人在复杂且多样的话术上与用户流畅的交互,我们设计了对话管理系统,其实现细节已在文章《语音机器人中对话管理系统设计与实现》中介绍。语义意图作为对话管理系统的输入,是根据用户说话内容定义的标签,这些标签结合对应的策略实现话术流转。
 
语义意图的识别通过自然语言理解模块(NLU)实现,在电话外呼场景下也称为口语语言理解(SLU),主要包含单句意图识别、语义相似度匹配、槽位识别三个部分,本文将详细介绍各模块所解决的问题与难点,以及对应的实现方法。


单句意图

电话外呼的任务是主要向用户发起通话,并按照话术上的逻辑引导用户完成对话。话术中的问题通常是意向确认类型,如:“你们公司近期有招人的计划吗?”,我们期望的答案应为肯定或否定,为了更好的满足业务需求,我们将主线话术定义为只有两个分支的有向图结构。

 
但实际情况比较复杂,用户有时不会正面回答,比如,“招满了”表示否定,“怎么了?”默认表示肯定等等。更为麻烦的是,不同的话术,甚至不同的节点对肯定和否定都有着不同的定义,这给意图识别带来的很大的挑战。
 
为了适应多种复杂的话术类型,同时能够方便业务方配置话术,我们定义了19类意图标签,如下图所示:



单句意图标签可以分为三类:主线意图、通用意图和拒识意图。其中主线意图均可以代表着用户的意向,如:肯定、否定、提供信息、提问等。
 
业务方根据话术想要达到的目的,配置话术语料,系统会根据语料自动识别每个分支表达了什么意图,如下图所示,当用户触发了affirm、request,会跳转到肯定否定对应的节点,而当用户触发negate、offer意图,会跳转到否定分支对应的节点。这样话术每个节点的肯定和否定具备了定制化的能力,同时由于意图标签是通用的,也让话术具备了一定的泛化能力。


电话外呼场景对通话流畅性的要求很高,需要有效处理用户的口头语和临时提出的一些问题。通用意图则定义了电话交互过程中经常出现的几种意图,如:greeting表示“您好”,hangup表示“别再给我打电话了”等。当用户提及这些意图时,会触发对话管理系统中对应的通用意图策略,配合拉回策略保证了对话的连贯性。
 
拒识意图则表示对话中常见但暂时不需要处理的意图,系统会通过引导语将用户拉回到主线话术上来。
 
单句意图的实现使用了下图所示的TextCNN文本分类模型,同时实验过BiLSTM、FastText、BERT等方法,效果不如TextCNN,主要是由于口语场景下的文本存在着字数少、不通顺、多意图等特点,TextCNN对于局部依存关系较敏感,在当前场景下存在优势。



语音场景下的单句意图效果

用于意图识别的文本来源于语音识别(ASR)模块,目前无法保证ASR的结果是完全准确率的。由于电话另一端的背景无法控制,加上用户的口音不同,ASR的难度要比通常情况下高很多,我们定义了一些声音类型来表示识别的质量,如:听不清、语音识别错误、噪音、机器音等。

 
根据声音类型,我们从单句意图错误的例子中统计了各类型的分布如下图所示,可见听不清(deafness)和语音识别错误(wrong)是影响意图识别效果的主要因素,其中听不清表示一种非人声,与噪音不同,听不清不是持续的,所以很容易被ASR判断为人声。目前单句意图识别准确率为75%,在排除语音错误和听不清后,准确率为97%。



由于直接从语音当中提取语义意图难度较大,我们使用了声音类型识别为单句意图提供参考,声音类型包含人声、听不清、噪音、空白音、机器音等,模型选择了VGGish+BiLSTM,并以声学特征FBank作为输入,模型结构如下图所示。



得到比例最高的听不清的识别准确率为86%,在很大程度上解决了语音质量不佳导致的单句意图错误。


语义相似度匹配

单句意图主要解决了主业务需求需要的意图,在系统与用户通话的过程中,用户可能会说出各种各样的问题,这些问题可能不是业务相关的,但如果直接忽略掉用户的提问会让流畅度大打折扣,影响用户的通话体验,因此引入了标准问题和关键词问答的概念。

 
标准问题通常是与业务无关的问题,如:“你是谁”等,对于这类的问题,直接回复对应的答案,并配合拉回策略将状态拉回到上一句话。
 
关键词问答通常与业务相关,可以理解为主线的分支任务,如:“多少钱”等问题,系统在对用户提问做出回复后,会根据话术定义,将状态拉回到主线的指定节点。
 
标准问题与关键词问答都是用户说话触发了某个问题对应的语料,且不同话术的标准问题、关键词问答的定义不同,因此,均采用了基于DSSM的相似度匹配的方式。
 
DSSM使用语义模型将文本转化为语义向量,并计算向量之间的相似度作为两个句子的相似度,一般使用余弦相似度。其过程分为训练和预测两部,训练时,通常采用负采样的方法,选择一个与输入句子相似的正例,并选择多个与输入不相似的反例,我们会对每个正例选择20个反例,最后使用交叉熵作为损失函数训练模型。



模型训练好后,离线计算出所有语料的语义向量,并保存在模型中。预测时,将当前话术语料对应的向量取出来,使用训练好的语义模型将用户说话转化为向量,与话术语料的向量做相似度计算,若分数高于阈值,则认为命中的语料对应的问题为当前用户说话所触发的问题。



相似度计算的核心是语义模型部分,不同阶段采用了不同的方式,我们将相似度匹配的开发分为无样本期、小样本期和多样本期。
 
无样本期没有使用DSSM方式,而是使用拼音结合编辑距离的方式,不需要模型训练,且能够达到较高的准确率,但是缺乏召回和数据迭代的能力。随着数据增加,分别使用BiGRU和TextCNN作为DSSM的语义模型达到了不错的效果。此后,通过不断的数据积累和数据增强,我们使用TextCNN+Transformer作为语义模型效果最好,准确率为83.39%,召回率为80.1%,其结构如下图所示,输入文本首先经过embedding层(Emb),再使用卷积核分别为1、2、3、4的一层卷积层,得到句子的局部特征表示,再经过一层的Transformer(Trm),增加了词之间的关联性特征,经过Max Pooling后,进入最后的输出层得到语义向量。



此外,由于单句意图粒度较粗,无法满足个别话术区分肯定否定分支的要求,如下图所示,意图擅长解决的问题为,句子差别较大但语义完全相同的文本,如:“我是”和“没错”都表示肯定意图,而意图识别无法解决意图相同,且句子之间只有细微差别的文本,如:“没想好”和“没考虑”都是否定意图,但前者却表示“想过,但是没有想好”,后者则表示“从来没有考虑过”,在意向挖掘的场景下,前者暗指用户还是有意向的,这一类问题同样需要用到相似度匹配来解决。



因此,除了标准问题和关键词问答,主线也会用到相似度匹配,用以解决意图粒度不足的问题,实现方式与标准问题相同。

槽位识别
前面提到大部分话术的目的是意向确认,也有话术会要求提取用户提及的关键信息,并依据提取的内容进行话术跳转,这就需要槽位识别模块。比如,对于58新车话术,系统对浏览过58新车、二手车的用户进行回访,并从中了解用户对买车的要求,并识别出槽位:车品牌、车系、车型、姓氏、新车还是二手车等。
 
槽位识别是一种序列标注任务,通常使用实体识别算法实现,目的是从一句话中提取我们关心的实体。实体标签与句子中的每个字对应,通常使用两种标准IOB2和IOBES,标签含义如下表:



识别结果如下图所示,标签包含位置和实体类型两个部分,图中“电视机”即为一个实体。



槽位识别的开发流程如下图所示,首先需要定义本体库,本体库也就是定义我们需要识别哪些实体类型,以及各实体之间的关系,如:“地点”类型包含“城市”、“商圈”等,“时间大类”包含“时间”、“日期”等,因此本体库为一个树形结构。构造好本体库,对每个“叶子节点”收集一些实体,并根据这些实体爬虫获得相关文本数据,利用Trie数先根据关键词识别出文本中实体的大概位置,再使用标注工具修正Trie树的结构。



最后,我们采用IDCNN+CRF模型来进行实体识别,模型结构如下图所示。IDCNN也叫空洞卷积,其卷积核的每行每列之间有间隔,可以增大模型的感受野,通常以四个卷积核为一个网络单元,重复多次以获得字与字中间丰富的依存关系。

 
经过IDCNN得到标签数量维度的向量,作为CRF的特征,从而得到每个字对应的实体标签。目前,测试集中槽位识别整体的chunk准确率为95%。



在语音机器人场景中,识别出来的槽位用于话术流转,同时作为最后标签的一部分,并不涉及到根据槽位查找数据库或知识图谱的过程。因此,在配置槽位时,定了三个概念槽位名、槽位类型和槽位值。
 
槽位名为业务方定义的名字,也是最后槽位标签的名字,槽位类型为槽位名对应的实体类型,也就是本体库中的一个节点,槽位值为从文本中提取出来的实体。如:槽位名为“品牌车系”,槽位类型为“car_brand, car_series”,槽位值为“奥迪,A6”。
 
识别出槽位后,根据对话管理系统中槽位策略的配置,选择话术跳转路径,实现话术流转。此外,识别出来的槽位名+槽位值作为标签反馈给业务方。

总结
本文介绍的语义意图是对用户说话内容的理解,通过自然语言理解(NLU)模块得到。详细介绍了单句意图、语义相似度、槽位识别的实现过程和方法,结合对话管理,实现了一套通用的语音机器人系统。对于整轮通话的语义意图,后续会有相关文章介绍。
 
目前,对于用户说话的理解大部分是基于文字内容实现的,其效果受语音识别和断句的效果影响较大,口语场景和嘈杂的环境是意图识别的难点。后续会进一步使用语音特征,优化语音识别效果,使语音机器人与用户的交互更加稳定流畅。

作者简介
周维,算法高级开发工程师,负责智能客服闲聊机器人、写稿机器人、语音机器人算法相关工作。目前主要从事语音机器人NLU模块算法研发和外呼效果调优工作。



00

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存