4.4 使用 ElementTree 访问 Toolbox 数据
在4中,我们看到了一个访问 Toolbox 数据的简单的接口,Toolbox 数据是语言学家用来管理数据的一种流行和行之有效的格式。这一节中,我们将讨论以 Toolbox 软件所不支持的方式操纵 Toolbox 数据的各种技术。我们讨论的方法也可以应用到其他记录结构化数据,不必管实际的文件格式。
我们可以用toolbox.xml()
方法来访问 Toolbox 文件,将它加载到一个elementtree
对象中。此文件包含一个巴布亚新几内亚罗托卡特语的词典。
>>> from nltk.corpus import toolbox
>>> lexicon = toolbox.xml('rotokas.dic')
有两种方法可以访问 lexicon 对象的内容:通过索引和通过路径。索引使用熟悉的语法;lexicon[3]
返回 3 号条目(实际上是从 0 算起的第 4 个条目);lexicon[3][0]
返回它的第一个字段:
>>> lexicon[3][0]
<Element 'lx' at 0x10b2f6958>
>>> lexicon[3][0].tag
'lx'
>>> lexicon[3][0].text
'kaa'
第二种方式访问 lexicon 对象的内容是使用路径。lexicon 是一系列record
对象,其中每个都包含一系列字段对象,如lx
和ps
。使用路径record/lx
,我们可以很方便地解决所有的语意。这里,我们使用findall()
函数来搜索路径record/lx
的所有匹配,并且访问该元素的文本内容,将其规范化为小写。
>>> [lexeme.text.lower() for lexeme in lexicon.findall('record/lx')]
['kaa', 'kaa', 'kaa', 'kaakaaro', 'kaakaaviko', 'kaakaavo', 'kaakaoko',
'kaakasi', 'kaakau', 'kaakauko', 'kaakito', 'kaakuupato', ..., 'kuvuto']
让我们查看 XML 格式的 Toolbox 数据。ElementTree
的write()
方法需要一个文件对象。我们通常使用 Python 内置的open()
函数创建。为了屏幕上显示输出,我们可以使用一个特殊的预定义的文件对象称为stdout
(标准输出),在 Python 的sys
模块中定义的。
>>> import sys
>>> from nltk.util import elementtree_indent
>>> from xml.etree.ElementTree import ElementTree
>>> elementtree_indent(lexicon)
>>> tree = ElementTree(lexicon[3])
>>> tree.write(sys.stdout, encoding='unicode') ![[1]](/projects/nlp-py-2e-zh/Images/346344c2e5a627acfdddf948fb69cb1d.jpg)
<record>
<lx>kaa</lx>
<ps>N</ps>
<pt>MASC</pt>
<cl>isi</cl>
<ge>cooking banana</ge>
<tkp>banana bilong kukim</tkp>
<pt>itoo</pt>
<sf>FLORA</sf>
<dt>12/Aug/2005</dt>
<ex>Taeavi iria kaa isi kovopaueva kaparapasia.</ex>
<xp>Taeavi i bin planim gaden banana bilong kukim tasol long paia.</xp>
<xe>Taeavi planted banana in order to cook it.</xe>
</record>