2012-05-21 6 views
9

Ich möchte einen sehr einfachen Job machen: Angesichts einer Zeichenfolge, die Pronomen enthält, möchte ich sie auflösen.Resolve Koreferenz mit Stanford CoreNLP - Parser-Modell kann nicht geladen werden

zum Beispiel möchte ich den Satz "Mary hat ein kleines Lamm. Sie ist süß." in "Mary hat ein kleines Lamm. Mary ist süß.".

Ich habe versucht, Stanford CoreNLP zu verwenden. Allerdings scheint es mir nicht möglich zu sein, den Parser zu starten. Ich habe alle eingeschlossenen Gläser in mein Projekt mit Eclipse importiert, und ich habe 3GB der JVM (-Xmx3g) zugeteilt.

Der Fehler ist sehr umständlich:

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;

Ich verstehe nicht, wo die L herkommt, ich denke, es ist die Wurzel meines Problems ist ... Das ist ziemlich seltsam. Ich habe versucht, in die Quelldateien zu gelangen, aber es gibt dort keine falsche Referenz.

Code:

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

Voll Stack-Trace:

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, stellt sich heraus das L kommt aus der Sprache selbst. Dann versteh ich nicht, was vor sich geht ... – Tex

Antwort

9

Ja, die L ist nur eine bizarre Sun, was jemals seit Java 1.0.

LexicalizedParser.loadModel(String, String ...) ist eine neue, dem Parser hinzugefügte Methode, die nicht gefunden wird. Ich vermute, das bedeutet, dass Sie in Ihrem Klassenpfad eine andere Version des Parsers haben, die stattdessen verwendet wird.

Versuchen Sie folgende: an der Schale außerhalb jeden IDE, diese Befehle geben (geben Sie den Pfad zu dem Stanford-corenlp angemessen und das Ändern: zu, wenn unter Windows:

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

der Parser lädt und Ihren Code läuft für mich korrekt - muss nur ein paar Druckanweisungen hinzufügen, damit Sie sehen können, was es getan hat :-).

+0

Ja, beide funktionieren: Entweder entferne ich den Parser aus meinem Klassenpfad oder versuche die Shell-Arbeit gut zu machen. Vielen Dank! – Tex

+0

Kann mir jemand sagen, welche Version von StanfordCoreNLP mit diesem Code kompatibel ist? Ich habe versucht, Version 3.2.0 und 1.2.0 zu verwenden, aber es zeigt, dass CorefCoreAnnotations nicht verfügbar ist. – user1580096

+0

Ich aktualisierte den Code, um mit der aktuellen v3.2.0 des Parsers zu arbeiten, und nahm mir die Freiheit, ein paar Druckanweisungen gleichzeitig hinzuzufügen. Die notwendige Änderung war nur, dass der Semgraph aus dem Baumpaket herausgezogen wurde, um ein direkter Nachkomme von e.s.n. zu sein. –

Verwandte Themen