4.4 使用 ElementTree 访问 Toolbox 数据

4中,我们看到了一个访问 Toolbox 数据的简单的接口,Toolbox 数据是语言学家用来管理数据的一种流行和行之有效的格式。这一节中,我们将讨论以 Toolbox 软件所不支持的方式操纵 Toolbox 数据的各种技术。我们讨论的方法也可以应用到其他记录结构化数据,不必管实际的文件格式。

我们可以用toolbox.xml()方法来访问 Toolbox 文件,将它加载到一个elementtree对象中。此文件包含一个巴布亚新几内亚罗托卡特语的词典。

  1. >>> from nltk.corpus import toolbox
  2. >>> lexicon = toolbox.xml('rotokas.dic')

有两种方法可以访问 lexicon 对象的内容:通过索引和通过路径。索引使用熟悉的语法;lexicon[3]返回 3 号条目(实际上是从 0 算起的第 4 个条目);lexicon[3][0]返回它的第一个字段:

  1. >>> lexicon[3][0]
  2. <Element 'lx' at 0x10b2f6958>
  3. >>> lexicon[3][0].tag
  4. 'lx'
  5. >>> lexicon[3][0].text
  6. 'kaa'

第二种方式访问 lexicon 对象的内容是使用路径。lexicon 是一系列record对象,其中每个都包含一系列字段对象,如lxps。使用路径record/lx,我们可以很方便地解决所有的语意。这里,我们使用findall()函数来搜索路径record/lx的所有匹配,并且访问该元素的文本内容,将其规范化为小写。

  1. >>> [lexeme.text.lower() for lexeme in lexicon.findall('record/lx')]
  2. ['kaa', 'kaa', 'kaa', 'kaakaaro', 'kaakaaviko', 'kaakaavo', 'kaakaoko',
  3. 'kaakasi', 'kaakau', 'kaakauko', 'kaakito', 'kaakuupato', ..., 'kuvuto']

让我们查看 XML 格式的 Toolbox 数据。ElementTreewrite()方法需要一个文件对象。我们通常使用 Python 内置的open()函数创建。为了屏幕上显示输出,我们可以使用一个特殊的预定义的文件对象称为stdout [1] (标准输出),在 Python 的sys模块中定义的。

  1. >>> import sys
  2. >>> from nltk.util import elementtree_indent
  3. >>> from xml.etree.ElementTree import ElementTree
  4. >>> elementtree_indent(lexicon)
  5. >>> tree = ElementTree(lexicon[3])
  6. >>> tree.write(sys.stdout, encoding='unicode') ![[1]](/projects/nlp-py-2e-zh/Images/346344c2e5a627acfdddf948fb69cb1d.jpg)
  7. <record>
  8. <lx>kaa</lx>
  9. <ps>N</ps>
  10. <pt>MASC</pt>
  11. <cl>isi</cl>
  12. <ge>cooking banana</ge>
  13. <tkp>banana bilong kukim</tkp>
  14. <pt>itoo</pt>
  15. <sf>FLORA</sf>
  16. <dt>12/Aug/2005</dt>
  17. <ex>Taeavi iria kaa isi kovopaueva kaparapasia.</ex>
  18. <xp>Taeavi i bin planim gaden banana bilong kukim tasol long paia.</xp>
  19. <xe>Taeavi planted banana in order to cook it.</xe>
  20. </record>