2011-07-04 7 views
13

Tôi đang gặp một số khó khăn khi hiểu các thay đổi được thực hiện đối với trình giải quyết lõi trong phiên bản cuối của công cụ NLP của Stanford. Như một ví dụ, dưới đây là một câu và CorefChainAnnotation tương ứng:Stanford Core NLP - hiểu về độ phân giải lõi

The atom is a basic unit of matter, it consists of a dense central nucleus surrounded by a cloud of negatively charged electrons. 

{1=[1 1, 1 2], 5=[1 3], 7=[1 4], 9=[1 5]} 

Tôi không chắc là tôi hiểu ý nghĩa của những con số này. Nhìn vào nguồn cũng không thực sự hữu ích.

Cảm ơn bạn

Trả lời

7

Con số đầu tiên là một id cụm (đại diện cho thẻ, trong đó đại diện cho cùng một thực thể), xem mã nguồn của SieveCoreferenceSystem#coref(Document). Những con số cặp là outout của CorefChain # toString():

public String toString(){ 
    return position.toString(); 
} 

nơi vị trí là một tập hợp các cặp vị thế của tổ chức nhắc đến (để có được chúng sử dụng CorefChain.getCorefMentions()). Dưới đây là một ví dụ về một mã hoàn chỉnh (trong groovy), trong đó cho thấy làm thế nào để có được từ các vị trí để tokens:

class Example { 
    public static void main(String[] args) { 
     Properties props = new Properties(); 
     props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
     props.put("dcoref.score", true); 
     pipeline = new StanfordCoreNLP(props); 
     Annotation document = new Annotation("The atom is a basic unit of matter, it consists of a dense central nucleus surrounded by a cloud of negatively charged electrons."); 

     pipeline.annotate(document); 
     Map<Integer, CorefChain> graph = document.get(CorefChainAnnotation.class); 

     println aText 

     for(Map.Entry<Integer, CorefChain> entry : graph) { 
      CorefChain c = entry.getValue();     
      println "ClusterId: " + entry.getKey(); 
      CorefMention cm = c.getRepresentativeMention(); 
      println "Representative Mention: " + aText.subSequence(cm.startIndex, cm.endIndex); 

      List<CorefMention> cms = c.getCorefMentions(); 
      println "Mentions: "; 
      cms.each { it -> 
       print aText.subSequence(it.startIndex, it.endIndex) + "|"; 
      }   
     } 
    } 
} 

Output (Tôi không hiểu nơi 's' có nguồn gốc từ):

The atom is a basic unit of matter, it consists of a dense central nucleus surrounded by a cloud of negatively charged electrons. 
ClusterId: 1 
Representative Mention: he 
Mentions: he|atom |s| 
ClusterId: 6 
Representative Mention: basic unit 
Mentions: basic unit | 
ClusterId: 8 
Representative Mention: unit 
Mentions: unit | 
ClusterId: 10 
Representative Mention: it 
Mentions: it | 
+0

ps. Tôi không nghĩ rằng các thiết lập mặc định (mô hình) sẽ hoạt động cho miền của bạn. Các nlp lõi stanford có vẻ phù hợp hơn để trích xuất ngữ nghĩa từ tin tức, bài viết, v.v. Ví dụ, Stanford NER - một phần của NLP cốt lõi - được đào tạo và thử nghiệm trên các tập hợp dữ liệu CoNLL 2002 và 2003. – Skarab

+0

Thuật toán này hữu ích một phần và dẫn tôi đến đúng thuật toán, nhưng đầu ra ở đây không đúng cho câu, không có "anh ta" trong câu hoặc "s" và "nó" chỉ được ánh xạ với chính nó mà thất bại điểm của giải pháp lõi. – user1084563

+0

Tôi nghĩ bạn đã xem 'startIndex' và' endIndex' như thể chúng là các chỉ số ký tự (dựa trên 0), nhưng chúng là các chỉ mục mã thông báo (dựa trên 1). Ngoài ra, bạn không xác định 'aText'. Giả sử bạn có nghĩa là văn bản trong chú thích, thay vì "anh" (ký tự 1 và 2), bạn nên có "Nguyên tử" (từ 1 và 2), v.v. –

16

Tôi đã làm việc với đồ thị phụ thuộc cốt lõi và tôi bắt đầu bằng cách sử dụng câu trả lời khác cho câu hỏi này. Sau một thời gian mặc dù tôi nhận ra rằng thuật toán này ở trên không chính xác. Đầu ra mà nó tạo ra thậm chí không gần với phiên bản sửa đổi mà tôi có.

Đối với bất kỳ ai sử dụng bài viết này, đây là thuật toán tôi đã kết thúc cũng sẽ lọc ra các tham chiếu tự vì mỗi người đại diện cũng đề cập đến chính nó và rất nhiều đề cập chỉ tham chiếu.

Map<Integer, CorefChain> coref = document.get(CorefChainAnnotation.class); 

for(Map.Entry<Integer, CorefChain> entry : coref.entrySet()) { 
    CorefChain c = entry.getValue(); 

    //this is because it prints out a lot of self references which aren't that useful 
    if(c.getCorefMentions().size() <= 1) 
     continue; 

    CorefMention cm = c.getRepresentativeMention(); 
    String clust = ""; 
    List<CoreLabel> tks = document.get(SentencesAnnotation.class).get(cm.sentNum-1).get(TokensAnnotation.class); 
    for(int i = cm.startIndex-1; i < cm.endIndex-1; i++) 
     clust += tks.get(i).get(TextAnnotation.class) + " "; 
    clust = clust.trim(); 
    System.out.println("representative mention: \"" + clust + "\" is mentioned by:"); 

    for(CorefMention m : c.getCorefMentions()){ 
     String clust2 = ""; 
     tks = document.get(SentencesAnnotation.class).get(m.sentNum-1).get(TokensAnnotation.class); 
     for(int i = m.startIndex-1; i < m.endIndex-1; i++) 
      clust2 += tks.get(i).get(TextAnnotation.class) + " "; 
     clust2 = clust2.trim(); 
     //don't need the self mention 
     if(clust.equals(clust2)) 
      continue; 

     System.out.println("\t" + clust2); 
    } 
} 

Và kết quả cuối cùng cho câu ví dụ của bạn là như sau:

representative mention: "a basic unit of matter" is mentioned by: 
The atom 
it 

thường "nguyên tử" kết thúc lên được đề cập đến đại diện nhưng trong trường hợp nó không đáng ngạc nhiên. Một ví dụ khác với đầu ra chính xác hơn một chút là cho câu sau:

Cuộc chiến tranh cách mạng xảy ra trong những năm 1700 và đó là cuộc chiến tranh đầu tiên tại Hoa Kỳ.

xuất ra như sau:

representative mention: "The Revolutionary War" is mentioned by: 
it 
the first war in the United States 
0

Đây là những kết quả gần đây từ chú giải.

  1. [1, 1] 1 Các nguyên tử
  2. [1, 2] 1 một đơn vị cơ bản của vật chất
  3. [1, 3] 1 nó
  4. [1, 6] 6 electron tích điện âm
  5. [1, 5] 5 một đám mây electron tích điện âm

các dấu hiệu như sau:

[Sentence number,'id'] Cluster_no Text_Associated 

Văn bản thuộc cùng một cụm đề cập đến cùng một ngữ cảnh.