繁体   English   中英

子树提取 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()函数返回其中包含的所有子树。 我只想拥有特定的节点。

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

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

我不能说我理解你对parent()抱怨(也许你的意思是subtrees() ?),但有更简单的方法来获得子树:

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

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

     partial = ParentedTree(subtree.parent().label(), [ subtree.copy() ])

    然后您可以自由删除或更改副本中的分支,并且您仍然可以使用原始treesubtree

  3. 尽管您可以使用parent()方法爬上树,但我经常发现使用“树位置”更方便。 树的位置是一个整数元组,它充当树的路径(使用它就像列表上的整数索引)。 要找到父级,您只需要切掉 treeposition 的最后一个元素:

     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

上面的内容可能并没有完全按照您的要求做(很难看出您在做什么),但我希望您能了解情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM