Пример обучения предложений OpenNLP

Я пытаюсь использовать официальный пример руководства на веб-сайте OpenNLP для обучения новой модели, вот пример:


    Charset charset = Charset.forName("UTF-8");
    ObjectStream lineStream = new PlainTextByLineStream(new FileInputStream("en-sent.train"), charset);
    ObjectStream sampleStream = new SentenceSampleStream(lineStream);
    SentenceModel model;
    try {
      model = SentenceDetectorME.train("en", sampleStream, true, null, TrainingParameters.defaultParams());
    } finally {
      sampleStream.close();
    }
    OutputStream modelOut = null;
    try {
      modelOut = new BufferedOutputStream(new FileOutputStream(modelFile));
      model.serialize(modelOut);
    } finally {
      if (modelOut != null) 
      modelOut.close();
    }

Проблема в линии 2º,

    
ObjectStream lineStream = new PlainTextByLineStream(new FileInputStream("en-sent.train"), charset);

Помощь говорит мне: устарело. Вместо этого используйте PlainTextByLineStream(InputStreamFactory, Charset). Но... я не знаю, как использовать этот конструктор. Я хотел бы, чтобы в примере использовался этот неустаревший конструктор с использованием того же файла корпуса.

Я написал следующий код, используя справку opennlp и два способа использования метода обучения, устаревший и предложенный в справке документа:

    Charset charset = Charset.forName("UTF-8");
    InputStreamFactory inputStreamFactory=null;
    ObjectStream<String> lineStream=null;
    ObjectStream<SentenceSample> sampleStream=null;
    SentenceModel model=null;
    OutputStream modelOut = null;
    try{
        inputStreamFactory=InputStreamFactory.class.newInstance();
        lineStream=new PlainTextByLineStream(inputStreamFactory,charset);
        sampleStream = new SentenceSampleStream(lineStream);
        //The deprecated:
        model = SentenceDetectorME.train("en", sampleStream, true, null, TrainingParameters.defaultParams());
        //The sugested:
        model = SentenceDetectorME.train("en", sampleStream, new SentenceDetectorFactory(), new TrainingParameters()); 
    } catch (InstantiationException e2){
        e2.printStackTrace();
    } catch (IllegalAccessException e2){
        e2.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }finally {
        try{
            sampleStream.close();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    try {
        modelOut = new BufferedOutputStream(new FileOutputStream(new File("modelFile")));
        model.serialize(modelOut);
    } catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        if (modelOut != null) try{
            modelOut.close();
        } catch (IOException e){
            e.printStackTrace();
        }      
    }

Но в этом новом коде я не знаю, где взять файл данных моего корпуса. Есть идеи?


person Jesús    schedule 24.12.2015    source источник
comment
programcreek.com/java-api- примеры/   -  person giorgio79    schedule 12.04.2016


Ответы (1)


Вы должны инициализировать inputStreamFactory желаемым файлом данных, используйте

inputStreamFactory = new MarkableFileInputStreamFactory(
        new File("en-sent.train"));
person Kostas Chalkias    schedule 25.12.2015