• 4.2 Trees

    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