我正在尝试对包含我已经收集的推文的数据集应用情感分析,以便为我的论文运行一些实验。我已经在互联网上关注了各种教程,到目前为止,我的代码如下:
public class SentimentAnalyzer {
public static StanfordCoreNLP pipeline;
public SentimentAnalyzer() {
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, parse, sentiment");
pipeline = new StanfordCoreNLP(props);
}
public static int getSentiment(String tweet) {
int mainSentiment = 0;
if (tweet != null && tweet.length() > 0) {
int longest = 0;
Annotation annotation = pipeline.process(tweet);
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();
}
}
}
return mainSentiment;
}
}
问题在于,当我运行这段代码时,Java会返回一个非法的参数异常:
Adding annotator tokenize
Adding annotator ssplit
Adding annotator parse
Loading parser from serialized file
edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ... done [1,4 sec].
Adding annotator sentiment
Exception in thread "main" java.lang.IllegalArgumentException: No annotator named sentiment
at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:78)
at edu.stanfoJava Result: 1
但是每一个教程都将“情绪”列为有效的注释器!该程序在调用StanfordCoreNLP构造函数(在SentimentAnalyzer构造函数内)时特别挂起,虽然我已经尝试了所有我能想到的配置(使管道不是静态的,使用.properties文件在getSentiment()方法中创建管道eveytime相反),问题仍然存在。 我正在使用StanfordCoreNLP 3.3.1,以及模型.jar(虽然它是3.5.2版本)和ejml 0.23 -I使用了3.5.2版本,但没有成功。
编辑: 我用3.5.2替换了3.3.2,现在错误发生了变化:
Loading parser from text file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz Exception in thread "main" java.lang.RuntimeException: edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz: expecting BEGIN block; got ��
其余部分不可读,也无法复制。似乎模型库存在问题,至少错误指向的目录属于模型。我还使用GitHub存储库中的最新库进行了更新,但错误是相同的。
答案 0 :(得分:0)
事实证明,自8月以来,StanfordCoreNLP v.1.3.4被遗漏了之前的实施。当我删除它时,代码开始正常工作。