我有一个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标签?
我对这个树结构相当新,请展示一些如何处理嵌套结构的清晰摘录。
答案 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元组的第二个元素。
希望这有帮助!