大多数自然语言理解(NLU)系统分析语言的过程是一条由分析步骤组成的流水线:先标注词性,再进行句法依存分析,然后为输入文本计算出语义表示。
谷歌打破了这条流水线上的所有步骤,把它们捏到了一起,推出了一步到位的自然语言理解系统:SLING。
SLING能够直接分析自然语言文本,根据它的语义表示生成语义框架图示。与原有的大多数系统相比,它避免了自然语言理解流水线的一个严重缺陷:前面步骤中的错误会影响后续步骤的分析。
实际上,流水线式的自然语言理解系统有利于对语言理解的不同阶段进行模块化,但是,早期步骤中的错误会在后边的步骤里发生连锁反应,对最终的表示产生影响。
比如说,一个典型的流程可能会在早期步骤中进行句法依存分析,后来又需要共指消解。这种情况下,如果依存分析出现错误,共指消解的结果也会受到影响。
而SLING这种直接从文本到语框架图示的方法中,输出的框架图示能直接捕捉到用户感兴趣的语义标注,同时避开了流水线式系统所带来的陷阱,还能防止出现不必要的计算。SLING使用一个专用的循环神经网络(RNN),通过框架图示上的增量编辑运算,来为输入文本计算输出表示。
而框架图示则足够灵活,能够捕捉到很多易引发兴趣的语义任务。
SLING分析器的训练只用到了输入词语,不需要依存分析等任何中间注释。
在推理阶段,SLING能够快速进行分析,它提供了一个高效、可扩展的图示存储实现,以及一个生成高效代码来执行RNN的JIT编译器。虽然SLING现在还在试验阶段,但它在普通台式机CPU上的分析速度已经超过了2500 token/秒。
框架语义分析
框架语义学将文本(例如一个句子)的意思表示为一组形式语句,每个形式语句成为一个“框架”,可以看作意义或者知识的一个单元,也包含和概念的交互,或者与之相关的其他框架。
SLING将所有语义框架组织成一些列插槽,每个插槽都有自己的名字(角色)和值,这个值可以是文字的,也可以是和另一个插槽之间的连接。
比如说这句话:
Many people now claim to have predicted Black Monday.
SLING会从中认出提及的实体(例如人物、地点、事件)、测量值(例如时间、距离)以及其他概念(例如动词),然后将它们放置在与输入中动词相关的正确语义角色上。
比如说句中的“predict”,就表示为PREDICT-01框架。PREDICT-01和施行predict这个动作的主体有交互(插槽),通过ARG0插槽表示,ARG0与表示“people”的PERSON框架相连接;PREDICT-01还和被预测的客体有交互,表示为ARG1插槽,和表示“Black Monday”的EVENT框架连接。
如下图所示:
框架语义分析的任务就是直接生成一幅图示,包含像上图这样通过插槽互相连接的框架。
上面只是一个简单的例子,框架图示很强大,适用于各种复杂的语义标注任务。对于初学者来说,框架是一种将语言内部和外部信息结合起来的方式。然后,这就可以用来处理复杂的语言理解问题,比如指代、隐喻、借代等。这些任务的语义框架图示只在用到的框架类型、角色、连接限制上有所不同。
SLING
SLING通过为易引发兴趣的语义框架进行优化,训练了一个RNN。网络隐藏层中已经学习到的表示取代了流水线系统中手工调整的特征组合和中间表示。
在内部,SLING使用编码器-解码器架构,其中使用诸如原始单词,其后缀,标点符号等简单词汇特征将每个输入词编码成向量。而解码器用这种表示和自己历史中的循环特征,来计算更新框架图示以获得输入句子的预期框架语义表示所需的转换序列。
在训练模型时,SLING使用了TensorFlow和DRAGNN。
下面的动画展示了如何用一次转换将框架和角色增量添加到框架图中。
正如前面用简单例句所说明的那样,SLING使用ARG1这一角色来连接VERB和EVENT框架,EVOKE转换从文本中接下来的几个token中唤起指定类型的框架。同样,CONNECT转换将两个现有框架和一个特定角色连接起来。当输入耗尽,最后一个转换(STOP)执行完成,框架图示被视为已完成,并返回给用户,用户可以查看图示,得到句子背后的语义。
这个转换系统中有一个关键方面,就是会出现一个固定大小的框架注意力缓冲区,代表最近被唤醒或修改过的框架,如上图的橙色框所示。这个缓冲区捕捉了我们倾向于想起最近唤醒、提及、增强过的知识。如果框架不再使用,随着新框架的进入,它最终会被刷新出缓冲区。这个简单的机制在捕捉大部分框架间连接上都非常有效。
相关资源
SLING是用C++写成的,开源代码地址:
https://github.com/google/sling
相关论文SLING: A framework for frame semantic parsing
地址:https://arxiv.org/abs/1710.07032