2015-03-25 77 views
0

我有一个nltk.tree.Tree对象。我想用下面的函数遍历它,并且改变每个叶子的POS标签(即上面例子中的'tag')。更改NLTK树叶中的POS标记的值

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

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

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

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

+0

创建具有相同结构的新树,但是当您遇到想要的POS时,只需更改它即可。 – 404pio 2015-03-25 08:07:40

+0

@frankov根据上面的遍历函数,我试着产生一个像'(S(NP I)(VP(V saw)(NP him)))'的字符串,并用'Tree.fromstring'将它改成了Tree 。但它不够简洁。任何提示或摘录? – user2870222 2015-03-25 12:18:19

回答

1

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

希望这会有所帮助!

+0

这就是我想要的。非常感谢。 – user2870222 2015-03-25 15:26:32