2014-05-06 11 views
5

Sto lavorando all'analisi del sentiment usando la libreria nlp di stanford sentiment con java. Ma quando eseguo il codice sto ricevendo l'errore. Non riesco a capirlo.Errore durante l'integrazione dell'analisi del sentiment stanford con java

Il mio codice è il seguente:

package com.nlp; 

import java.util.Properties; 
import edu.stanford.nlp.ling.CoreAnnotations; 
import edu.stanford.nlp.pipeline.Annotation; 
import edu.stanford.nlp.pipeline.StanfordCoreNLP; 
import edu.stanford.nlp.rnn.RNNCoreAnnotations; 
import edu.stanford.nlp.sentiment.SentimentCoreAnnotations; 
import edu.stanford.nlp.trees.Tree; 
import edu.stanford.nlp.util.CoreMap; 

public class SemanticAnalysis { 
    public static void main(String args[]) { 
     sentimentAnalysis sentiment = new sentimentAnalysis(); 
     sentiment.findSentiment("france is a good city"); 
    } 
} 

class sentimentAnalysis { 
    public String findSentiment(String line) { 

     Properties props = new Properties(); 
     props.setProperty("annotators", "tokenize, ssplit, parse, sentiment"); 
     StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
     int mainSentiment = 0; 
     if (line != null && line.length() > 0) { 
      int longest = 0; 
      Annotation annotation = pipeline.process(line); 
      for (CoreMap sentence :annotation.get(CoreAnnotations.SentencesAnnotation.class)) { 
       Tree tree = sentence.get(SentimentCoreAnnotations.AnnotatedTree.class); 
       int sentiment = RNNCoreAnnotations.getPredictedClass(tree); 
       String partText = sentence.toString(); 
       if (partText.length() > longest) { 
        mainSentiment = sentiment; 
        longest = partText.length(); 
       } 
      } 
     } 
     if (mainSentiment == 2 || mainSentiment > 4 || mainSentiment < 0) { 
      return null; 
     } 
     return ""; 
    } 
} 

Ma quando sto facendo funzionare il codice sto ottenendo il seguente errore.

Exception in thread "main" java.lang.NoClassDefFoundError: org/ejml/simple/SimpleBase 
at edu.stanford.nlp.pipeline.SentimentAnnotator.<init>(SentimentAnnotator.java:45) 
at edu.stanford.nlp.pipeline.StanfordCoreNLP$14.create(StanfordCoreNLP.java:845) 
at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:81) 
+2

Forse si aggiungono tutte le librerie nel tuo classpath conteneva? – markusw

risposta

4

Ti manca l'ejml-0.23.jar, aggiungerlo al percorso di classe e dovrebbe funzionare.

+0

La versione è la chiave qui. Se si tenta di utilizzare una versione troppo nuova (a partire dalla scrittura 0.29 è la più recente), si finisce con un nuovo ciclo di messaggi ClassNotFoundException. – demongolem

+0

grazie mi ha aiutato molto – user1

4

Ti manca il riferimento a Efficient Java Matrix Library (EJML) nel tuo classpath.

BTW. Prova a suddividere il tuo codice in metodi di attività singoli più piccoli per ottenere un codice più chiaro.

class SentimentAnalysis { 

    public String findSentiment(String line) { 

     if(line == null || line.isEmpty()) { 
      throw new IllegalArgumentException("The line must not be null or empty."); 
     } 

     Annotation annotation = processLine(line); 

     int mainSentiment = findMainSentiment(annotation); 

     if(mainSentiment < 0 || mainSentiment == 2 || mainSentiment > 4) { //You should avoid magic numbers like 2 or 4 try to create a constant that will provide a description why 2 
      return null; //You shold avoid null returns 
     } 

     return ""; 

    } 


    private int findMainSentiment(Annotation annotation) { 

     int mainSentiment = Integer.MIN_VALUE; 
     int longest = Integer.MIN_VALUE; 


     for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) { 

      int sentenceLength = String.valueOf(sentence).length(); 

      if(sentenceLength > longest) { 

      Tree tree = sentence.get(SentimentCoreAnnotations.AnnotatedTree.class); 

      mainSentiment = RNNCoreAnnotations.getPredictedClass(tree); 

      longest = sentenceLength ; 

      } 
     } 

     return mainSentiment; 

    } 


    private Annotation processLine(String line) { 

     StanfordCoreNLP pipeline = createPieline(); 

     return pipeline.process(line); 

    } 

    private StanfordCoreNLP createPieline() { 

     Properties props = createPipelineProperties(); 

     StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

     return pipeline; 

    } 

    private Properties createPipelieProperties() { 

     Properties props = new Properties(); 
     props.setProperty("annotators", "tokenize, ssplit, parse, sentiment"); 

     return props; 

    } 


} 
-1

Stavo ottenendo lo stesso errore e ho aggiunto tutti i file jar e il codice è stato eseguito. Poi ho scoperto rimuovendo un file jar e eseguendo il codice e la risposta è stata aggiungere i seguenti file.

Immagine enter image description here