问题
There are same problem! I get InputSteram = null, I used IntelliJ IDEA, OpenNLP 1.9.1. on Ubuntu 18.04
public void makeDataTrainingModel() {
model = null;
System.out.println("POS model started");
//InputStream dataIn = null;
InputStreamFactory dataIn = null;
try {
dataIn = new InputStreamFactory() {
public InputStream createInputStream() throws IOException {
return NLPClassifier.class.getResourceAsStream("/home/int/src
/main/resources/en-pos.txt");
}
};
//I get null pointer here in dataIn
ObjectStream<String> lineStream = new PlainTextByLineStream((InputStreamFactory) , "UTF-8");
ObjectStream<POSSample> sampleStream = new WordTagSampleStream(lineStream);
//This train part IS NOT WORK ?
model = POSTaggerME.train("en", sampleStream, TrainingParameters.defaultParams(), null);
} catch (IOException e) {
// Failed to read or parse training data, training failed
e.printStackTrace();
} finally {
if (dataIn != null) {
// dataIn.close();
System.out.println("InputStreamFactory was not created!");
}
}
System.out.println("POS model done...");
System.out.println("Success generate model...");
//write Data model
OutputStream modelOut = null;
try {
String currentDir = new File("").getAbsolutePath();
modelOut = new BufferedOutputStream(new FileOutputStream(currentDir + "//src//main//resources//example-bad-model.dat"));
model.serialize(modelOut);
} catch (IOException e) {
// Failed to save model
e.printStackTrace();
} finally {
if (modelOut != null) {
try {
modelOut.close();
} catch (IOException e) {
// Failed to correctly save model.
// Written model might be invalid.
e.printStackTrace();
}
}
}
System.out.println("Model generated and treated successfully...");
}
I get null pointer in inputStream and Error... InputStreamFactory was not created!
Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:113)
at
opennlp.tools.util.PlainTextByLineStream.reset(PlainTextByLineStream.java:57)
at opennlp.tools.util.PlainTextByLineStream.<init>
(PlainTextByLineStream.java:48)
at opennlp.tools.util.PlainTextByLineStream.<init>
(PlainTextByLineStream.java:39)
at NLPClassifier.makeDataTrainingModel(NLPClassifier.java:98)
at NlpProductClassifier.main(NlpProductClassifier.java:39)
Data looks like this:
profit_profit shell_environment 384912_CD bucks_currency
salary_profit finger_body 913964_CD usd_currency
profit_profit faith_law 3726_CD rur_currency
profit_profit game_entertainment 897444_CD dollar_currency
got_buy gift_jewelery 534841_CD rub_currency
Why the thread does not open and it throw an exception?
回答1:
If getResourceAsStream
returns null
, it means that the resource wasn't found.
You should check for null
and do something else, such as throwing an exception (IOException
or FileNotFoundException
in this case, since IOException
and subclasses are allowed by the throws
declaration) - you shouldn't let it pass the null
to the rest of your code.
NLPClassifier.class.getResourceAsStream("/home/int/src/main/resources/en-pos.txt")
won't work, because resources have the same structure as Java packages, except that dots are replaced with slashes. It's not a path in the file system.
Change it to: getResourceAsStream("/en-pos.txt")
(because your file is at the root of the package hierarchy)
回答2:
I change my code, as Erwin Bolwidt say:
/** I commented this part
return NLPClassifier.class.getResourceAsStream("/home/interceptor/src/main/resources/en-pos.txt");
*/
/**
Add this location of my resoures:
/Project/src/main/resources
*/
return getClass().getClassLoader().getResourceAsStream("en-pos.txt");
After that, i found Apache OpenNLP: java.io.FileInputStream cannot be cast to opennlp.tools.util.InputStreamFactory, with a similar problem, but with other methods. @schrieveslaach says
You need an instance of InputStreamFactory which will retrieve your InputStream. Additionally, TokenNameFinderFactory must not be null ! like this posFactory - must not be null!
/**
* Factory must not be a null. Add posModel.getFactory()
* model = POSTaggerME.train("en", sampleStream, TrainingParameters.defaultParams(), null);
*/
model = POSTaggerME.train("en", sampleStream, TrainingParameters.defaultParams(), posModel.getFactory());
Full code of project in repo https://github.com/AlexTitovWork/NLPclassifier
来源:https://stackoverflow.com/questions/58684714/exception-in-thread-main-java-lang-nullpointerexception-at-opennlp-tools-posta