簡體   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