java.lang.NoSuchMethodError:edu.stanford.nlp.util.Generics.newHashMap()Ljava / util / Map;

Ria*_*bir 0 java nosuchmethoderror java-ee stanford-nlp

我有以下代码行初始化Stanford词法分析器。

lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz");
Run Code Online (Sandbox Code Playgroud)

仅当我将代码从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)
Run Code Online (Sandbox Code Playgroud)

这是怎么引起的,我该如何解决?

Fré*_*nri 5

您可以参考常见问题解答: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)
Run Code Online (Sandbox Code Playgroud)

那么这并不是由您刚刚下载的闪亮的新斯坦福NLP工具引起的。这是因为您的类路径中还具有一个或多个Stanford NLP工具的旧版本。

最直接的情况是,如果您使用的是Stanford NLP工具的较旧版本。例如,您的类路径上可能仍具有Stanford NER的版本,该版本于2009年发布。在这种情况下,您应该升级或至少使用匹配的版本。对于2011年以后的任何版本,只需使用同时发布的工具-例如所有内容的最新版本:)-它们将兼容并且可以很好地配合使用。

棘手的情况是,当人们分发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的共同点;Google Guava(v10);杰克逊 伯克利NLP代码;珀西·梁的无花果;GNU宝库;和Stanford POS标记器的过时版本(从2011年开始)。您应该向他们抱怨造成您和我们的悲伤。但是您可以通过使用Maven Central的jar文件来解决问题。它并没有塞满所有其他库。