假设您使用的是 OpenNLP 1.5.3,那么您应该使用另一种加载资源文件的方式,即通过 URI 转换不使用“硬”路径引用。
给定一个环境,其中目录中存在WEB-INF
另一个目录resources
,其中包含您的 OpenNLP 模型文件,您的代码片段应编写如下:
String taggerModelPath = "/WEB-INF/resources/en-pos-maxent.bin";
String chunkerModelPath= "/WEB-INF/resources/en-chunker.bin";
POSModel model = new POSModelLoader().load(servletContext.getResourceAsStream(taggerModelPath));
请参阅ServletContext#getResourceAsStream的 Javadoc和此StackOverflow 帖子。
重要提示
可悲的是,您的代码还有其他问题。OpenNLP 类POSModelLoader
仅供内部使用,请参阅POSModelLoader的官方 Javadoc :
为命令行工具加载一个词性标注模型。
注意:请勿使用此类,仅供内部使用!
因此,在 Web 上下文中加载 aPOSModel
应该以不同的方式完成:通过该类的可用构造函数之一。您可以像这样重新编写上面的代码片段:
try {
InputStream in = servletContext.getResourceAsStream(taggerModelPath);
POSModel posModel;
if(in != null) {
posModel = new POSModel(in);
// from here, <posModel> is initialized and you can start playing with it...
// ...
}
else {
// resource file not found - whatever you want to do in this case
}
}
catch (IOException | InvalidFormatException ex) {
// proper exception handling here... cause: getResourcesAsStream or OpenNLP...
}
这样,您就可以与 OpenNLP API 兼容,同时您可以进行适当的异常处理。此外,您现在可以使用调试器,以防模型文件的资源路径引用仍不清楚。
希望能帮助到你。