2013-02-12 25 views
19

Tôi đã chửi rủa một câu sử dụng:Cách điều hướng một nltk.tree.Tree?

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

Kết quả trông giống như:

(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 
    ./.) 

Nhưng bây giờ tôi đang mắc kẹt cố gắng tìm ra cách di chuyển đó. Tôi muốn có thể tìm thấy cây con NVN, và truy cập cụm từ danh từ bên trái ("The_Pigs"), động từ ("là") và cụm từ danh từ bên phải ("một ban nhạc rock punk ở Bristol") . Làm thế nào để làm điều đó?

+0

bạn có thể gửi toàn bộ ngữ pháp với các nút lá, sau đó tôi có thể cung cấp cho bạn một rõ ràng thí dụ? – alvas

Trả lời

4

Hãy thử điều này:

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.*" 

Nó ra này:

[('The_Pigs', 'NNS')]

('là', 'VBP')

[('a', 'DT'), ('Bristol', 'JJ'), ('punk', 'NN'), ('rock', 'NN'), ('band', 'NN ')]

8

Tất nhiên, bạn có thể tự viết d epth tìm kiếm đầu tiên ... nhưng có một cách dễ dàng hơn (tốt hơn). Nếu bạn muốn mọi cây con bắt nguồn từ NVM, hãy sử dụng phương thức subtree của Tree với tham số bộ lọc được xác định.

>>> 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

với Python 3.5 và NLTK 3.2.2, hàm lambda nên sử dụng thuộc tính label() của nút: filter = lambda x: x.label() == "NP" – Maciej

14

Hãy thử:

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

Ví dụ DFS khác (với 'ParentedTree'): http : //stackoverflow.com/a/25972853/4115369 –

+0

Yea cảm ơn. Lưu ý rằng giao diện của NLTK có thể thay đổi theo thời gian. – danger89

3

đây là một mẫu mã để tạo ra tất cả các subtrees với một nhãn 'NP'

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

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

cho anh chị em, bạn có thể muốn xem xét phương pháp ParentedTree.left_siblings()

để biết thêm chi tiết, dưới đây là một số liên kết hữu ích.

http://www.nltk.org/howto/tree.html #some sử dụng cơ bản và ví dụ http://nbviewer.ipython.org/github/gmonce/nltk_parsing/blob/master/1.%20NLTK%20Syntax%20Trees.ipynb #A máy tính xách tay playwith những phương pháp

http://www.nltk.org/_modules/nltk/tree.html #all api với nguồn