36

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

 4 years ago
source link: https://www.tuicool.com/articles/NZrAvi6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

背景

语音机器人是58同城TEG架构平台线AI Lab自主研发的具有自动电话拨打、多轮语音交互、智能意向判断等多种功能的通用智能对话机器人。语义意图是一个比较广泛的概念,在语音机器人中有两层含义,一是在与用户交互过程中对用户说话的理解,帮助系统完成通话,二是在整轮通话结束后,对用户打上的意向标签,作为后期分析使用,本文主要介绍前者的内容。

为了让语音机器人在复杂且多样的话术上与用户流畅的交互,我们设计了对话管理系统,其实现细节已在文章《 语音机器人中对话管理系统设计与实现 》中介绍。语义意图作为对话管理系统的输入,是根据用户说话内容定义的标签,这些标签结合对应的策略实现话术流转。

语义意图的识别通过自然语言理解模块(NLU)实现,在电话外呼场景下也称为口语语言理解(SLU),主要包含单句意图识别、语义相似度匹配、槽位识别三个部分,本文将详细介绍各模块所解决的问题与难点,以及对应的实现方法。

单句意图

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

但实际情况比较复杂,用户有时不会正面回答,比如,“招满了”表示否定,“怎么了?”默认表示肯定等等。更为麻烦的是,不同的话术,甚至不同的节点对肯定和否定都有着不同的定义,这给意图识别带来的很大的挑战。

为了适应多种复杂的话术类型,同时能够方便业务方配置话术,我们定义了19类意图标签,如下图所示:

IfMNFrA.png!web

单句意图标签可以分为三类:主线意图、通用意图和拒识意图。其中主线意图均可以代表着用户的意向,如:肯定、否定、提供信息、提问等。

业务方根据话术想要达到的目的,配置话术语料,系统会根据语料自动识别每个分支表达了什么意图,如下图所示,当用户触发了affirm、request,会跳转到肯定否定对应的节点,而当用户触发negate、offer意图,会跳转到否定分支对应的节点。这样话术每个节点的肯定和否定具备了定制化的能力,同时由于意图标签是通用的,也让话术具备了一定的泛化能力。

ERn2i2q.png!web

电话外呼场景对通话流畅性的要求很高,需要有效处理用户的口头语和临时提出的一些问题。通用意图则定义了电话交互过程中经常出现的几种意图,如:greeting表示“您好”,hangup表示“别再给我打电话了”等。当用户提及这些意图时,会触发对话管理系统中对应的通用意图策略,配合拉回策略保证了对话的连贯性。

拒识意图则表示对话中常见但暂时不需要处理的意图,系统会通过引导语将用户拉回到主线话术上来。

单句意图的实现使用了下图所示的TextCNN文本分类模型,同时实验过BiLSTM、FastText、BERT等方法,效果不如TextCNN,主要是由于口语场景下的文本存在着字数少、不通顺、多意图等特点,TextCNN对于局部依存关系较敏感,在当前场景下存在优势。

MZzuee6.jpg!web

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

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

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

7JvEjiE.png!web

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

aaY7Jvm.png!web

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

语义相似度匹配

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

标准问题通常是与业务无关的问题,如:“你是谁”等,对于这类的问题,直接回复对应的答案,并配合拉回策略将状态拉回到上一句话。

关键词问答通常与业务相关,可以理解为主线的分支任务,如:“多少钱”等问题,系统在对用户提问做出回复后,会根据话术定义,将状态拉回到主线的指定节点。

标准问题与关键词问答都是用户说话触发了某个问题对应的语料,且不同话术的标准问题、关键词问答的定义不同,因此,均采用了基于DSSM的相似度匹配的方式。

DSSM使用语义模型将文本转化为语义向量,并计算向量之间的相似度作为两个句子的相似度,一般使用余弦相似度。其过程分为训练和预测两部,训练时,通常采用负采样的方法,选择一个与输入句子相似的正例,并选择多个与输入不相似的反例,我们会对每个正例选择20个反例,最后使用交叉熵作为损失函数训练模型。

YJZjAfu.png!web

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

uuUZjan.png!web

相似度计算的核心是语义模型部分,不同阶段采用了不同的方式,我们将相似度匹配的开发分为无样本期、小样本期和多样本期。

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

Zrue2ai.png!web

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

JFJjEzy.png!web

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

槽位识别

前面提到大部分话术的目的是意向确认,也有话术会要求提取用户提及的关键信息,并依据提取的内容进行话术跳转,这就需要槽位识别模块。比如,对于58新车话术,系统对浏览过58新车、二手车的用户进行回访,并从中了解用户对买车的要求,并识别出槽位:车品牌、车系、车型、姓氏、新车还是二手车等。

槽位识别是一种序列标注任务,通常使用实体识别算法实现,目的是从一句话中提取我们关心的实体。实体标签与句子中的每个字对应,通常使用两种标准IOB2和IOBES,标签含义如下表:

RrmIVju.png!web

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

7FzIvyj.png!web

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

Bbi6ryV.png!web

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

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

vYnARv3.jpg!web

在语音机器人场景中,识别出来的槽位用于话术流转,同时作为最后标签的一部分,并不涉及到根据槽位查找数据库或知识图谱的过程。因此,在配置槽位时,定了三个概念槽位名、槽位类型和槽位值。

槽位名为业务方定义的名字,也是最后槽位标签的名字,槽位类型为槽位名对应的实体类型,也就是本体库中的一个节点,槽位值为从文本中提取出来的实体。如:槽位名为“品牌车系”,槽位类型为“car_brand, car_series”,槽位值为“奥迪,A6”。

识别出槽位后,根据对话管理系统中槽位策略的配置,选择话术跳转路径,实现话术流转。此外,识别出来的槽位名+槽位值作为标签反馈给业务方。

总结

本文介绍的语义意图是对用户说话内容的理解,通过自然语言理解(NLU)模块得到。详细介绍了单句意图、语义相似度、槽位识别的实现过程和方法,结合对话管理,实现了一套通用的语音机器人系统。对于整轮通话的语义意图,后续会有相关文章介绍。

目前,对于用户说话的理解大部分是基于文字内容实现的,其效果受语音识别和断句的效果影响较大,口语场景和嘈杂的环境是意图识别的难点。后续会进一步使用语音特征,优化语音识别效果,使语音机器人与用户的交互更加稳定流畅。

作者简介

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK