改变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 元组的第二个元素。
希望对您有所帮助!
我有一个 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 元组的第二个元素。
希望对您有所帮助!