我有以下代码行来初始化斯坦福词法解析器。
lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz");
只有当我将代码从Java SE应用程序移动到Java EE应用程序时,才会遇到异常。
Caused by: java.lang.NoSuchMethodError: edu.stanford.nlp.util.Generics.newHashMap()Ljava/util/Map;
at edu.stanford.nlp.parser.lexparser.BinaryGrammar.init(BinaryGrammar.java:223)
at edu.stanford.nlp.parser.lexparser.BinaryGrammar.readObject(BinaryGrammar.java:211)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
这是如何引起的?如何解决?
答案 0 :(得分:4)
您可以参考常见问题解答:http://nlp.stanford.edu/software/corenlp-faq.shtml#nosuchmethoderror
Caused by: java.lang.NoSuchMethodError: edu.stanford.nlp.util.Generics.newHashMap()Ljava/util/Map; at edu.stanford.nlp.pipeline.AnnotatorPool.(AnnotatorPool.java:27) at edu.stanford.nlp.pipeline.StanfordCoreNLP.getDefaultAnnotatorPool(StanfordCoreNLP.java:305)
那么这不是由您刚下载的闪亮的新斯坦福NLP工具引起的。这是因为您在类路径中也有一个或多个Stanford NLP工具的旧版本。
直截了当的情况是你有一个较旧版本的斯坦福NLP工具。例如,您可能在2009年发布的类路径中有一个Stanford NER版本。在这种情况下,您应该升级,或者至少使用匹配的版本。对于2011年以来的任何版本,只需使用同时发布的工具 - 例如最新版本的所有内容:) - 它们将兼容并且可以很好地协同工作。
这种棘手的情况是人们分发jar文件,隐藏其他人的类。人们认为这将使用户更容易,因为他们可以分发一个具有您需要的所有东西的jar,但实际上,一旦人们使用多个组件构建应用程序,这就会导致一种特殊的jar形式。人们不应该这样做。检查其他jar文件不包含冲突版本的Stanford工具的唯一方法是查看其中的内容(例如,使用jar -tf命令)。
在实践中,如果遇到问题,最常见的原因(2013-2014)就是你的类路径上有ark-tweet-nlp。他们的github下载中的jar文件隐藏了许多其他人的jar文件的旧版本,包括Apache commons-codec(v1.4),commons-lang,commons-math,commons-io,Lucene; Twitter公共;谷歌番石榴(第10集);杰克逊;伯克利NLP代码; Percy Liang的无花果; GNU trove;以及Stanford POS标签的过时版本(2011年起)。你应该抱怨他们造成你和我们的悲伤。但是,您可以通过使用Maven Central中的jar文件来解决问题。它没有填充所有其他库。
答案 1 :(得分:1)
正如Frédéric所说,最好的解决方案是删除导致运行时不匹配的所有依赖项并编译并再次添加库并再次构建,如果您使用的是maven:
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.6.0</version>
</dependency>