2013-02-12 12 views
19

Mam pakietowego zdanie używając:Jak nawigować w pliku nltk.tree.Tree?

grammar = '''                            
    NP:                              
     {<DT>*(<NN.*>|<JJ.*>)*<NN.*>}                      
    NVN:                             
     {<NP><VB.*><NP>}                          
    ''' 
chunker = nltk.chunk.RegexpParser(grammar) 
tree = chunker.parse(tagged) 
print tree 

Rezultat wygląda następująco:

(S 
    (NVN 
    (NP The_Pigs/NNS) 
    are/VBP 
    (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN)) 
    that/WDT 
    formed/VBN 
    in/IN 
    1977/CD 
    ./.) 

Ale teraz utknąłem próbuje dowiedzieć się, jak poruszać się, że. Chcę móc znaleźć poddrzewo NVN i uzyskać dostęp do lewostronnej frazy rzeczownikowej ("The_Pigs"), czasownika ("are") i prawej frazy rzeczownikowej ("zespół punkrockowy z siedzibą w Bristolu") . Jak mogę to zrobić?

+0

można zamieścić pełną gramatyki z węzłów liściowych, to mogę dać wyraźny przykład? – alvas

Odpowiedz

4

Spróbuj:

for a in tree: 
     if type(a) is nltk.Tree: 
      if a.node == 'NVN': # This climbs into your NVN tree 
       for b in a: 
        if type(b) is nltk.Tree and b.node == 'NP': 
         print b.leaves() # This outputs your "NP" 
        else: 
         print b # This outputs your "VB.*" 

to wysyła to:

[('The_Pigs', 'NNS')]

('to', 'VBP')

[("a", "DT"), ("Bristol-based", "JJ"), ("punk", "NN"), ("rock", "NN"), ("pasmo", "NN ')]

8

Można oczywiście napisać własne d epth pierwsze wyszukiwanie ... ale jest łatwiejszy (lepszy) sposób. Jeśli chcesz, aby każde poddrzewo ukorzenione w NVM, użyj metody poddrzewa drzewa z określonym parametrem filtru.

>>> print t 
(S 
    (NVN 
     (NP The_Pigs/NNS) 
     are/VBP 
     (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN)) 
    that/WDT 
    formed/VBN 
    in/IN 
    1977/CD 
    ./.) 
>>> for i in t.subtrees(filter=lambda x: x.node == 'NVN'): 
...  print i 
... 
(NVN 
    (NP The_Pigs/NNS) 
    are/VBP 
    (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN)) 
+2

z Pythonem 3.5 i NLTK 3.2.2, funkcja lambda powinna używać właściwości label() węzła: filter = lambda x: x.label() == "NP" – Maciej

14

Spróbuj:

ROOT = 'ROOT' 
tree = ... 
def getNodes(parent): 
    for node in parent: 
     if type(node) is nltk.Tree: 
      if node.label() == ROOT: 
       print "======== Sentence =========" 
       print "Sentence:", " ".join(node.leaves()) 
      else: 
       print "Label:", node.label() 
       print "Leaves:", node.leaves() 

      getNodes(node) 
     else: 
      print "Word:", node 

getNodes(tree) 
+0

Kolejny przykład DFS (z 'ParentedTree'): http : //stackoverflow.com/a/25972853/4115369 –

+0

Tak, dziękuję. Bądź świadomy, że interfejs NLTK może zmieniać nadgodziny. – danger89

3

oto przykładowy kod do generowania wszystkie poddrzewa z etykietą „NP”

def filt(x): 
    return x.label()=='NP' 

for subtree in t.subtrees(filter = filt): # Generate all subtrees 
    print subtree 

dla rodzeństwa, może chcesz przyjrzeć się metodzie ParentedTree.left_siblings()

po więcej szczegółów, oto kilka przydatnych linków.

http://www.nltk.org/howto/tree.html #some podstawowe wykorzystanie i przykładem http://nbviewer.ipython.org/github/gmonce/nltk_parsing/blob/master/1.%20NLTK%20Syntax%20Trees.ipynb #A notebook playwith tych metod

http://www.nltk.org/_modules/nltk/tree.html #all api ze źródła

Powiązane problemy