2014-09-12 5 views
5

Ich benutze Nltk Tree Struktur, um mit Partree Strings zu arbeiten.NLTK Baum Datenstruktur, einen Knoten zu finden, es ist Eltern oder Kinder

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

Die Datenstruktur scheint jedoch begrenzt zu sein. Ist es möglich, einen Knoten nach seinem String-Wert zu erhalten und dann nach oben oder unten zu navigieren?

Zum Beispiel: Angenommen, Sie den Knoten mit dem String-Wert ‚nett‘ zu bekommen und dann sehen, was seine Eltern, Kinder, etc. Ist es erreichbar über nltk der Baum?

+0

Auch sehen http://stackoverflow.com/questions/16407880/extracting-specific-leaf-value-from-nltk-tree -structure-with-python? rq = 1 – Jesuisme

Antwort

10

Für NLTK 3.0 möchten Sie die ParentedTree-Unterklasse verwenden.

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

Mit dem Probebaum Sie gegeben haben, erstellen Sie eine ParentedTree und die Suche nach dem Knoten Sie wollen:

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] 

Sie können durch den Baum iterieren direkt dem Kind Unterbäume zu erhalten. Die Methode parent() wird verwendet, um den übergeordneten Baum für den angegebenen Teilbaum zu finden.

Hier ist ein Beispiel, einen tieferen Baum für ein Kind mit und Eltern:

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

Zusätzlich: Eine "Tree-Position" ist ein Tupel, das einen Pfad im Baum beschreibt. Wenn Sie also den Pfad zu einem Knoten haben, z. B. "tree_location" wie in der Antwort, befindet sich das übergeordnete Element in "tree_location [: - 1]". Dies funktioniert sowohl für "Tree" als auch für "ParentedTree". – alexis