Custom Model Training OpenNLP - PullRequest
       41

Custom Model Training OpenNLP

0 голосов
/ 28 октября 2018

Привет уже упомянул это , это , это и это , но все еще трудно создать собственный искатель именмодель .. Вот код:

public class CustomClassifierTrainer {

    private static final TokenNameFinderFactory TokenNameFinderFactory = null;
    static String onlpModelPath = "/Users/user/eclipse-workspace/openNLP/OpenNLP_models/en-ner-asiannames.bin";
    // training data set
    static String trainingDataFilePath = "/Users/user/eclipse-workspace/openNLP/trainingData/asiannames.txt";

    public static void main(String[] args) throws IOException {

        Charset charset = Charset.forName("UTF-8");

        ObjectStream<String> lineStream =
                new PlainTextByLineStream(new FileInputStream(trainingDataFilePath), charset);

        ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream);

        TokenNameFinderModel model;

        try {
          model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(),
                  TokenNameFinderFactory nameFinderFactory);
        }
        finally {
          sampleStream.close();
        }

        BufferedOutputStream modelOut = null;
        try {
          modelOut = new BufferedOutputStream(new FileOutputStream(onlpModelPath));
          model.serialize(modelOut);
        } finally {
          if (modelOut != null) 
             modelOut.close();      
        }



    }

}

Я получаю сообщение об ошибке при попытке выполнить строку:

ObjectStream<String> lineStream = new PlainTextByLineStream(new FileInputStream(trainingDataFilePath), charset);

, прося меня привести аргумент 1., когда я изменяю его на

ObjectStream<String> lineStream = new PlainTextByLineStream((InputStreamFactory) new FileInputStream(trainingDataFilePath), charset);

тогда я получаю ошибку во время выполнения, говорящую, что вы не можете разыграть это.Вот ошибка, когда я произнес ее Exception in thread "main" java.lang.ClassCastException: class java.io.FileInputStream cannot be cast to class opennlp.tools.util.InputStreamFactory (java.io.FileInputStream is in module java.base of loader 'bootstrap'; opennlp.tools.util.InputStreamFactory is in unnamed module of loader 'app') at openNLP.CustomClassifierTrainer.main(CustomClassifierTrainer.java:35)

Вторая проблема в строке:

try {
  model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(),
              TokenNameFinderFactory nameFinderFactory);
}

, сообщающая синтаксическую ошибку.Не уверен, что здесь не так.Буду признателен за любую помощь, так как я попробовал все фрагменты кода по вышеупомянутым ссылкам.

С уважением,

1 Ответ

0 голосов
/ 28 октября 2018

Первая ошибка: ваш метод ожидает InputStreamFactory.Вы пытаетесь передать InputStream.InputStream не является InputStreamFactory.Так же, как Пицца не Автомобиль.

Если кто-то (компилятор) попросит у вас автомобиль, и вы дадите ему пиццу, он не сможет водить машину.Притворение, что Пицца - это Автомобиль, говоря ему: «Поверьте мне, эта пицца - это машина» (что и делает кастинг), не решит проблему.

Так что вам действительно нужно передать InputStreamFactory.Посмотрите на javadoc этого интерфейса, и вы увидите, что у него есть единственный метод createInputStream(), который не принимает ничего в качестве аргумента и должен создавать и возвращать InputStream.

Таким образом, допустимым значением будет

() -> new FileInputStream(trainingDataFilePath)

, т. Е. Лямбда, которая не принимает входных данных и создает новый входной поток, и, таким образом, может быть выведена в InputStreamFactory.

Вторая ошибка еще проще: вы не должны указывать типы аргументов, когда вызывает метод.Только когда определяет метод.Так что

NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   TokenNameFinderFactory nameFinderFactory);

должно быть

NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   nameFinderFactory);

Практикуйтесь с более простыми вещами, чтобы изучить синтаксис Java.Научитесь читать сообщения об ошибках вместо того, чтобы игнорировать их, и читать Javadoc класса, который вы используете.Это очень важно.

...