子树提取NLTK树
Subtree Extraction NLTK Tree
我需要一些 NLTK 树的帮助。
我正在尝试从这棵法国树中提取一些子树:
(SENT (NP-SUJ↓ (PRO=H Personne)) (VN=H (ADV* ne) (V=H sait)) (ADV* exactement) (PONCT* .))
我只想提取 POS 标签末尾有 '=H' 的树,然后添加父节点:
像这样:(NP-SUJ↓ (PRO=H Personne)) and this: (VN=H (V=H sait))
我写了一个函数来这样做:
def AddParent(tree):
grammar = []
for subtree in tree.subtrees():
if subtree.height()==2 and subtree.label().endswith("=H"):
PartialTree = ParentedTree(subtree.parent().label(),
[ParentedTree(subtree.label(), subtree)])
grammar.append(PartialTree)
return grammar
#Test
pt = ParentedTree.fromstring("(SENT (NP-SUJ↓ (PRO=H Personne)) (VN=H (ADV* ne) (V=H sait)) (ADV* exactement) (PONCT* .))")
AddParent(pt)
[ParentedTree('NP-SUJ↓', [ParentedTree('PRO=H', ['Personne'])]),
ParentedTree('VN=H', [ParentedTree('V=H', ['sait'])])]
我这里有两个问题:首先,我想继续向原始树的那些子树添加信息。例如,我想继续添加祖先节点,然后添加子节点,以执行如下操作:
(SENT (NP-SUJ↓ ) (VN=H (V=H sait)))
但是我找不到原来那棵树了...
二、parent()
函数returns里面包含的所有子树。我只想拥有特定的节点。
提取最后一个子树的好方法是什么???
非常感谢您的帮助!我是新手,但我真的很喜欢!
我不能说我理解你对 parent()
的抱怨(也许你的意思是 subtrees()
?),但是有更简单的方法来获取子树:
表面改进:subtrees()
函数接受一个 filter
参数,因此您不必在代码中检查返回的子树:
for subtree in tree.subtrees(filter=lambda t: t.label().endswith("=H"))
子树是对原始树的子部分的引用。如果你不修改它,它仍然是原始的一部分,你可以提升树(因为你使用 "parented" 树。)实际上,请注意,如果你对子树的内容进行修改,原始树将被修改。但不是将您找到的树嵌入到新节点下,而是构建一个全新的副本:
partial = ParentedTree(subtree.parent().label(), [ subtree.copy() ])
然后您可以自由删除或更改副本中的分支,并且您仍然可以使用原始 tree
和 subtree
。
虽然可以用parent()
的方式爬上树,但我经常觉得用"tree positions"的方式更方便。树位置是一个整数元组,用作树的路径(使用它就像列表上的整数索引)。找到父节点,只需要切掉树位置的最后一个元素即可:
for postn in tree.treepositions():
if tree[postn].label().endswith("=H"):
parentpos = postn[:-1] # everything but the last element
partial = Tree(tree[parentpos].label(), [ tree[postn] ])
请注意,如果您使用此方法,则不再需要 parent()
方法,因此您最好使用 Tree
,而不是 ParentedTree
。
以上内容可能并没有完全按照您的要求进行(很难看出您在做什么),但我希望您能理解。
我需要一些 NLTK 树的帮助。
我正在尝试从这棵法国树中提取一些子树:
(SENT (NP-SUJ↓ (PRO=H Personne)) (VN=H (ADV* ne) (V=H sait)) (ADV* exactement) (PONCT* .))
我只想提取 POS 标签末尾有 '=H' 的树,然后添加父节点:
像这样:(NP-SUJ↓ (PRO=H Personne)) and this: (VN=H (V=H sait))
我写了一个函数来这样做:
def AddParent(tree):
grammar = []
for subtree in tree.subtrees():
if subtree.height()==2 and subtree.label().endswith("=H"):
PartialTree = ParentedTree(subtree.parent().label(),
[ParentedTree(subtree.label(), subtree)])
grammar.append(PartialTree)
return grammar
#Test
pt = ParentedTree.fromstring("(SENT (NP-SUJ↓ (PRO=H Personne)) (VN=H (ADV* ne) (V=H sait)) (ADV* exactement) (PONCT* .))")
AddParent(pt)
[ParentedTree('NP-SUJ↓', [ParentedTree('PRO=H', ['Personne'])]),
ParentedTree('VN=H', [ParentedTree('V=H', ['sait'])])]
我这里有两个问题:首先,我想继续向原始树的那些子树添加信息。例如,我想继续添加祖先节点,然后添加子节点,以执行如下操作:
(SENT (NP-SUJ↓ ) (VN=H (V=H sait)))
但是我找不到原来那棵树了...
二、parent()
函数returns里面包含的所有子树。我只想拥有特定的节点。
提取最后一个子树的好方法是什么???
非常感谢您的帮助!我是新手,但我真的很喜欢!
我不能说我理解你对 parent()
的抱怨(也许你的意思是 subtrees()
?),但是有更简单的方法来获取子树:
表面改进:
subtrees()
函数接受一个filter
参数,因此您不必在代码中检查返回的子树:for subtree in tree.subtrees(filter=lambda t: t.label().endswith("=H"))
子树是对原始树的子部分的引用。如果你不修改它,它仍然是原始的一部分,你可以提升树(因为你使用 "parented" 树。)实际上,请注意,如果你对子树的内容进行修改,原始树将被修改。但不是将您找到的树嵌入到新节点下,而是构建一个全新的副本:
partial = ParentedTree(subtree.parent().label(), [ subtree.copy() ])
然后您可以自由删除或更改副本中的分支,并且您仍然可以使用原始
tree
和subtree
。虽然可以用
parent()
的方式爬上树,但我经常觉得用"tree positions"的方式更方便。树位置是一个整数元组,用作树的路径(使用它就像列表上的整数索引)。找到父节点,只需要切掉树位置的最后一个元素即可:for postn in tree.treepositions(): if tree[postn].label().endswith("=H"): parentpos = postn[:-1] # everything but the last element partial = Tree(tree[parentpos].label(), [ tree[postn] ])
请注意,如果您使用此方法,则不再需要
parent()
方法,因此您最好使用Tree
,而不是ParentedTree
。
以上内容可能并没有完全按照您的要求进行(很难看出您在做什么),但我希望您能理解。