2012-05-21 13 views
9

Quiero hacer un trabajo muy simple: dado una cadena que contiene pronombres, quiero resolverlos.Resolver la correferencia usando Stanford CoreNLP - incapaz de cargar el analizador modelo

por ejemplo, quiero cambiar la frase "María tiene un corderito. Ella es linda". en "María tiene un pequeño cordero. María es linda".

He intentado utilizar Stanford CoreNLP. Sin embargo, parece que no puedo hacer que el analizador comience. He importado todos los archivos jar incluidos en mi proyecto usando Eclipse, y he asignado 3GB a la JVM (-Xmx3g).

El error es muy incómoda:

Exception in thread "main" java.lang.NoSuchMethodError: edu.stanford.nlp.parser.lexparser.LexicalizedParser.loadModel(Ljava/lang/String;[Ljava/lang/String;)Ledu/stanford/nlp/parser/lexparser/LexicalizedParser;

No entiendo donde L que viene, creo que es la raíz de mi problema ... Esto es bastante raro. Intenté ingresar a los archivos fuente, pero no hay referencias erróneas allí.

Código:

import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation; 
import edu.stanford.nlp.dcoref.CorefCoreAnnotations.CorefChainAnnotation; 
import edu.stanford.nlp.dcoref.CorefCoreAnnotations.CorefGraphAnnotation; 
import edu.stanford.nlp.ling.CoreAnnotations.NamedEntityTagAnnotation; 
import edu.stanford.nlp.ling.CoreAnnotations.PartOfSpeechAnnotation; 
import edu.stanford.nlp.ling.CoreAnnotations.SentencesAnnotation; 
import edu.stanford.nlp.ling.CoreAnnotations.TextAnnotation; 
import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation; 
import edu.stanford.nlp.trees.TreeCoreAnnotations.TreeAnnotation; 
import edu.stanford.nlp.ling.CoreLabel; 
import edu.stanford.nlp.dcoref.CorefChain; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.trees.Tree; 
import edu.stanford.nlp.semgraph.SemanticGraph; 
import edu.stanford.nlp.util.CoreMap; 
import edu.stanford.nlp.util.IntTuple; 
import edu.stanford.nlp.util.Pair; 
import edu.stanford.nlp.util.Timing; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import java.util.Properties; 

public class Coref { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException, ClassNotFoundException { 
    // creates a StanfordCoreNLP object, with POS tagging, lemmatization, NER, parsing, and coreference resolution 
    Properties props = new Properties(); 
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

    // read some text in the text variable 
    String text = "Mary has a little lamb. She is very cute."; // Add your text here! 

    // create an empty Annotation just with the given text 
    Annotation document = new Annotation(text); 

    // run all Annotators on this text 
    pipeline.annotate(document); 

    // these are all the sentences in this document 
    // a CoreMap is essentially a Map that uses class objects as keys and has values with custom types 
    List<CoreMap> sentences = document.get(SentencesAnnotation.class); 

    for(CoreMap sentence: sentences) { 
     // traversing the words in the current sentence 
     // a CoreLabel is a CoreMap with additional token-specific methods 
     for (CoreLabel token: sentence.get(TokensAnnotation.class)) { 
     // this is the text of the token 
     String word = token.get(TextAnnotation.class); 
     // this is the POS tag of the token 
     String pos = token.get(PartOfSpeechAnnotation.class); 
     // this is the NER label of the token 
     String ne = token.get(NamedEntityTagAnnotation.class);  
     } 

     // this is the parse tree of the current sentence 
     Tree tree = sentence.get(TreeAnnotation.class); 
     System.out.println(tree); 

     // this is the Stanford dependency graph of the current sentence 
     SemanticGraph dependencies = sentence.get(CollapsedCCProcessedDependenciesAnnotation.class); 
    } 

    // This is the coreference link graph 
    // Each chain stores a set of mentions that link to each other, 
    // along with a method for getting the most representative mention 
    // Both sentence and token offsets start at 1! 
    Map<Integer, CorefChain> graph = 
     document.get(CorefChainAnnotation.class); 
    System.out.println(graph); 
    } 
} 

completo seguimiento de la pila:

Adding annotator tokenize Adding annotator ssplit Adding annotator pos Loading POS Model [edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger] ... Loading default properties from trained tagger edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger Reading POS tagger model from edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger ... done [2.1 sec]. done [2.2 sec]. Adding annotator lemma Adding annotator ner Loading classifier from edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz ... done [4.0 sec]. Loading classifier from edu/stanford/nlp/models/ner/english.muc.distsim.crf.ser.gz ... done [3.0 sec]. Loading classifier from edu/stanford/nlp/models/ner/english.conll.distsim.crf.ser.gz ... done [3.3 sec]. Adding annotator parse Exception in thread "main" java.lang.NoSuchMethodError: edu.stanford.nlp.parser.lexparser.LexicalizedParser.loadModel(Ljava/lang/String;[Ljava/lang/String;)Ledu/stanford/nlp/parser/lexparser/LexicalizedParser; at edu.stanford.nlp.pipeline.ParserAnnotator.loadModel(ParserAnnotator.java:115) at edu.stanford.nlp.pipeline.ParserAnnotator.(ParserAnnotator.java:64) at edu.stanford.nlp.pipeline.StanfordCoreNLP$12.create(StanfordCoreNLP.java:603) at edu.stanford.nlp.pipeline.StanfordCoreNLP$12.create(StanfordCoreNLP.java:585) at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:62) at edu.stanford.nlp.pipeline.StanfordCoreNLP.construct(StanfordCoreNLP.java:329) at edu.stanford.nlp.pipeline.StanfordCoreNLP.(StanfordCoreNLP.java:196) at edu.stanford.nlp.pipeline.StanfordCoreNLP.(StanfordCoreNLP.java:186) at edu.stanford.nlp.pipeline.StanfordCoreNLP.(StanfordCoreNLP.java:178) at Coref.main(Coref.java:41)

+0

Ok, resulta que la L proviene del propio idioma. Entonces, no entiendo lo que está pasando ... – Tex

Respuesta

9

Sí, la L es sólo una cosa extraña de Sun Java 1.0 desde entonces.

es un nuevo método agregado al analizador, que no se encuentra. Sospecho que esto significa que tienes otra versión del analizador en tu classpath que se usa en su lugar.

Prueba esto: en el forro exterior de cualquier IDE, dar a estos comandos (que da el camino a Stanford-corenlp apropiadamente, y cambiando: a; si en Windows:

javac -cp ".:stanford-corenlp-2012-04-09/*" Coref.java 
java -mx3g -cp ".:stanford-corenlp-2012-04-09/*" Coref 

Las cargas del analizador y su código funciona correctamente para mí, solo necesito agregar algunas instrucciones de impresión para que pueda ver lo que ha hecho :-).

+0

Sí, ambos funcionan: eliminar el analizador de mi classpath o intentar que el shell funcione bien. ¡Gracias! – Tex

+0

¿Puede alguien decirme qué versión de StanfordCoreNLP es compatible con este código? Intenté usar la versión 3.2.0 y 1.2.0 pero muestra que CorefCoreAnnotations no está disponible. – user1580096

+0

Actualicé el código para trabajar con la versión v3.2.0 actual del analizador y me tomé la libertad de agregar un par de instrucciones de impresión al mismo tiempo. El cambio necesario fue que el semáforo se sacó del paquete de árboles para ser un descendiente directo de e.s.n. –

Cuestiones relacionadas