2013-10-17 41 views
8

Tôi sẽ sử dụng Stanford Corenlp 2013 để tìm người đứng đầu cụm từ. Tôi đã thấy this thread.Sử dụng Stanford Parser (CoreNLP) để tìm người đứng đầu cụm từ

Nhưng, câu trả lời không rõ ràng đối với tôi và tôi không thể thêm bất kỳ nhận xét nào để tiếp tục chuỗi đó. Vì vậy, tôi xin lỗi vì trùng lặp.

Những gì tôi có tại thời điểm này là cây phân tích cú pháp của câu (sử dụng Stanford Corenlp) (Tôi cũng đã thử định dạng CONLL được tạo bởi Stanford Corenlp). Và những gì tôi cần là chính xác người đứng đầu cụm từ danh từ.

Tôi không biết làm thế nào tôi có thể sử dụng phụ thuộc và cây phân tích cú pháp để trích xuất người đứng đầu các cụm từ. Điều tôi biết là nếu tôi có nsubj (x, y), y là người đứng đầu chủ đề. Nếu tôi có dobj(x,y), y là đầu của đối tượng trực tiếp. f Tôi có iobj(x,y), y là đầu của đối tượng gián tiếp.

Tuy nhiên, tôi không chắc liệu đây có phải là cách chính xác để tìm tất cả người đứng đầu cụm từ hay không. Nếu nó là, mà quy tắc tôi nên thêm để có được tất cả các đầu của cụm từ danh từ?

Có thể nói rằng tôi cần người đứng đầu cụm từ danh từ trong mã java.

Trả lời

4

Bạn có thể trích xuất cụm từ quan tâm sao cho nó là đối tượng của lớp Tree Bạn có thể sử dụng phương thức determineHead(Tree t) từ bất kỳ lớp nào triển khai giao diện HeadFinder.

7

Vì tôi không thể nhận xét về câu trả lời được đưa ra bởi Chaitanya, bổ sung thêm câu trả lời của mình ở đây.

Stanford CoreNLP suite có thực hiện Collins chẩn đoán cụ tìm đầu và để phân tích công cụ tìm đầu ngữ nghĩa theo hình thức

  1. CollinsHeadFinder
  2. ModCollinsHeadFinder
  3. SemanticHeadFinder

Tất cả bạn cần là khởi tạo một trong ba và thực hiện các thao tác sau.

Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class); 
headFinder.determineHead(tree).pennPrint(out); 

Bạn có thể lặp qua các nút của cây và xác định từ đầu bất cứ khi nào bắt buộc.

PS: Câu trả lời của tôi được dựa trên bộ StanfordCoreNLP phát hành như của 20140104.

Đây là một dfs đơn giản cho phép bạn trích xuất từ ​​đầu cho tất cả các cụm danh từ trong một câu

public static void dfs(Tree node, Tree parent, HeadFinder headFinder) { 
     if (node == null || node.isLeaf()) { 
     return; 
     } 
     //if node is a NP - Get the terminal nodes to get the words in the NP  
     if(node.value().equals("NP")) { 

     System.out.println(" Noun Phrase is "); 
     List<Tree> leaves = node.getLeaves(); 

     for(Tree leaf : leaves) { 
      System.out.print(leaf.toString()+" "); 

     } 
     System.out.println(); 

     System.out.println(" Head string is "); 
     System.out.println(node.headTerminal(headFinder, parent)); 

    } 

    for(Tree child : node.children()) { 
     dfs(child, node, headFinder); 
    } 

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