子树提取NLTK T

2024-09-27 21:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些关于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)) and this: (VN=H (V=H sait))

为此我编写了一个函数:

^{pr2}$

这里我有两个问题:首先,我想继续向原始树中的子树添加信息。例如,我想继续添加祖先节点,然后再添加子节点,这样做:

(SENT (NP-SUJ↓ ) (VN=H (V=H sait)))

Subtree

但是我失去了原来那棵树的踪迹。。。在

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

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

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


Tags: 函数pos节点npprosentnevn
1条回答
网友
1楼 · 发布于 2024-09-27 21:24:28

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

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

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

    ^{pr2}$

    然后您可以自由地删除或更改副本中的分支,并且您仍然可以使用原始的tree和{}。

  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,而不是{}。

上面的内容可能并不是你想要的那样(很难看清你到底在做什么),但我希望你能理解。在

相关问题 更多 >

    热门问题