我目前正在尝试在代码中使用经过自定义培训的OpenNLP名称查找器模型。我的项目使用OpenNLP 1.6.0并使用Eclipse IDE开发。该模型也使用OpenNLP 1.6.0进行训练。
但是,我收到了这个恼人的错误:
java.lang.IllegalArgumentException : opennlp.tools.util.InvalidFormatException: Model version 1.6.0 is not supported by this (1.5.3) version of OpenNLP!
类似的问题被问到here并且答案说明问题是由于OpenNLP模型使用与使用中相同的版本进行训练(即使用1.6.0训练模型并在一个也使用1.6.0的项目。但是我还有其他使用OpenNLP 1.6.0的Java项目,他们能够成功加载模型,所以我不认为这适用于我。
我的项目的 .classpath 也表明该项目引用了OpenNLP 1.6.0库。
我知道这个问题相当模糊,但是如果有人知道为什么会这样,请告诉我!
总结:由于明显的OpenNLP版本不兼容,无法在代码中加载自定义训练的OpenNLP名称查找器模型。模型在OpenNLP 1.6.0中进行了培训,我的项目也使用了该模型。其他使用1.6.0的项目也能够成功加载模型。
答案 0 :(得分:0)
我已经确定了我的错误来源 - 我的项目也在使用Apache Tika 1.13库,其中包含自己的OpenNLP 1.5.3实现。
因此,类路径包含多个包含自己版本的OpenNLP类的JAR。
编辑16/1/2017:根据我的调查结果,库的加载顺序很重要。
如果我错在这里请纠正我:在Java(以及其他语言)中,一旦在内存中加载了一个依赖组件,那么默认情况下,即使另一个版本是稍后需要。
因此,如果在OpenNLP 1.6.0库之前加载Tika库,首先会加载OpenNLP 1.5.3,程序将会#34;坚持"尽管随后加载了1.6.0,仍然达到1.5.3。同样,如果相反的情况发生(在Tika之前加载1.6.0),该程序将“坚持”#34;改为1.6.0。