0

我正在尝试像这样使用 openNLP 分块器:

Gate.getCreoleRegister().registerDirectories( new File(Gate.getGateHome().getAbsolutePath()
                                         + "/plugins/OpenNLP").toURI().toURL());
ProcessingResource chunkPr = (ProcessingResource) Factory.createResource("gate.opennlp.OpenNlpChunker", Factory.newFeatureMap());
annieController.add(chunkPr);

但是我得到以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: opennlp.maxent.io.BinaryGISModelReader.getModel()Lopennlp/maxent/GISModel;
at gate.opennlp.OpenNlpChunker.getModel(OpenNlpChunker.java:59)
at gate.opennlp.OpenNlpChunker.init(OpenNlpChunker.java:190)

我不知道如何摆脱这个异常。

4

1 回答 1

2

有两种方法可以解决它。

第一个:

切换到更高的 GATE 版本。在最新的门构建中,它工作得很好。我用 gate-7.2-SNAPSHOT-build4745-ALL 对其进行了测试。您可以从Jenkins 持续集成服务器中获取一个。我没有测试最新的稳定版本,但我相信它也应该对你有所帮助。

第二:

如果您受到现有 GATE 版本的限制(我猜它类似于 5.1...6),它会使事情变得更加复杂。

如果您的 GATE 安装中有 OpenNLPPlugun 的源代码,只需使用 Ant 重建插件即可。您将在 $GATE_HOME$/plugins/OpenNLP 文件夹中找到 Ant 的 build.xml。

第三(最坏的情况。如果第一种和第二种方式没有帮助):

通常,您必须解决两个(或更多!)不同版本的 OpenNLP 库之间的依赖冲突。

问题是您的 OpenNLPChunker 是来自 Ontotext 的 GATE 处理资源的相当旧版本。它取决于特定版本的 opennlp.maxent.io.BinaryGISModelReader 类。如果没有有关 GATE 配置的详细信息,很难准确地说出您的计算机上发生了什么。但事情通常以以下方式发生:

在运行时,您的类路径中有多个版本的 OpenNLP 库。一些额外的插件或一些其他模块依赖于 OpenNLP 库。(它不必是 GATE 的插件,但它在 Java 类路径中呈现)该插件(或任何代码)加载另一个版本的 opennlp.maxent.io.BinaryGISModelReader 类作为依赖项。之后,您尝试加载 OpenNLPChunker,它得到了 opennlp.maxent.io.BinaryGISModelReader 类的错误版本(已由 ClassLoader 加载)。在尝试调用“getModel()”方法期间,您会收到 NoSuchMethodError 异常。您必须确保只有一个 OpenNLP 库。

PS:

OpenNLPChunker 由 Ian Roberts 在 GATE 的更高版本中重写,并且不依赖于 opennlp.maxent.io.BinaryGISModelReader 类的版本。所以第一个选项将是最简单的解决方案。

于 2014-02-17T20:16:50.947 回答