Python 子树提取NLTK树

Python 子树提取NLTK树,python,nltk,subtree,Python,Nltk,Subtree,我需要一些关于NLTK树的帮助 我试图从这棵法国树中提取一些子树: (已发送(NP-SUJ)↓ (PRO=H Personne)(VN=H(ADV*ne)(V=H sait)(ADV*execute)(PONCT*)) 我只想提取POS标签末尾具有“=H”的树,然后添加父节点: 像这样:(NP-SUJ↓ (PRO=H Personne)和这个:(VN=H(V=H sait)) 我为此编写了一个函数: def AddParent(tree): grammar = [] for

我需要一些关于NLTK树的帮助

我试图从这棵法国树中提取一些子树:

(已发送(NP-SUJ)↓ (PRO=H Personne)(VN=H(ADV*ne)(V=H sait)(ADV*execute)(PONCT*))
我只想提取POS标签末尾具有“=H”的树,然后添加父节点:

像这样:
(NP-SUJ↓ (PRO=H Personne)和这个:(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()
函数返回其中包含的所有子树。我只想有特定的节点

提取最后一个子树的好方法是什么


非常感谢你的帮助!我是新手,但我真的很喜欢

我不能说我理解你对
parent()
(也许你的意思是
子树()
?)的抱怨,但有更简单的方法可以让你掌握子树:

  • 表面改进:
    subtrees()
    函数接受一个
    filter
    参数,因此您不必检查代码中返回的子树:

    for subtree in tree.subtrees(filter=lambda t: t.label().endswith("=H"))
    
  • 子树是对原始树的子部分的引用。如果您不修改它,它仍然是原始树的一部分,您可以提升树(因为您使用“父”树)。事实上,请注意,如果您修改子树的内容,原始树将被修改。但是,不要嵌入在新节点下找到的树,而是构建一个全新的副本:

    partial = ParentedTree(subtree.parent().label(), [ subtree.copy() ])
    
    然后,您可以自由删除或更改副本中的分支,并且仍然可以使用原始的
    子树

  • 虽然您可以使用
    parent()
    方法爬上树,但我经常发现使用“树位置”更方便。树位置是整数的元组,它作为树下的路径(将其用作列表上的整数索引)。要查找父级,只需切掉树位置的最后一个元素:

    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


  • 上述内容可能并不完全符合您的要求(很难看出您正在做什么),但我希望您了解情况。

    非常感谢!这正是我要找的,但我不知道怎么做,很高兴听到。既然我的答案解决了你的问题,请点击左边的大复选标记“接受”。(您也可以“投票”此网站上任何您认为有用的问题或答案。)