语音助手中的复杂语义表达方法
导读:本次分享的主题是语音助手中的复杂语义表达方法,在我们的领域中,NLP是必不可缺的环节,当前NLP已经发展到一个相对比较成熟的阶段,但是对于复杂的文本,语义理解上还存在很多问题。本次分享着重探讨这些问题的解决方法。
NLP的三个层次
在语音助手中,自然语言处理占据核心的位置,其主要分以下三个层次:词法分析、句法分析、语义分析(目标)。词法分析和句法分析是语义分析的基础,针对用户指令的语义分析,是我们的终极目标。在针对复杂问题的语义分析之前,先简单介绍下词法分析和句法分析。
1.词法分析
词法分析是将字符序列转为标记序列,并对标记序列进行分类的过程。这里标记是词法分析过程中的最小单位,通常是由原字符序列切割成字符片段,对应的值是词法分析的分类值。在NLP任务中,分词是词法分析的第一步;除此之外,常见的词法分析过程还包括:词性标注、NER等。这些词法分析任务一方面为后续语义分析提供特征,比如分词和词性标注;另一方面也为语义分析任务提供结果,比如NER。语音助手中的常见的槽填充是通过NER算法来完成的。
2.句法分析
句法分析又称语法分析,它的基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。语法分析分为短语结构的依法分析和依存结构的句法分析两种。短语结构的句法分析又称为成分句法分析,是把句子组织成层次化的短语形式,短语结构的句法树上每一个叶子节点都是句子中的词语,每一个非叶子节点组成词组,边上不包含任何标注信息;另一种是依存句法, 通过分析语言成分的之间的依存关系,来揭示其中的语法结构。依存句法通常用于描述句子的语法关系,依存句法树通常是用有向边连接句子中的两个词语,直观来讲,依存句法分析是分析句子中的主谓宾定状补这些语法成分,并分析句子中的关系,同词法分析类似,句法分析可以为后续的语义分析提供进一步的输入特征。
3.语义分析
语义分析是以词法分析和句法分析结果为基础,分析各个语言成分之间的语义关联。
语义分析通常可以拆分为两个任务:
① 如何结构化表达隐含的语义信息,因为只有结构化的信息才能被后续的模块理解和执行;
② 如何将文本数据转为结构化数据。这两个任务中语义分析表达方法是基础,决定了我们可以使用什么样的语义算法,也决定了我们能理解的语义数据的边界。
浅层语义分析
基于语义分析方法不同,语义分析可以分为浅层语义分析和深层语义分析两类。
这里简单介绍下浅层语义分析。浅层语义分析,不以得到自然语言完整语义表示为目的,通常是识别谓词在句子中论元,并标记论元在谓词中的充当的语义角色,典型代表是SRL (语义角色标注)。一个句子中的谓词一般是对主语的陈述或者说明,是什么、做什么、怎么样,代表事件的核心,比如图中例子中“发表”是句子中的谓语,和谓语搭配的名词为论元,语义角色就是论元在动词所指事件中担任的角色,比如图中的在“昨天晚上”代表发表时间,总体来讲,SRL以句子谓词为中心,不对句子的语义深层语义信息做分析,只分析各个成分和谓词的关系。基于谓词论元结构,最终通过语义决策来描述结构关系。
语义数据结构 D.I.S
1.D.I.S简介
在语音助手中,用的较为广泛的一种结构是,D.I.S结构,也就是领域+意图+实体,可以看作一种特殊的语义标注任务,相对于常规的语义标注,DIS是将核心谓词抽象为领域和意图两层,再进行domain识别的同时,获取核心的论元,也就是实体数据。具体来讲域,针对每一条语音指令,首先划分到普通的领域,例如智能家居、音乐播放,都可以看做是一个领域,每个领域下划分不同的意图,如智能家居下的打开关闭意图,不同意图下有不同的实体参数,智能家居下的“打开”意图,打开意图下有category这样的实体, 代表设备名称或品类;也可以有place实体,代表设备所在的位置。三层数据结构可以表达简单的语义数据,举一个例子,“打开客厅的空调”,领域是家具领域,意图是open,2个实体,一个是place=客厅,另一个category=空调。
这种DIS线性结构,可以较好解决简单的指令。在实际中有很多问题和局限性,总结为如下6点:
不同领域中存在相似句式,“打开空调”,“打开歌单”,句式非常相似,一方面容易导致领域分类错误,另一方面不同的domain要准备相似的训练语料,其中有大量的冗余工作;
无法表达跨领域的指令,如“放周杰伦的歌,音量调大一点”,前半句是音乐播放 ,后半句是 设备控制 领域,DIS数据结构仅能表示单一领域。
无法表示多实体间的语义关系:“空调温度调30°,温度设置为5,” 涉及两个方面的属性,一个是温度,一个是风速,也涉及2个属性值, 30 和5. D.I.S扁平的数据结构无法表达两个属性和两个属性值值之间的映射关系。
无法表达两个意图之间的语义关系, 这和第二点相似,比如“把窗帘关上,再打开灯”,当前DIS只表达单一意图的指令。
无法表达文本中隐含的语义信息,如“灯调亮一点“,隐含要控制的是灯的亮度,通过D.I.S的数据结构无法表达亮度信息。
无法表达模糊语义信息,如“播放十面埋伏“,十面埋伏既可能是一首歌,也可能是一个电影。D.I.S无法表达存在混淆语义的信息。
总结来说,D.I.S无法满足复杂场景的理解的需求,基于这些问题,我们提出了一种新的语义结构,CMRL。
语义数据结构CMRL
CMRL简介
CMRL采用一个层次化的Schema来定义“知识”以及“知识”之间的关系,在此基础上,采用一套通用的逻辑表达来描述自然语言中的结构化语义。在这里,我们首先介绍schema,含有6类元素:
Intent意图节点,关联到表达中的句式或者谓词,如右侧的例子,“打开空调关闭空气净化器。采用ActivateIntent来表示“打开”的意图。
Thing,对象节点,类似于面向编程中的“类”,用于表示某一类对象。如右图中的“aircondition”表示空调或者空气净化器
Enum,枚举节点,每个枚举由若干个关键词组成,不包含其他属性。
Operator,操作符节点, 用于表达动作之间或者对象之间的关联关系。
Property,属性边,用于连接各类节点和它们的属性。
Joiner,连接符,用于表示属性和属性之间的关联关系。
接下来分别介绍下schema中的6类元素。
1. Schema-Intent
第一类是意图节点,通常关联到语言表达中的谓词,比如:“打开XX”,“把XX设置为XX”,可以看作是对谓词的抽象,每个意图有多个属性,每个属性可以是一个对象或者枚举。所有意图节点可以描述成一个层次化的树形结构,其中子节点对应的意图是父节点对应意图的子意图,比如图中Controlintent 是activeintent的父节点。类似于面向对象中的类,子意图可以继承父意图中的所有属性,子意图也可以有自己独有的属性,这样可以更好地梳理所有意图,另一方面方便解决意图混淆的问题,比如智能家居领域中,用户说“你能不能控制空调”,这样无法命中叶子意图节点,可以回溯到controlintent,最终通过多轮来明确用户的意图,最终命中到一个叶子节点上。
2. Schema-Thing
第二类是对象Thing,类似于面向对象中的类,用于表示每一类对象,每个对象有一个或多个属性,每个属性可以是另外一个对象或者Enum值。与intent节点非常相似,所有节点组成层次化的树形结构,子节点的对象是父节点对象的子对象。比如CreativeWork,代表作品,作品下有子对象,mobile,audio 音频信息,子对象可以继承父对象的属性,子对象也可以有独有的属性。比如之前提到的“播放十面埋伏”,可以采用creativework来表示十面埋伏,通过多轮的形式来进一步确认用户想播放电影还是音乐。
3. Schema-Enum
第三类是枚举节点,每个枚举节点由若干个关键词组成,不包含其他属性。枚举节点通常是thing对象节点的某一个属性的取值,类似于面向对象中的枚举类型,可以表示文本中的隐含的语义信息,比如“灯调亮一点”,通过用preference表示“亮一点”的隐含功能。
4. Schema-Operator
第四类节点是是operator操作符节点,表示动作或者对象之间的关联关系,比如比较关系、条件关系、逻辑关系。每个操作符有一个或者多个属性,每个属性可能是意图,也可能是对象或者属性,通过表达谓词和谓词之间、论元和论元之间的语义关系,从而表达更复杂的文本。
5. Schema-Property
第五类是property,属性边,用于连接各类节点之间的属性,不包含其他属性,同样具有层次关系,一个属性通常有一个副属性,多个子属性,每个属性的取值在指定的节点范围之内。属性类似于在面向对象中的成员变量,每个变量有一个声明的列类型,也句式取值必须是这一个类或者子类,类似每个属性的值要设定节点类型,或者子节点。
6. Schema-Joiner
最后一个是joiner连接符,在CRML种,属性和属性不再是单一的“是”或者“等于”的关系,采用连接符来细分表示关联关系。如“帮我查找评分大于8的电影”,属性值是“8分”,两者使用 “>”符号连接, 除此之外,还有“<”, “<=”< span="">, “∈”, “∉”,通过更丰富的连接符表示更丰富的语言。
CMRL优势
CMRL优势
通过这套schema,可以将复杂文本表达为逻辑表达式的形式,如图所示。同时解决D.I.S这类表达方式不能解决的问题。
例如:
在不同领域中使用相同的意图节点,如“打开空调、打开歌单”。这里可以使用同样的意图节点-- active intent,从而实现扩展新领域时的意图复用,在扩展新领域时,通过迁移学习的方式,使用少量的语料,完成新模型的训练。
可以表达跨领域的指令,如“放首周杰伦的歌,音量调大一点”。使用CoordinalOperator来表示2个意图的并列关系,这样可以把两个意图串联起来。
CRML可以表达多实体的语义关系,例如:“把空调温度调到30°,风速设为5“,分别表达了2个意图,这样可以解决两个属性之间有关联关系的问题,同时两个意图操作同一个设备,这里使用device_0这种方式来解决2个意图下的指代问题。
CMRL可以表达多个意图之间的语义关系,比如把 “把窗帘关上,再打开灯”,这和跨领域的表达非常相似。这里使用Ordinaloperator表示顺序关系,它表示需要顺序执行这两个指令。
CMRL能表达文本中的隐含的语义信息,如“灯调亮点”这里使用Brightness这个枚举值来表示要操作的功能是灯的亮度。
CMRL能表示模糊的语义信息,如“播放十面埋伏”,这里使用抽象的creative work来表示“十面埋伏”,后续通过多轮确认“十面埋伏”是creative work里的哪个对象,是音乐还是电影。
语义解析算法
有了CMRL后,我们接下来要解决的问题是,如何将输入指令转换为CMRL的表达。CMRL是一个逻辑表达式的形式,可以看作是一种新的语言。所以,从文本到CMRL的转换过程可以看做是一个翻译的过程。翻译问题直接的做法是使用seq2sq的翻译模型,输入是文本数据,输出是逻辑表达式。
传统的翻译模型在我们的应用中有2个问题:
① 无法保证输出表达式的语法的正确性。MRL表达式需要一定的满足语法结构,最简单的是要满足括号匹配,在我们的逻辑表达中使用括号来表示节点和属性之间的包含关系,除此之外,节点的属性取值也需要满足一定范围的限制。Seq2seq这个模型无法保证输出字符串的语法正确性。
② 解空间过大,会影响最终的整体效果和性能。逻辑表达式中有2个元素:
schema的关键词,如active intent;
输入中得到的文本数据,如“空调,空气净化器”,可能从文本中获取。由于文本的存在,导致sequence的decoder解空间很大,对于模型的整体效果和性能非常不利。
针对这两个问题,这里向大家分享2种模型。
① 第一种模型是一个带有copy and write的seq2seq模型
它解决decoder阶段解空间过大的问题。如前面所述,输出字符包含2类:一类是Schema中的关键词信息,这种关键词数量较少;另一类是输入文本中的字符。基于这种现象,一方面采用copy机制, 选取输入文本中的词做输出,具体做法 – 在Decoder的每一步,做attention时获取针对每一个输入step上的相关性打分,把这个打分当做对应step上对应字符的打分;另一方面采用write机制,选择schema关键字作为输出,具体做法:将decoder的解空间限制在schema关键词范围之内,从而极大缩小解空间的范围,最终融合copy &write 2组打分, 通过softmax 得到最终结果,这样可以大大减小解空间。
② 第二种模型是为了解决语法正确的问题,我们称其为seq2tree。
Seq2tree采用和seq2seq相同的encoder结构,decoder阶段使用层次化的树形decoder结构,用自上而下的方式分别解码语义树的每一层。具体来讲:引入新的符号<< span="">/n> -- 代表每个子节点数据,每解析完一层数据,如果其中包含这个符号的,就继续解析下一层节点数据,下一层会把<< span="">/n>对应的hidden states,与每一步的输入做拼接, 作为每次解码的最终输入。图中的例子是ATIS的数据集,使用的逻辑表达式如下图所示。这里做seq2tree decoder解析时,先解析第一层,第一层有<< span="">/n>节点,这里继续解析,通过深度解析方式,得到最终结果,这样可以保证语法的正确性,通过以上这两种模型的融合,最终可以解析完整的高准确的CMRL。
以上就是我们在语音助手中的复杂语义的分析方法。
嘉宾介绍:
王成龙,阿里巴巴集团-天猫精灵事业部算法专家,天猫精灵IOT领域算法负责人。致力于IOT等任务型人机交互领域的语音语义理解算法研发及业务场景落地,在机器学习和自然语言处理领域积累了多年的实战经验,发表过多篇学术论文和专利。
原文链接:语音助手中的复杂语义表达方法
评论