opennlp.tools.postag.POSTaggerME.train() java.lang.NullPointerException

opennlp.tools.postag.POSTaggerME.train() java.lang.NullPointerException

同样的问题!我得到 InputSteram = null,我使用了 IntelliJ IDEA,OpenNLP 1.9.1。在 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) {
           
            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...");
}

我在 inputStream 中得到空指针并出错... 未创建 InputStreamFactory!

    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)

数据如下所示:
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

**为什么线程打不开并抛出异常?**

如果getResourceAsStream returns null,表示没有找到资源

您应该检查 null 并执行其他操作,例如抛出异常(在本例中为 IOExceptionFileNotFoundException,因为 IOException 和子类是允许的通过 throws 声明) - 你不应该让它传递 null 到你的代码的其余部分。

NLPClassifier.class.getResourceAsStream("/home/int/src/main/resources/en-pos.txt") 将不起作用,因为资源与 Java 包具有相同的结构,只是点被斜线代替。这不是文件系统中的路径。

将其更改为:getResourceAsStream("/en-pos.txt")(因为您的文件位于包层次结构的根目录)

我更改了我的代码,正如 Erwin Bolwidt 所说:

    /** 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");

之后,我发现,也有类似的问题,但是有其他的方法。 @schrieveslaach 说

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());

repo 中项目的完整代码 https://github.com/AlexTitovWork/NLPclassifier