更改NLTK树叶中POS标记的值

时间:2015-03-25 06:25:17

标签: python tree nltk

我有一个nltk.tree.Tree对象。

t = Tree('S', [Tree('NP', [('I','tag')]), Tree('VP', [Tree('V', [('saw','tag')]), Tree('NP', [('him','tag')])])])

我希望使用下面的函数遍历它,并更改每个叶子的POS标记(即上面例子中的#39;标记')。

def traverse(tree):
    try:
        tree.label()
    except AttributeError:
        tree[-1] = ('another_tag')
        print(tree)
    else:
        for child in tree:
            traverse(child)

不幸的是,叶子中的每个POS标签都无法更改,因为包含它的元组对象是不可变的。

如何在不影响原始树结构的情况下更改示例中的POS标签?

我对这个树结构相当新,请展示一些如何处理嵌套结构的清晰摘录。

1 个答案:

答案 0 :(得分:2)

nltk树实际上只是一个列表。 使用枚举,您可以遍历它并为位置i的节点分配新值。类似的东西:

def traverse(tree):

    for index, subtree in enumerate(tree):
        if type(subtree) == nltk.tree.Tree:
            traverse(subtree)
        elif type(subtree) == tuple:
            newVal = (subtree[0], subtree[1].lower())
            subtree = newVal
            tree[index] = subtree

因为你正在处理元组(不可变),所以你不能只替换POStag,而是必须创建一个新的元组。 上面的代码只是使标记小写,但你可以把任何你喜欢的东西作为newVal元组的第二个元素。

希望这有帮助!