Исключение в потоке "main" java.lang.NullPointerException в opennlp.tools.postag.POSTaggerME.train () - PullRequest
0 голосов
/ 04 ноября 2019

Есть такая же проблема! Я получаю 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) {
            //                    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...");
}

Я получаю нулевой указатель в inputStream и Error ... 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_environment384912_CD Бакс_Валюта
Зарплата_прибыль finger_body 913964_CD usd_currency
Прибыль_прибыль вера_доллара 3726_CD руб ._курсность
Прибыль_прибыль_игра_ развлечения 897444_Цоллара_Долларжистура
1014 * вы получите *1014* даже не поняли - даже 1015 у вас даже есть - даже 681 у вас в кармане даже 1011 подарка * 1015 даже не поняли, как получить - даже 591 у вас есть - даже 591 вы получили - даже не поняли, как вы получаете 1015

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я изменяю свой код, как говорит Эрвин Болвидт:

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

После этого я обнаружил Apache OpenNLP: java.io.FileInputStream не может быть приведен к opennlp.tools.util.InputStreamFactory , с аналогичной проблемой, но с другими методами. @schrieveslaach говорит:

Вам нужен экземпляр InputStreamFactory, который будет извлекать ваш InputStream. Кроме того, TokenNameFinderFactory не должен быть нулевым! вот так posFactory - не может быть нулевым!

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

Полный код проекта в репо https://github.com/AlexTitovWork/NLPclassifier

0 голосов
/ 04 ноября 2019

Если getResourceAsStream возвращает null, это означает, что ресурс не найден.

Вы должны проверить на null и сделать что-то еще, например, выдать исключение (IOException илиFileNotFoundException в этом случае, поскольку IOException и подклассы разрешены объявлением throws) - вы не должны позволять ему передавать null остальной части вашего кода.

NLPClassifier.class.getResourceAsStream("/home/int/src/main/resources/en-pos.txt") не будет работать, поскольку ресурсы имеют ту же структуру, что и пакеты Java, за исключением того, что точки заменяются косыми чертами. Это не путь в файловой системе.

Измените его на: getResourceAsStream("/en-pos.txt") (поскольку ваш файл находится в корне иерархии пакетов)

...