2011-07-04 6 views
13

Tengo algunos problemas para comprender los cambios realizados en el solucionador de núcleo en la última versión de las herramientas de Stanford NLP. A modo de ejemplo, a continuación es una frase y la correspondiente CorefChainAnnotation:Stanford Core NLP: comprensión de la resolución de correferencia

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

No estoy seguro de entender el significado de estos números. Ver la fuente tampoco ayuda mucho.

Gracias

Respuesta

7

El primer número es un identificador de grupo (en representación de fichas, que representan la misma entidad), ver el código fuente de SieveCoreferenceSystem#coref(Document). Los números pares son outout de CorefChain # toString():

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

donde la posición es un conjunto de pares de Postion entidad mencionan (para conseguir que utilizan CorefChain.getCorefMentions()). Aquí está un ejemplo de un código completo (en groovy), que muestra cómo llegar desde posiciones de fichas:

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) + "|"; 
      }   
     } 
    } 
} 

de salida (no entiendo donde 's' proviene de):

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. No creo que las configuraciones predeterminadas (modelos) funcionen para su dominio. El stanford core nlp parece ser más adecuado para extraer semántica de noticias, artículos, etc. Por ejemplo, Stanford NER, parte de la PNL básica, recibió capacitación y testículos en cornamentas CoNLL 2002 y 2003. – Skarab

+0

Este algoritmo es parcialmente útil y me llevó al algoritmo correcto, pero el resultado aquí no es el correcto para la oración, no hay "él" en la oración o "s" y "eso" solo se asigna a sí mismo, lo que derrota el punto de la resolución de correferencia. – user1084563

+0

Creo que considera el 'startIndex' y' endIndex' como si fueran índices de caracteres (basados ​​en 0), pero son índices de token (basados ​​en 1). Además, no definiste 'aText'. Suponiendo que se refiera al texto de la anotación, en lugar de "él" (caracteres 1 y 2) debería tener "El átomo" (palabras 1 y 2), etc. –

16

He estado trabajando con el gráfico de dependencia de correferencia y comencé utilizando la otra respuesta a esta pregunta. Después de un tiempo, me di cuenta de que este algoritmo anterior no es exactamente correcto. La salida que produjo ni siquiera está cerca de la versión modificada que tengo.

Para cualquier otra persona que use este artículo, aquí está el algoritmo que terminé con el que también filtra las referencias automáticas porque cada RepresentanteMención también se menciona a sí mismo y muchas menciones solo se refieren a sí mismas.

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); 
    } 
} 

Y el resultado final de su oración de ejemplo es el siguiente:

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

Por lo general, "el átomo" termina siendo la mención representativa, pero en el caso de que no lo hace sorprendentemente. Otro ejemplo con un resultado ligeramente más preciso es para la siguiente oración:

La Guerra Revolucionaria ocurrió durante la década de 1700 y fue la primera guerra en los Estados Unidos.

produce el siguiente resultado:

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

Estos son los resultados recientes de la anotador.

  1. [1, 1] 1 El átomo de
  2. [1, 2] 1 una unidad básica de materia
  3. [1, 3] 1 IT
  4. [1, 6] 6 electrones cargados negativamente
  5. [1, 5] 5 una nube de electrones cargados negativamente

Las marcas son como sigue:

[Sentence number,'id'] Cluster_no Text_Associated 

El texto que pertenece al mismo clúster se refiere al mismo contexto.