- 4.4 使用 ElementTree 访问 Toolbox 数据
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>
