обучение тегу частей речи в opennlp

Я пытаюсь обучить POS-тегер opennlp, который будет помечать слова в предложении в соответствии с моим конкретным словарным запасом. Например:

После обычной POS-маркировки:

предложение: NodeManager/NNP failed/VBD to/TO start/VB the/DT server/NN

После использования моей модели тегов постов:

предложение: NodeManager/АГЕНТ не удалось/ДРУГОЙ/ДРУГОЙ запуск/ДРУГОЙ/ДРУГОЙ сервер/ОБЪЕКТ

где АГЕНТ, ДРУГОЕ, ОБЪЕКТ — теги, которые я определил.

так что в основном я определяю свой собственный словарь тегов. И хочу, чтобы теггер POS использовал мою модель.

когда я проверил документацию Apache для этого

я нашел код ниже

POSModel model = null;

InputStream dataIn = null;
try {
  dataIn = new FileInputStream("en-pos.train");
  ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, "UTF-8");
  ObjectStream<POSSample> sampleStream = new WordTagSampleStream(lineStream);

  model = POSTaggerME.train("en", sampleStream, TrainingParameters.defaultParams(), null, null);
}
catch(IOException e)
{
   e.printStackTrace();
}
finally {
  if (dataIn != null) {
    try {
      dataIn.close();
    }
    catch (IOException e) {
      // Not an issue, training already finished.
      // The exception should be logged and investigated
      // if part of a production system.
      e.printStackTrace();
    }
  }
}

здесь, когда они открывают FileInputStream для en-pos.train, я предполагаю, что этот en-pos.train представляет собой файл .bin, как и все те, которые они использовали раньше, но он просто настроен. может кто-нибудь сказать мне, как получить файл .bin для него?

или где en-pos.train ? что именно? как его создать?

я извлек bin-файл, который они обычно используют

en-pos-maxent.bin. у него есть файл xml, в котором мы определяем словарь тегов, файл модели и файл свойств. я изменил их в соответствии со своими потребностями, но моя проблема заключается в создании файла .bin из содержимого.


person yash6    schedule 22.10.2013    source источник
comment
Разделителем слов и тегов по умолчанию является _, а не /. Использование должно помещать предложение в строку в вашем файле.   -  person Luiz Feijão Veronesi    schedule 30.10.2020


Ответы (2)


http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.postagger.training.tool

посмотрите здесь, вы можете создать свой bin-файл напрямую через приложение opennlp, команды приведены на сайте.

person andrew.butkus    schedule 28.10.2013

Это довольно просто сделать:

После того, как вы обучите свою собственную модель, выгрузите ее в файл (назовите его как хотите):

public void writeToFile(POSModel model, String modelOutpath) {
    try (OutputStream modelOut = new BufferedOutputStream(new FileOutputStream(modelOutpath))) {
        model.serialize(modelOut);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

Затем загрузите файл, как показано ниже:

public POSModel getModel(String modelPath) {
try {
    try (InputStream modelIn = new FileInputStream(modelPath)) {
        POSModel model = new POSModel(modelIn);
        return model;
    }
}
catch (Exception e) {
    e.printStackTrace();
}
return model;

}

Теперь вы можете использовать загруженную модель и делать теги.

    public void doTagging(POSModel model, String input) {
    input = input.trim();
    POSTaggerME tagger = new POSTaggerME(model);
    Sequence[] sequences = tagger.topKSequences(input.split(" "));
    for (Sequence s : sequences) {
        List<String> tags = s.getOutcomes();
        System.out.println(Arrays.asList(input.split(" ")) +" =>" + tags);
    }
}

Вот подробное руководство с полным кодом о том, как обучить и использовать свой собственный POS-тегер на основе Open NLP:

https://dataturks.com/blog/opennlp-pos-tagger-training-java-example.php

person user439521    schedule 23.03.2018