语⾳助⼿中的复杂语义表达⽅法
编辑整理:Jane Zhang
出品平台:DataFunTalk、AI启蒙者
导读:本次分享的主题是语⾳助⼿中的复杂语义表达⽅法,在我们的领域中,NLP是必不可缺的环节,当前NLP已经发展到⼀个相对⽐较成熟的阶段,但是对于复杂的⽂本,语义理解上还存在很多问题。本次分享着重探讨这些问题的解决⽅法。
01
NLP的三个层次
在语⾳助⼿中,⾃然语⾔处理占据核⼼的位置,其主要分以下三个层次:词法分析、句法分析、语义分析(⽬标)。词法分析和句法分析是语义分析的基础,针对⽤户指令的语义分析,是我们的终极⽬标。在针对复杂问题的语义分析之前,先简单介绍下词法分析和句法分析。
1.词法分析
词法分析是将字符序列转为标记序列,并对标记序列进⾏分类的过程。这⾥标记是词法分析过程中的最⼩单位,通常是由原字符序列切割成字符⽚段,对应的值是词法分析的分类值。在NLP任务中,分词是词法分析的第⼀步;除此之外,常见的词法分析过程还包括:词性标注、NER等。这些词法分析任务⼀⽅⾯为后续语义分析提供特征,⽐如分词和词性标注;另⼀⽅⾯也为语义分析任务提供结果,⽐如NER。语⾳助⼿中的常见的槽填充是通过NER算法来完成的。
2.句法分析
句法分析⼜称语法分析,它的基本任务是确定句⼦的句法结构或者句⼦中词汇之间的依存关系。语法分析分为短语结构的依法分析和依存结构的句法分析两种。短语结构的句法分析⼜称为成分句法分析,是把句⼦组织成层次化的短语形式,短语结构的句法树上每⼀个叶⼦节点都是句⼦中的词语,每⼀个⾮叶⼦节点组成词组,边上不包含任何标注信息;另⼀种是依存句法,通过分析语⾔成分的之间的依存关系,来揭⽰其中的语法结构。依存句法通常⽤于描述句⼦的语法关系,依存句法树通常是⽤有向边连接句⼦中的两个词语,直观来讲,依存句法分析是分析句⼦中的主谓宾定状补这些语法成分,并分析句⼦中的关系,同词法分析类似,句法分析可以为后续的语义分析提供进⼀步的输⼊特征。
3.语义分析
语义分析是以词法分析和句法分析结果为基础,分析各个语⾔成分之间的语义关联。
语义分析通常可以拆分为两个任务:
①如何结构化表达隐含的语义信息,因为只有结构化的信息才能被后续的模块理解和执⾏;
②如何将⽂本数据转为结构化数据。这两个任务中语义分析表达⽅法是基础,决定了我们可以使⽤什么样的语义算法,也决定了我们能理解的语义数据的边界。
浅层语义分析
基于语义分析⽅法不同,语义分析可以分为浅层语义分析和深层语义分析两类。
这⾥简单介绍下浅层语义分析。浅层语义分析,不以得到⾃然语⾔完整语义表⽰为⽬的,通常是识别谓词在句⼦中论元,并标记论元在谓词中的充当的语义⾓⾊,典型代表是SRL (语义⾓⾊标注)。⼀个句⼦中的谓词⼀般是对主语的陈述或者说明,是什么、做什么、怎么样,代表事件的核⼼,⽐如图中例⼦中“发表”是句⼦中的谓语,和谓语搭配的名词为论元,语义⾓⾊就是
论元在动词所指事件中担任的⾓⾊,⽐如图中的在“昨天晚上”代表发表时间,总体来讲,SRL以句⼦谓词为中⼼,不对句⼦的语义深层语义信息做分析,只分析各个成分和谓词的关系。基于谓词论元结构,最终通过语义决策来描述结构关系。
02
语义数据结构 D.I.S
1.D.I.S简介
在语⾳助⼿中,⽤的较为⼴泛的⼀种结构是,D.I.S结构,也就是领域+意图+实体,可以看作⼀种特殊的语义标注任务,相对于常规的语义标注,DIS是将核⼼谓词抽象为领域和意图两层,再进⾏domain识别的同时,获取核⼼的论元,也就是实体数据。具体来讲域,针对每⼀条语⾳指令,⾸先划分到普通的领域,例如智能家居、⾳乐播放,都可以看做是⼀个领域,每个领域下划分不同的意图,如智能家居下的打开关闭意图,不同意图下有不同的实体参数,智能家居下的“打开”意图,打开意图下有category这样的实体,代表设备名称或品类;也可以有place实体,代表设备所在的位置。三层数据结构可以表达简单的语义数据,举⼀个例⼦,“打开客厅的空调”,领域是家具领域,意图是open,2个实体,⼀个是place=客厅,另⼀个category=空调。
2.D.I.S在实际中的问题和局限性
这种DIS线性结构,可以较好解决简单的指令。在实际中有很多问题和局限性,总结为如下6点:
不同领域中存在相似句式,“打开空调”,“打开歌单”,句式⾮常相似,⼀⽅⾯容易导致领域分类错误,
另⼀⽅⾯不同的domain要准备相似的训练语料,其中有⼤量的冗余⼯作;
⽆法表达跨领域的指令,如“放周杰伦的歌,⾳量调⼤⼀点”,前半句是⾳乐播放,后半句是设备控制领域,DIS数据结构仅能表⽰单⼀领域。
⽆法表⽰多实体间的语义关系:“空调温度调30°,温度设置为5,” 涉及两个⽅⾯的属性,⼀个是温度,⼀个是风速,也涉及2个属性值, 30 和5. D.I.S扁平的数据结构⽆法表达两个属性和两个属性值值之间的映射关系。
⽆法表达两个意图之间的语义关系,这和第⼆点相似,⽐如“把窗帘关上,再打开灯”,当前DIS 只表达单⼀意图的指令。
⽆法表达⽂本中隐含的语义信息,如“灯调亮⼀点“,隐含要控制的是灯的亮度,通过D.I.S的数据结构⽆法表达亮度信息。
⽆法表达模糊语义信息,如“播放⼗⾯埋伏“,⼗⾯埋伏既可能是⼀⾸歌,也可能是⼀个电影。D.I.S⽆法表达存在混淆语义的信息。
总结来说,D.I.S⽆法满⾜复杂场景的理解的需求,基于这些问题,我们提出了⼀种新的语义结构,CMRL。
03
语义数据结构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,aud
io ⾳频信息,⼦对象可以继承⽗对象的属性,⼦对象也可以有独有的属性。⽐如之前提到的“播放⼗⾯埋伏”,可以采⽤creativework来表⽰⼗⾯埋伏,通过多轮的形式来进⼀步确认⽤户想播放电影还是⾳乐。
3. Schema-Enum
第三类是枚举节点,每个枚举节点由若⼲个关键词组成,不包含其他属性。枚举节点通常是thing对象节点的某⼀个属性的取值,类似于⾯向对象中的枚举类型,可以表⽰⽂本中的隐含的语义信息,⽐如“灯调亮⼀点”,通过⽤preference表⽰“亮⼀点”的隐含功能。
4. Schema-Operator
第四类节点是是operator操作符节点,表⽰动作或者对象之间的关联关系,⽐如⽐较关系、条件关系、逻辑关系。每个操作符有⼀个或者多个属性,每个属性可能是意图,也可能是对象或者属性,通过表达谓词和谓词之间、论元和论元之间的语义关系,从⽽表达更复杂的⽂本。
5. Schema-Property
第五类是property,属性边,⽤于连接各类节点之间的属性,不包含其他属性,同样具有层次关系,⼀个属性通常有⼀个副属性,多个⼦属性,每个属性的取值在指定的节点范围之内。属性类似于在⾯向
对象中的成员变量,每个变量有⼀个声明的列类型,也句式取值必须是这⼀个类或者⼦类,类似每个属性的值要设定节点类型,或者⼦节点。
6. Schema-Joiner
最后⼀个是joiner连接符,在CRML种,属性和属性不再是单⼀的“是”或者“等于”的关系,采⽤连接符来细分表⽰关联关系。如“帮我查评分⼤于8的电影”,属性值是“8分”,两者使⽤ “>”符号连接,除此之外,还有“<”, “<=”< span=''>, “∈”, “∉”,通过更丰富的连接符表⽰更丰富的语⾔。
04
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⾥的哪个对象,是⾳乐还是电影。
05
语义解析算法
有了CMRL后,我们接下来要解决的问题是,如何将输⼊指令转换为CMRL的表达。CMRL是⼀个逻辑表达式的形式,可以看作是⼀种新的语⾔。所以,从⽂本到CMRL的转换过程可以看做是⼀个翻译的过程。翻译问题直接的做法是使⽤seq2sq的翻译模型,输⼊是⽂本数据,输出是逻辑表达式。
传统的翻译模型在我们的应⽤中有2个问题:
①⽆法保证输出表达式的语法的正确性。MRL表达式需要⼀定的满⾜语法结构,最简单的是要满⾜括号匹配,在我们的逻辑表达中使⽤括号来表⽰节点和属性之间的包含关系,除此之外,节点的属性取值也需要满⾜⼀定范围的限制。Seq2seq这个模型⽆法保证输出字符串的语法正确性。
②解空间过⼤,会影响最终的整体效果和性能。逻辑表达式中有2个元素:
schema的关键词,如active intent;
输⼊中得到的⽂本数据,如“空调,空⽓净化器”,可能从⽂本中获取。由于⽂本的存在,导致sequence的decoder解空间很⼤,对于模型的整体效果和性能⾮常不利。
针对这两个问题,这⾥向⼤家分享2种模型。
decoder①第⼀种模型是⼀个带有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。
以上就是我们在语⾳助⼿中的复杂语义的分析⽅法。
今天的分享就到这⾥,谢谢⼤家。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。