2014-09-12 22 views
5

Tôi đang sử dụng cấu trúc dữ liệu cây của nltk để làm việc với các chuỗi phân tích cú pháp.Cấu trúc dữ liệu cây NLTK, tìm một nút, đó là cha mẹ hoặc con cái

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

Cấu trúc dữ liệu, tuy nhiên, dường như bị giới hạn. Có thể nhận một nút bằng giá trị chuỗi của nó và sau đó điều hướng đến trên cùng hoặc dưới cùng? Ví dụ: giả sử bạn muốn lấy nút có giá trị chuỗi 'nice' và sau đó xem cha mẹ, con cái của nó, v.v.

+0

Ngoài ra, xem http://stackoverflow.com/questions/16407880/extracting-specific-leaf-value-from-nltk-tree -structure-with-python? rq = 1 – Jesuisme

Trả lời

10

Đối với NLTK 3.0, bạn muốn sử dụng lớp con ParentedTree.

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

Sử dụng cây mẫu mà bạn đã đưa ra, tạo ra một ParentedTree và tìm kiếm các nút bạn muốn:

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] 

Bạn có thể lặp qua cây trực tiếp để có được những subtrees đứa trẻ. Phương thức parent() được sử dụng để tìm cây cha cho cây con đã cho.

Dưới đây là một ví dụ sử dụng một cây sâu hơn cho trẻ em và cha mẹ:

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

Ngoài ra: "Vị trí cây" là một tuple, mô tả một con đường xuống cây. Vì vậy, nếu bạn có đường dẫn đến một nút, ví dụ: 'tree_location' như trong câu trả lời, cha mẹ của nó sẽ nằm ở' tree_location [: - 1] '. Điều này làm việc cho cả hai 'Tree' và' ParentedTree'. – alexis

Các vấn đề liên quan