2014-09-12 31 views
5

Używam struktury danych drzewa Nltk do pracy z ciągami znaków paraseree.Struktura danych drzewa NLTK, znajdowanie węzła, jego rodzica lub dzieci

from nltk.tree import Tree 
parsed = Tree('(ROOT (S (NP (PRP It)) (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))') 

Struktura danych wydaje się jednak ograniczona. Czy można uzyskać węzeł według jego wartości łańcuchowej, a następnie przejść do góry lub na dół?

Załóżmy na przykład, że chcesz uzyskać węzeł o wartości ciągu "ładny", a następnie zobaczyć, co jest jego rodzicem, dziećmi itd. Czy można to osiągnąć za pomocą drzewa Nltk?

+0

również zobaczyć http://stackoverflow.com/questions/16407880/extracting-specific-leaf-value-from-nltk-tree -structure-with-python? rq = 1 – Jesuisme

Odpowiedz

10

Dla wersji NLTK 3.0, chcesz użyć podklasy ParentedTree.

http://www.nltk.org/api/nltk.html#nltk.tree.ParentedTree

Korzystanie drzewo próbki już podane, należy utworzyć ParentedTree i szukać węzła chcesz:

from nltk.tree import ParentedTree 
ptree = ParentedTree.fromstring('(ROOT (S (NP (PRP It)) \ 
     (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))') 

leaf_values = ptree.leaves() 

if 'nice' in leaf_values: 
    leaf_index = leaf_values.index('nice') 
    tree_location = ptree.leaf_treeposition(leaf_index) 
    print tree_location 
    print ptree[tree_location] 

Można iterację drzewa bezpośrednio uzyskać poddrzewa potomnych. Metoda parent() służy do znajdowania drzewa nadrzędnego dla danego poddrzewa.

Oto przykład przy użyciu głębszy drzewo dla dziecka i rodzica:

from nltk.tree import ParentedTree 
ptree = ParentedTree.fromstring('(ROOT (S (NP (JJ Congressional) \ 
    (NNS representatives)) (VP (VBP are) (VP (VBN motivated) \ 
    (PP (IN by) (NP (NP (ADJ shiny) (NNS money))))))) (. .))') 

def traverse(t): 
    try: 
     t.label() 
    except AttributeError: 
     return 
    else: 

     if t.height() == 2: #child nodes 
      print t.parent() 
      return 

     for child in t: 
      traverse(child) 

traverse(ptree) 
+0

Dodatkowo: "Pozycja drzewa" to krotka, opisująca ścieżkę w dół drzewa. Więc jeśli masz ścieżkę do węzła, np. 'Tree_location' jak w odpowiedzi, jej rodzic będzie na' tree_location [: - 1] '. Działa to zarówno dla 'Tree' i' ParentedTree'. – alexis