2016-06-16 2 views
2

NLTK 나무에 약간의 도움이 필요합니다. 나는이 프랑스어 나무에서 일부 하위 트리를 추출하기 위해 노력하고하위 트리 추출 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

하지만 ...

둘째를 원래 나무의 트랙을 잃었 : 예를 들어, 나는 이런 식으로 뭔가를, 조상 노드 다음 아이를 계속 추가 할 parent() 함수는 그 안에 들어있는 모든 하위 트리를 반환합니다. 그리고 난 단지 특정 노드를 갖고 싶습니다.

이 마지막 서브 트리를 추출하는 좋은 방법은 무엇입니까 ???

도움 주셔서 감사합니다. 나는 이것에 초보 다. 그러나 나는 그것을 정말로 좋아한다! (? 아마 당신이 subtrees()을 의미)

답변

3

나는 불만에 대한 parent() 이해 말할 수는 없지만, 하위 트리에 손을 얻을 수있는 쉬운 방법이 있습니다 :

  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() 방법을 사용하여 트리를 기어 올라가더라도 "트리 위치"를 사용하는 것이 더 편리 할 수 ​​있습니다. 트리 위치는 트리의 아래쪽 경로로 기능하는 정수의 튜플입니다 (목록에서 정수 인덱스처럼 사용).이 방법을 사용하는 경우

    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를 사용할 수 있습니다 : 부모를 찾으려면, 당신은 단지 treeposition의 마지막 요소를 슬라이스 할 필요가 , 아니 ParentedTree.

위의 내용은 당신이 원했던 것 (정확하게 당신이하는 일을보기가 어렵습니다)이지만 사진을 찍기를 바랍니다.

+0

대단히 감사합니다! 이것은 내가 찾고 있었던 정확하게 것이다. 그러나 나는 그것을하는 법을 모른다. – Jonathan

+0

다행입니다. 내 대답이 문제를 해결 했으므로 왼쪽의 큰 체크 표시를 클릭하여 "동의"하십시오. (또한이 사이트에서 유용한 질문이나 답변을 "upvote"할 수 있습니다.) – alexis