我通过java nlp https://www.tutorialspoint.com/opennlp/index.htm
的链接我在android下面尝试了以下代码:
try {
File file = copyAssets();
// InputStream inputStream = new FileInputStream(file);
ParserModel model = new ParserModel(file);
// Creating a parser
Parser parser = ParserFactory.create(model);
// Parsing the sentence
String sentence = "Tutorialspoint is the largest tutorial library.";
Parse topParses[] = ParserTool.parseLine(sentence, parser,1);
for (Parse p : topParses) {
p.show();
}
} catch (Exception e) {
}
我从互联网下载文件**en-parser-chunking.bin**
并放置在android项目的资产中,但代码在第三行停止,即ParserModel model = new ParserModel(file);
,没有任何例外。需要知道这在android中如何工作?如果它没有工作,在没有消耗任何服务的情况下在Android中有任何其他nlp支持吗?
答案 0 :(得分:1)
代码在运行时停止/中断的原因是您需要使用InputStream
而不是File
来加载二进制文件资源。最有可能的是,当您"加载"时,文件实例为null
。它是第2行所示的方式。理论上,ParserModel
的这个构造函数应该检测到这一点并且应该抛出IOException
。然而,遗憾的是,JavaDoc of OpenNLP对于这种情况并不准确,并且您没有在catch
块中正确处理此异常。
此外,您提交的代码段应该进行改进,以便您知道实际出现了什么问题。
因此,从POSModel
中加载Activity
应该采用不同的方式。这是一个关注两个方面的变体:
AssetManager assetManager = getAssets();
InputStream in = null;
try {
in = assetManager.open("en-parser-chunking.bin");
POSModel posModel;
if(in != null) {
posModel = new POSModel(in);
if(posModel!=null) {
// From here, <posModel> is initialized and you can start playing with it...
// Creating a parser
Parser parser = ParserFactory.create(model);
// Parsing the sentence
String sentence = "Tutorialspoint is the largest tutorial library.";
Parse topParses[] = ParserTool.parseLine(sentence, parser,1);
for (Parse p : topParses) {
p.show();
}
}
else {
// resource file not found - whatever you want to do in this case
Log.w("NLP", "ParserModel could not initialized.");
}
}
else {
// resource file not found - whatever you want to do in this case
Log.w("NLP", "OpenNLP binary model file could not found in assets.");
}
}
catch (Exception ex) {
Log.e("NLP", "message: " + ex.getMessage(), ex);
// proper exception handling here...
}
finally {
if(in!=null) {
in.close();
}
}
这样,您就可以使用InputStream
方法,同时注意正确的异常和资源处理。此外,如果模型文件的资源路径引用仍然不清楚,您现在可以使用调试器。有关参考,请参阅AssetManager#open(String resourceName)
的{{3}}。
加载OpenNLP的二进制资源会占用大量内存。出于这个原因,可能的情况是,您的Android应用程序为此操作分配所需内存的请求可能会或将不会被实际运行时(即智能手机)环境授予。
因此,在调用posModel = new POSModel(in);
时,请仔细监视请求/所需RAM的数量。
希望它有所帮助。