改变NLTK Tree leaf中POS标签的值

Change the value of the POS tag in NLTK Tree leaf

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

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

我想用下面的函数遍历它,改变每个叶子的POS标签(即上面例子中的'tag')。

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

不幸的是,叶子中的每个 POS-tag 都不能更改,因为包含它的元组对象是不可变的。

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

我对这种树结构还很陌生,请展示一些如何处理嵌套结构的清晰摘录。

一个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 元组的第二个元素。

希望对您有所帮助!