2016-06-16 78 views
2

我需要NLTK樹的一些幫助。Subtree Extraction 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))

而且我寫了一個函數來進行:

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

但我記不清原來的樹...

二,函數返回其中包含的所有子樹。我只想擁有特定的節點。

什麼是提取最後一個子樹的好方法?

非常感謝您的幫助!我是新來的,但我真的很喜歡它!

回答

3

我不能說我明白你的投訴約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() ]) 
    

    然後你就可以隨意刪除或拷貝改變分支,你仍然有原來的treesubtree到與...合作。

  3. 雖然您可以使用parent()方法爬上樹,但我經常發現使用「樹位置」更方便。樹的位置是一個整數的元組,它用作樹下的路徑(在列表中使用它作爲一個整數索引)。尋父,你只需要切下的treeposition的最後一個元素:

    for postn in tree.treepositions(): 
        if tree.label().endswith("=H"): 
         parentpos = postn[:-1] # everything but the last element 
         partial = Tree(tree[parentpos].label(), [ tree[postn] ]) 
    

    請注意,如果你使用這種方法,你不需要parent()方法了,所以你還不如用Tree ,而不是ParentedTree

以上可能並不完全是你想要的(這很難看出你在做什麼),但我希望你能得到這張照片。

+0

非常感謝!這正是我所尋找的,但我不知道如何去做。 – Jonathan

+0

很高興聽到它。由於我的答案解決了您的問題,請點擊左邊的大複選標記以「接受」它。 (您也可以在本網站上「回覆」任何您認爲有用的問題或回答。) – alexis