4.2 Trees

tree 是一组连接的加标签节点,从一个特殊的根节点沿一条唯一的路径到达每个节点。下面是一棵树的例子(注意它们标准的画法是颠倒的):

  1. (S
  2. (NP Alice)
  3. (VP
  4. (V chased)
  5. (NP
  6. (Det the)
  7. (N rabbit))))

虽然我们将只集中关注语法树,树可以用来编码任何同构的超越语言形式序列的层次结构(如形态结构、篇章结构)。一般情况下,叶子和节点值不一定要是字符串。

在 NLTK 中,我们通过给一个节点添加标签和一系列的孩子创建一棵树:

  1. >>> tree1 = nltk.Tree('NP', ['Alice'])
  2. >>> print(tree1)
  3. (NP Alice)
  4. >>> tree2 = nltk.Tree('NP', ['the', 'rabbit'])
  5. >>> print(tree2)
  6. (NP the rabbit)

我们可以将这些不断合并成更大的树,如下所示:

  1. >>> tree3 = nltk.Tree('VP', ['chased', tree2])
  2. >>> tree4 = nltk.Tree('S', [tree1, tree3])
  3. >>> print(tree4)
  4. (S (NP Alice) (VP chased (NP the rabbit)))

下面是树对象的一些的方法:

  1. >>> print(tree4[1])
  2. (VP chased (NP the rabbit))
  3. >>> tree4[1].label()
  4. 'VP'
  5. >>> tree4.leaves()
  6. ['Alice', 'chased', 'the', 'rabbit']
  7. >>> tree4[1][1][1]
  8. 'rabbit'

复杂的树用括号表示难以阅读。在这些情况下,draw方法是非常有用的。它会打开一个新窗口,包含树的一个图形表示。树显示窗口可以放大和缩小,子树可以折叠和展开,并将图形表示输出为一个 postscript 文件(包含在一个文档中)。

  1. >>> tree3.draw()

Images/parse_draw.png