Exception in thread “main” java.lang.NullPointerException at opennlp.tools.postag.POSTaggerME.train()

笑着哭i 提交于 2019-12-23 05:31:20

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!