超详细解读:神经语义解析的结构化表示学习 | 附代码分析

本文详细解读了一种解决语义解析目标输出不规范性问题的神经语义解析器,该解析器采用基于状态转移的方法生成谓词-参数形式的中间表达,提供可解释的语义聚合过程。文中介绍了任务背景、相关工作、模型细节,并附带代码分析。
摘要由CSDN通过智能技术生成


640?wxfrom=5&wx_lazy=1


在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考。


在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果。


点击本文底部的「阅读原文」即刻加入社区,查看更多最新论文推荐。

这是 PaperDaily 的第 68 篇文章

本期推荐的论文笔记来自 PaperWeekly 社区用户 @marcw为了解决目标输出的不规范性问题以及提供可解释的语义聚合过程,本文提出了一个神经语义解析器(neural semantic parser)。 

如果你对本文工作感兴趣,点击底部阅读原文即可查看原论文。

关于作者:王克欣,中科院自动化研究所硕士生,研究方向为自然语言处理。


■ 论文 | Learning Structured Natural Language Representations for Semantic Parsing

■ 链接 | https://www.paperweekly.site/papers/963

■ 源码 | https://github.com/cheng6076/scanner


任务介绍


本文介绍的任务,语义解析(Sematic Parsing),是将自然语言的句子转换为机器可解析的语义表达。具体而言,在这篇文章中,研究的问题为:  


给定一个知识库(knowledge base)K,以及标注有对应的匹配知识库的语义表达(grounded meaning representation)G 或者问题答案(denotation)y的自然语言句子(问题)x,要学习得到一个语义解析器,使之可以完成经由一个中间未匹配知识库的语义表达 U,来将 x 映射到对应的 G 的功能。


相关工作


大多数现有工作将语义解析的处理方法分成两类,第一类是通过一个任务相关的文法将自然语言句子直接解析(parse)、匹配知识图谱(grounded to a knowledge base)转为语义表达。第二类方法是首先使用句法分析器将自然语言句子解析为任务无关的中间表达(intermediate representation),然后再将中间表达转换为匹配知识图谱的最终表达。 


第一类方法


根据前人工作来看,目前使用编码器-解码器(encoder-decoder)模型处理语义解析的方法依然应当归为第一类方法。这种方法减少了领域相关假设、文法学习以及大量的特征工程工作的需要。


但是这种模型无法去解释语义聚合(meaning composition)是如何进行的,这也是该类模型极大灵活性的代价。而语义聚合的可解释性在处理边界(modeling limitation)问题上有着很大的作用。


另外,由于缺乏任务相关的先验知识的引入,学习任务关于可能推倒(derivation)的考虑上以及目标输出的不规范性(ill-formed,如解析结果少了或多了若干括号)问题上不能得到很好的限制。 


第二类方法


第二类方法的一个优势在于产生了可重复利用的中间表达,这种中间表达由于其任务无关性可以一定程度上处理未出现的词(unseen words)以及不同领域的知识迁移(knowledge transfer)。


文章动机与主要贡献


为了解决目标输出的不规范性问题以及提供可解释的语义聚合过程,这篇文章提出了一个神经语义解析器(neural semantic parser)。


与其他方法相比,该模型没有使用外部的解析器(如 dependency parser)以及手工设计的 CCG 文法,而是采用了基于状态转移(transition-based)的方法生成谓词-参数(predicate-argument)形式的中间表达,由此避免了生成不规范形式的语义表达。 


另外与目前语义解析问题中大多数采用的 CKY 类似的自底向上(bottom-up)解析策略相比,本文提出的方法不需要对自然语言的句子结构的进行人为的特征分解(decomposition),可以利用大量的非局部特征。


基于假设匹配知识图谱后的语义表达与未匹配的语义表达同构(isomorphic)的假设,本文提出的状态转移模型的输出最终可以匹配到某一个知识图谱。


模型细节与代码


整个网络是在标注了对应的逻辑形式或者问题答案的自然语言句子集上进行端到端训练的。这篇文章附上的开源代码只给出了适用于标注逻辑形式的数据集的版本,下面将结合具体训练样本的训练过程以及代码来进行这部分的介绍。


适用标注逻辑形式的数据集的版本


这里的逻辑形式为 Funql,一个训练样本及其标注为:


how many states have a city called rochester

answer(count(state(loc(city(cityid(rochester,_)))))) (*)


下面结合对该样本的训练更新过程进行阐述。


训练过程


输入:


训练样本集:这里是用的语料库为 GEOQUERY,包含 880 个关于美国地理信息的问题和对应的逻辑查询语句);


通用谓词表这些谓词与领域无关,例如 (∗) 中的 answer,count,state,loc,city,cityid,_ 等,详细的关于通用谓词表见附录-通用谓词)。


输出:训练好的语义分析器,能够将自然语言问题映射到相应的逻辑表达(Funql)。


过程:


1. 将问题的单词加入单词词典(这里和下文提到的词典都是为了之后神经网络的 softmax 输出对应输出字符串而建立的);


 
 

word_vocab.feed_all(sen)


2. 对逻辑表达进行解析得到语法树,可以从语法树中获得其中包含的非终结符终结符以及能够更直接指导状态转移系统训练的标注信息 U(ungrouned meaning representation)。 


其中 U=(a,u):


  • a 为状态转移系统的动作(action)序列,包括 NT,TER 和 ACT(对应原文的 RED),分别代表在栈中加入一个非终结符、在栈中加入一个终结符以及规约;


  • u 为项(包括终结符和非终结符)序列,为 NT,TER 动作的参数。


在对逻辑表达解析以及构造语法树时, 首先将逻辑表达转换为另一种方便处理形式:


640


对应这里:


640


交互调用:


 
 

def parse_list(tokens) #对表达式深入分解(进到括号内),直到不能分解(没有括号)


与:


 
 

def parse_operands(tokens) #每个括号后紧跟的为运算符,也即动作,对这些动作进行记录


最后得到了语法树的嵌套 list 表示,这里为:


 
 

<type 'list'>: ['answer', ['count', ['state', ['loc', ['city',
['cityid', 'rochester,', '_']]]]]]


这两个函数的完整代码见附录-代码-parse_list 和附录-代码-parse_operands。


得到所有的终结符和非终结符,加入对应的词典:


 
 

nt_vocab.feed_all(nt)
ter_vocab.feed_all(ter)


最后参照语法树的嵌套 list 表示,构建语法树


 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值