[英]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()
?),但有更簡單的方法來獲得子樹:
表面改進: subtrees()
函數接受filter
參數,因此您不必檢查代碼中返回的子樹:
for subtree in tree.subtrees(filter=lambda t: t.label().endswith("=H"))
子樹是對原始樹的子部分的引用。 如果你不修改它,它仍然是原始樹的一部分,你可以提升樹(因為你使用了“parented”樹。)事實上,注意如果你對子樹的內容進行修改,原始樹將被修改。 但是不是將您找到的樹嵌入到新節點下,而是構建一個全新的副本:
partial = ParentedTree(subtree.parent().label(), [ subtree.copy() ])
然后您可以自由刪除或更改副本中的分支,並且您仍然可以使用原始tree
和subtree
。
盡管您可以使用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.