tutorial the stanford spanish online natural language corenlp java nlp stanford-nlp

java - the - Stanford Core NLP-comprensión de la resolución de la correferencia



stanford nlp github (3)

El primer número es un ID de clúster (que representa tokens, que representan la misma entidad), vea el código fuente de SieveCoreferenceSystem#coref(Document) . Los números de par están fuera de CorefChain # toString ():

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

donde posición es un conjunto de pares de posiciones de entidad mencionada (para hacer que usen CorefChain.getCorefMentions() ). Aquí hay un ejemplo de un código completo (en groovy ), que muestra cómo pasar de posiciones a 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) + "|"; } } } }

Salida (no entiendo de dónde viene ''s''):

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 |

Tengo problemas para comprender los cambios realizados en el solucionador de núcleos en la última versión de las herramientas de Stanford NLP. Como ejemplo, a continuación se encuentra una oración y la CorefChainAnnotation correspondiente:

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


He estado trabajando con el gráfico de dependencia de correferencia y comencé usando 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 con el que terminé, 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 no sorprende. Otro ejemplo con un resultado ligeramente más preciso es para la siguiente oración:

La Guerra Revolucionaria se produjo 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


Estos son los resultados recientes del anotador.

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

Las marcas son las siguientes:

[Sentence number,''id''] Cluster_no Text_Associated

El texto que pertenece al mismo grupo se refiere al mismo contexto.