第一句子大全,网罗天下好句子,好文章尽在本站!

NLTK框架API:丰富语言资源的可发现性设计

时间:2023-05-14

词典框架结构和带注释的句子可以通过编程的方式处理,或者通过交互式的Python提示符以人类可读的显示方式进行浏览

友情提示:本文共有 6725 个字,阅读大概需要 14 分钟。

EMNLP 2017 System Demonstrations

The NLTK FrameNet API:Designing for Discoverability with a Rich Linguistic Resource

乔治城大学

Georgetown University

【摘要】一个新的Python API,集成在NLTK套件中,提供了对FrameNet 1.7词汇数据库的访问。词典(框架结构)和带注释的句子可以通过编程的方式处理,或者通过交互式的Python提示符以人类可读的显示方式进行浏览。

1 引言

十多年来,伯克利的框架网FrmeNet(此后简称为FrameNet)项目(Baker et al., 1998)一直在记录关于框架语义理论(Fillmore, 1982)方面的当代英语的词汇量。作为一个免费获取、丰富的语言学资源,FrameNet现在覆盖了超过1000个语义框架,10000个词汇意义,以及10万个从语料库抽取的词汇标注。这一资源已经形成了许多自然语言处理研究的基础——最显著的是,这一传统的语义角色标签一直延续到今天(Gildea and Jurafsky, 2002; Baker et al.,2007; Das et al., 2014; FitzGerald et al., 2015; Roth and Lapata, 2015, interalia)。

尽管框架网很重要,但计算用户常常因为其定制XML格式的复杂性而感到沮丧。鉴于大部分资源都可以在网站浏览(http://framenet. icsi.berkeley.edu/),对于语言描述和注释的某些细节由于没有使用HTML数据视图披露,而显得黯然失色。(例如,最近FrameNet用户咨询其中一个作者“帧到帧frame-to-frame关系是否包括独立的框架元素之间的映射”。它们确实如此,但是用户的困惑是可以理解的,因为这些映射没有在网站的HTML框架定义中公开。(如果用户知道看这的话,他们可以通过FrameGrapher工具https://framenet.icsi.berkeley.edu/fndrupal/FrameGrapher,发现可视化关系。)出于对空间的兴趣,我们的API并没有在框架中显示,但是它们可以通过一个单独的框架关系对象或fe_relation()方法来访问,见4.4节)。用于阅读框网数据的少数开源API现在已经过时了,且没有一个被广泛采用。【注:我们认为:github.com/dasmith/FrameNet-python (Python),nlp.stanford.edu/software/framenet.shtml (Java),github.com/FabianFriedrich/Text2Process/tree/master/src/de/saar/coli/salsa/reiter/framenet(Java),github.com/GrammaticalFramework/gf-contrib/tree/master/framenet(Grammatical Framework),在过去的几年内都没有更新,所以他们好像没法完全兼容最近发布的数据】

我们描述了一个新的用户友好的Python API来获取FrameNet数据。这个API包含在最近发布的流行的NLTL套件里面(Bird et al., 2009),可以访问FrameNet发布的几乎所有的信息。

2 安装

NLTK的按照说明可以在ntlk.org上找到。NLTK是跨平台的,支持Python2.7和Pyton3.x环境,它捆绑在Anaconda和EnthoughtCanopy的发布版本中(https://www.continuum.io/downloads,https://store.enthought.com/downloads),供数据科学技术使用。

在一个工作的NLTK安装(版本3.2.2或更高版本)中,只需调用一个方法来下载帧网数据(>>>是标准的Python交互式提示符,通常通过在命令行上输入Python来调用。然后,可以在提示符中输入Python代码,并对其进行评估/执行。以后的例子假定读者熟悉基本的Python。在默认情况下,会在用户的主目录下安装855MB的数据版本,但是可以指定另一个位置:具体可参见http://www.nltk.org/data.html。)

>>>importnltk

>>>nltk.download("framenet_v17")

随后,框架模块加载如下:(为了方便起见,使用了别名fn)

>>>fromnltk.corpus import framenet as fn

3 FrameNet概述

FrameNet是围绕着被称为框架的概念结构来组织的。语义框架表示场景——一种事件、状态或其他可能是通用的、特定于文化的、域通用的或特定领域的场景。框架定义了参与者角色或框架元素(角色),它们的关系形成了理解(某些感觉)词汇条目所需的概念背景。Fillmore经常引用的例子包括:

诸如购买、销售和支付等动词,以及诸如买方、卖方、价格和购买等名词都是在商业交易场景(框架)中定义的。框架元素FEs作为框架的核心——在前面提到的词汇条目中,它们可能或不能被明确地提及——是买方、卖方、卖方出售的货物,以及买方所支付的款项。

复仇(REVENGE)概念——已经收入词汇条目如报复、复仇、复仇者、打击、偿还,从根本上来说是预先假定了一个罪犯已经对受害人造成了伤害,为此,一个复仇者(他可能是或不是受害人)寻求对犯罪者施以某种惩罚。

斜边是以一个直角三角形的几何概念为先决条件的,而行人则预先假设街道是有车辆和没车辆交通 (这两个框架目前都没出现在FrameNet中)

在框架中的框架元素正式列出了他们在框架中功能的英文描述。框架是在一个网络中组织的,包括一个继承层次结构(例如复仇是一种特殊的事件)和其他类型的框架关系。在一个框架中列出的词汇条目被称为词汇单元(逻辑单元,lexicalunits ,LUs)。FrameNet的逻辑单元的详细目录包括内容和功能词。在形式上,一个逻辑单元LU连接一个框架的词元(词元的名字包含了一个语音标签。词元可能由一个单词如词组成如surrender.v,或多个单词,例如giveup.v组成)。

4 API概述

4.1 设计原则

API考虑到的设计目标如下:

简单。无论是遍历所有条目还是搜索特定的数据库中的重要对象(主要是框架、词汇单元和注释),其访问都应该很容易。为了避免使用太多方法使API混乱,应该通过对象属性访问数据库中的其他信息。调用API的help()方法将打印用于访问数据库中信息的主要方法的概要。

可发现性。数据库的很多细节都很复杂。该API使得通过Python交互提示符,使得浏览数据库中的对象内容变得很容易。实现此目的的主要方法是完美的打印对象显示,如图1中的帧显示(见4.3)。这个显示清楚地说明了新手用户如何访问一个可能不知道的对象属性。

在我们看来,这种方法将该API与其他API区分开来。对于复杂的结构化数据,其他一些NLTK API在没有查阅文档的情况下很难浏览其结构。

按需加载。数据库存储在上千个XML文件中,这些文件包括框架文件索引列表、框架关系、词汇单元和全文文档,以及所有框架、词汇单元和全文文档的单个文件。在解压后,FrameNet 1.7版本是855M。加载所有这些文件——特别是语料库标注——很缓慢,很耗内存,在很多方面都没必要。因此,该API使用惰性数据结构精心设计,只加载需要的XML文件。加载后,所有的数据都会被缓存在内存中,以供快速后续访问。

图1 复仇REVENGE框架的文本显示。方括号里面的是属性名用于获取框架内容,圆括号里面的是框架标识ID,词汇单元LU和框架元素FE。

4.2 Lexicon Access Methods字典访问方法

在词典中查找信息的主要方法是:

使用复合名称(左)方法是使用正则表达式模式搜索词典,以匹配到条目名称。此外,lus()和fes()是将结果限制在一个特定的框架中。结果是0或多个元素的列表。如果没有提供参数,则返回词典中的所有条目。通过框架名称模式的搜索示例(其中,(?i)使模式区分大小写)如下:

>>>fn.frames("(?i)creat")

[, ,...]=268>

类似地,通过LU 名字模式的搜索——注意.v后缀被用于所有的动词词汇单元:

>>>fn.lus(r".+en.v") [, , ...]

frame()和lu()方法是用它的名字或ID来检索一个已知的条目。试图检索一个不存在的条目会触发一个类型为FramenetError的异常。

框架查找有两种附加的方法: frame_ids_and_names(名称)是得到框架ID到名称的映射,frames_by_lemma(名称)是得到与给定名称模式匹配词汇单元所属的所有框架

图2 一个按字母顺序排序的句子显示。在文本、目标、框架元素和名词层中完美打印组合信息,将可视化的框架标注置于底部。可视化中的缩写词在底部的圆括号内展开(“supp”是“support”的缩写)。“DNI”是框架网术语“明确的空实例化definite null instantiation”;GF代表着“语法功能grammatical function”;而PT代表的是“短语类型phrasetype”。

4.3 数据库对象

数据库框架中的所有结构化对象——框架、词汇单元、框架元素等等——都被加载为AttrDict数据结构。每个AttrDict实例都是一个从字符串键到值的映射,它可以是字符串、数字或结构化对象。之所以这么叫,是因为AttrDict允许以属性的方式访问键:

>>> f= fn.frame("Revenge")

>>>f.keys()

dict_keys(["cBy","cDate", "name", "ID", "_type",

"definition","definitionMarkup", "frameRelations",

"FE","FEcoreSets", "lexUnit", "semTypes", "URL"])

>>>f.name

"Revenge"

>>>f.ID

对于最重要的结构化对象,该API规定了以人类可读的方式组织对象内容的进行文本显示。图1显示了复仇REVENGE框架的显示,在交互式提示符中输入fn.frame(“复仇”)即可得到。属性名在方括号中显示,如lexUnit,它是一个从词汇单元LU名称到对象的映射。因此,在上一段代码清单之后,f.lexUnit["revenge.n"]将访问框架中的一个词汇单元LU对象,而该框架又有其自身的属性和文本显示。

4.4 高级词汇访问

框架关系 框架的详细目录是在语义网络中通过几种框架之间的关系进行组织。例如,复仇REVENGE框架涉及一个框架关系:通过继承,它与更一般的奖励和惩罚REWARDS_AND_PUNISHMENTS框架相关,如图1中所示。相应地,奖励和惩罚也涉及到与其他框架的继承关系。每个框架关系都在两个框架的框架元素之间建立了绑定关系。

除了框架对象的frameRelations属性外,框架关系可以通过主方法frame_relations(frame, frame2, type)进行浏览,其中可选参数允许过滤一个或两个框架,以及这种关系。在框架关系对象中,成对的框架元素关系存储在ferelattribute属性中。主方法fe_relations()提供了对框架元素链接的直接访问。关系类型的详细目录,包括继承、因果、起始、子框架、透视性Perspective_on和其他类型,可通过主方法frame_relation_types()获得。

语义类型 这些都提供了框架元素、框架和词汇单元LU的额外语义类别。对于框架元素而言,他们会标记出选择的限制(例如:,f.FE["Avenger"].semType提供有知觉的类型)。主方法propagate_semtypes()依据框架元素之间关系的推理法则,将框架元素的语义类型标签明确地标记给其他的框架元素。在检查框架元素的semtypes之前应该调用它(默认情况下它不会被调用,因为它需要花费几秒钟的时间来运行)。

语义类型本身就是数据库对象,它们依据其间的继承层次结构中进行组织。主方法semtypes()返回一个所有语义类型的列表;主方法semtype()通过名称、ID或缩写查找制定的类型;主方法semtype_inherits()检查两个语义类型是否有一个子类型-超类型关系。

4.5 语料库访问

句子的框架语义标注可以通过一个词汇单位对象的范例和子库属性来访问,或者通过以下主要方法:

annotations(luname, exemplars, full_text) sents()exemplars(luname) ft_sents(docname) doc(id) docs(name)

annotations()返回一个框架标注集列表。每个注释集由一个句子中的框架唤起目标frameevoking target (分词),它所唤起的框架中的词汇单元,贯穿在句子中的公开框架元素,以及空实例化null-instatiated的状态组成(在框架语义中,那些不是公开的,但在概念上所需的核心框架元素,被称为隐式或空实例化(Fillmore and Baker, 2009))。用户可以随意通过词汇单元名字过滤或者限制标注的类型(请参阅下一段):范例和全文都默认为真True。在XML中,注释的组件设置存储在几个标注层:一层(有时不止一个)框架元素,以及其他语法信息(包括语法功能和每个框架元素、系动词或支持与框架唤醒相关的短语类型标签)的辅助层。

标注集是由句子组织的。语料句出现在两种标注中:exemplars()检索带有词典注释的句子(其中一个目标被选为词汇单元标注的例子);可选参数允许过滤一组词汇单元。fts_sents ()从为全文标注选择的文档中检索句子(尽可能多地对文档中的目标进行标注);可选参数允许通过文档名称进行过滤。sents()可用于遍历所有句子。从技术上讲,每个句子对象都包含多个标注集:第一个是句子级别的标注,包括词性标签,在某些情况下称为实体标签;后续的标注集用于框架标注。由于词典标注只有一个框架标注集,它可以在句子的显示中看到:图2显示了f.lexUnit["revenge.n"].exemplars[20]的显示。全文注释只显示目标信息,允许用户深入查看每个注释集,如图3所示。

图3 一个句子的全文标注。如果这个句子对象存储在变量sent下,那么它对Revenge的标注就可以通过sent.annotationset[2]获取到(查找下面的问号?表明在Seeking框架中没有对应的词汇单元;在某些情况下,全文标注器已经标记但没有定义出适合于现有框框的词汇单元。另外,一些全文标注集标注一个没有框架元素的词汇单元——这些用!显示来要反映UNANN的标注集状态码)

可以使用doc()和docs()方法对全文注释的语句进行浏览。文档显示列出带有数字偏移量numeric offsets的句子。

5 局限和未来工作

目前API主要不支持伯克利FrameNet数据的效价模式。对于给定的词汇单元来说,效价模式总结了在带注释的标记上的框架元素的句法实现。根据FrameNet网站的报告,它们在每一个词汇单元的“词汇条目”上显示。

我们打算在未来的版本中添加对效价模式的支持,以及更复杂的查询/浏览标注的能力,以及更好地显示与框架元素标注相关的句法信息。其中的一些功能可以模仿比如FrameSQL (Sato, 2003)和Valencer(Kabbach and Ribeyre, 2016)。此外,值得研究的是,该API是否能够适用于其他语言的框架,并支持在正在进行的多语言FrameNet项目中添加到14个框架内的跨语言映射(github.com/icsi-berkeley/multilingual_FN)。

论文下载链接:

http://www.aclweb.org/anthology/D/D17/D17-2001.pdf

留言 点赞 发个朋友圈

我们一起探讨AI落地的最后一公里

本文如果对你有帮助,请点赞收藏《NLTK框架API:丰富语言资源的可发现性设计》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
写景散文轻松学 部编版四年级语文下册《海上日出》知识点概括!

写景散文轻松学 部编版四年级语文下册《海上日出》知识点概括!

...段描写天边有黑云时日出的情景.(三)、第6自然段运用仿问句式表达了对海上日出这一壮观景象的赞美之情。3、写晴朗时的海上日出抓住了这几个方面进行描写:颜色变化:一片浅蓝——一道红霞——红是真红——红得非常可...

2022-12-02 #经典句子