使用stanford core nlp时出错

时间:2016-04-12 04:24:26

标签: stanford-nlp sentiment-analysis

我在使用stanford nlp时遇到了问题。我在尝试使用斯坦福核心NLP工具时遇到各种错误的问题。我想知道通过的句子的情绪。但是当我从eclipse运行代码时,我已经无法使用nlp工具了,并且需要将类似的jar添加到类路径中,

这是我想要执行的代码。

import java.util.Properties;

import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.SentimentAnnotator;
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;
import edu.stanford.nlp.util.TypesafeMap.Key;

public class sentiment_demo {

    public static void sentiment_analysis(String line)
    {
        //Uses Stanford NLP sentimnet analysis
        //found in latest model released from stanford
        // ver 3.3.1
        //applies sentiment analysis to text 

        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)) {
                System.out.println(sentence);
                for (Tree token: sentence.get(SentimentCoreAnnotations.AnnotatedTree.class))
                {
                    //System.out.println(token);
                }
                Tree tree = sentence.get(SentimentCoreAnnotations.AnnotatedTree.class);
                int sentiment = RNNCoreAnnotations.getPredictedClass(tree);
                System.out.println(sentiment);
                String partText = sentence.toString();
                //System.out.println(partText);
                if (partText.length() > longest) {
                    mainSentiment = sentiment;
                    longest = partText.length();
                }

            }
        }
        if(mainSentiment==2)
        {
            System.out.println("Average");
        }
        else if(mainSentiment>2)
        {
            System.out.println("Positive");
        }
        else if(mainSentiment<2)
        {
            System.out.println("Negative ");
        }

        if (mainSentiment == 2 || mainSentiment > 4 || mainSentiment < 0) {
            //return null;
        }
    }
    public static void main(String[] args)
    {
        sentiment_analysis("Cristiano Ronaldo, is a Portuguese professional footballer who plays for Spanish club Real Madrid and the Portugal national team. He is a forward and serves as captain for Portugal.Often ranked as the best player in the world and rated by some in the sport as the greatest of all time");
    }
}

这是我设置的库 enter image description here

我正在使用日食火星。起初它显示错误的ejml库。但后来我导入了ejml jar文件,以便错误得到解决,但它现在引起了这个错误......

Adding annotator tokenize
Adding annotator ssplit
Adding annotator parse
Loading parser from serialized file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ... done [1.6 sec].
Adding annotator sentiment
Exception in thread "main" edu.stanford.nlp.io.RuntimeIOException: java.lang.ClassNotFoundException: edu.stanford.nlp.neural.SimpleTensor
    at edu.stanford.nlp.sentiment.SentimentModel.loadSerialized(SentimentModel.java:470)
    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)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.construct(StanfordCoreNLP.java:260)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:127)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:123)
    at sentiment_demo.sentiment_analysis(sentiment_demo.java:28)
    at sentiment_demo.main(sentiment_demo.java:70)
Caused by: java.lang.ClassNotFoundException: edu.stanford.nlp.neural.SimpleTensor
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at java.util.TreeMap.buildFromSorted(Unknown Source)
    at java.util.TreeMap.buildFromSorted(Unknown Source)
    at java.util.TreeMap.readObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at java.util.TreeMap.buildFromSorted(Unknown Source)
    at java.util.TreeMap.buildFromSorted(Unknown Source)
    at java.util.TreeMap.readObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at edu.stanford.nlp.io.IOUtils.readObjectFromURLOrClasspathOrFileSystem(IOUtils.java:298)
    at edu.stanford.nlp.sentiment.SentimentModel.loadSerialized(SentimentModel.java:466)
我坚持认为。如果有人对此有任何想法,那么请建议,这将有很大的帮助。我已经在stackoverflow上搜索了其他类似的问题,但仍然没有得到解决方案来解决这个问题。

2 个答案:

答案 0 :(得分:2)

实际上问题是使用了不同的版本。一些jar文件,比如xom,ejml缺少。我通过从版本为3.6.0的stanford核心NLP站点下载完整的jar文件来修复它。其中一个导入语句已更改为

import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations;

SentimentCoreAnnotations.AnnotatedTree.class需要更改为 SentimentCoreAnnotations.SentimentAnnotatedTree.class

此更改已解决了我的所有错误。

答案 1 :(得分:1)

您似乎在新模型旁边使用旧版CoreNLP(3.3.0)。尝试下载3.6.0代码+模型。