python - 子树提取NLTK树

标签 python nltk subtree

我需要一些有关 NLTK 树的帮助。

我正在尝试从这棵法国树中提取一些子树:

Original Tree

(SENT (NP-SUJ↓ (PRO=H Personne)) (VN=H (ADV* ne) (V=H sait)) (ADV* exactement) (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)))

Subtree

但是我忘记了原来的树...

其次,parent()函数返回其中包含的所有子树。我只想拥有特定的节点。

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

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

最佳答案

我不能说我理解您对 parent() 的提示(也许您的意思是 subtrees()?),但是有更简单的方法可以让您上手子树:

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

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

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

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

  3. 虽然您可以使用 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 .

上面的内容可能并没有完全达到您想要的效果(很难看出您到底在做什么),但我希望您能明白。

关于python - 子树提取NLTK树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37862845/

相关文章:

python - 在没有循环的情况下在 python 中返回列表索引的优雅方法是什么?

python - 使用 matplotlib 自定义小部件在 pyqt4 中嵌入 matplotlib 工具栏

python - 人名的拼写更正 (Python)

python - 在 Python 中,有没有一种方法可以在不保留先前词汇的情况下识别文本中的城市?

python - 我应该使用哪些模块来创建游戏树?

python - 如何将 Pandas 数据帧系列中的连续重复值更改为 nan 或 0?

python - 如何分批训练 NLTK PunktSentenceTokenizer?

git - 在上游项目强制推送到 master 后,如何修复 git 子树?

Java XPath API - 获取表示子树的字符串

git - 使用子树 merge 策略,历史不 merge