我正在设计一个Android应用程序,它很大程度上依赖于自然语言处理。我选择了OpenNLP,因为它似乎提供了我需要提供的东西,制作了几个类来封装标记化,pos标记等,并在标准的java设置中测试它们没有问题。
我的问题似乎与Android文件系统有关。 OpenNLP需要一个培训文件来初始化每个类后面的数据模型。但是,这些类的构造函数似乎采用了非常具体的InputStream
,因为当我成功引用这些文件时,我得到一个关于访问权限的错误(我已经添加了读取和写入权限) /到外部存储),或者说明"The profile data stream has an invalid format!"
我很茫然,因为使用Android上下文类提供的标准输入流方法不起作用,因为提供的输入流格式无效,并尝试使用我自己的输入流手动访问文件提出许可问题。我甚至尝试在运行时将文件从res文件夹加载到另一个文件中,然后使用普通FileInputStream
重新加载它,但这又一次让我遇到了无效的格式问题。
下面是用于访问文件的方法,以及初始化其中一个模型的示例方法(它们都相当统一)。如果有人知道发生了什么,或者有人让OpenNLP在Android环境中工作,那么我们将非常感谢您的帮助!
文件访问方式:
protected FileInputStream importIfNotExists(){
FileInputStream input = null;
if(mContext != null){
File file = new File(getDirectory(), getFilePath());
if(file.exists()){ //Create input stream from file.
try {
Log.d("Analysis Tool", "Accessing file");
//Crashes here if it exists
input = new FileInputStream(file);
}
catch (FileNotFoundException e) {
Log.d("Speech Analysis Tool", "File not found: " + getFilePath());
input = null;
}
}
else{ //Import resource file, then get input stream
InputStream stream = null;
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
int sample = 0;
try {
Log.d("Analysis Tool", "Loading raw resource");
stream = mContext.getResources().openRawResource(mResId);
Log.d("Analysis Tool", "Creating file to be written to.");
file.createNewFile();
Log.d("Analysis Tool", "Reading bytes from resource.");
sample = stream.read();
while(sample != -1){
bytes.write(sample);
sample = stream.read();
}
stream.close();
Log.d("Analysis Tool", "Creating file: " + getFilePath());
FileOutputStream output = new FileOutputStream(file, false);
Log.d("Analysis Tool", "Writing bytes to " + getFilePath());
bytes.writeTo(output);
bytes.close();
output.close();
Log.d("Analysis Tool", "Retrieving input stream for new file");
input = new FileInputStream(file);
//the input passed from this is typically of an invalid format
}
catch (IOException e) {
Log.d("Speech Analysis Tool", "IOException with: " + getFilePath());
Log.e("Speech Analysis Tool", e.getLocalizedMessage());
input = null;
}
}
}
return input;
}
模型初始化:
@Override
protected void initializeTool(FileInputStream input) throws InvalidFormatException, IOException{
if(input == null){
Log.e("Speech Tokenizer", "Input stream for tokenizer is null");
return;
}
TokenizerModel model = getModel(input);
mTokenizer = new TokenizerME(model);
}
getFilePath()
只返回文件名及其文件类型(如en_token.bin),getDirectory()
变化很小甚至没有成功,但是我打算成为外部存储上的目录。 d可以访问这些文件,也可以在运行时加载它们。
答案 0 :(得分:0)
将此行添加到您的代码中:
System.setProperty("org.xml.sax.driver","org.xmlpull.v1.sax2.Driver");
帮助了我,也许会对您有所帮助