как создать собственные обучающие данные для парсера opennlp

Я новичок в opennlp, нужна помощь в настройке парсера

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

Пример предложения: Собака перепрыгнула через стену.

после пометки POS с помощью en-pos-maxtent.bin результатом будет

Собака - ННП

прыгнул - ВБД

над - В

- ДТ

стена - НН

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

СОБАКА - ПЕРП

прыгнул - ДЕЙСТВУЙ

больше - ДРУГОЕ

- ДРУГОЕ

стена - ОБЖ

где PERP, ACT, OTH, OBJ — теги, которые соответствуют моим потребностям. Это возможно ?

Я проверил раздел их документации, они дали код для обучения модели и использования ее позже, код выглядит так:

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) {
  // Failed to read or parse training data, training failed
  e.printStackTrace();
}

Я не могу понять, что это за "en-pos.train"?

какой формат у этого файла? мы можем указать здесь пользовательские теги или что это за файл?

любая помощь будет оценена

Спасибо


person yash6    schedule 23.10.2013    source источник


Ответы (2)


Он задокументирован по адресу http://opennlp.apache.org/documentation/manual/opennlp.html#tools.postagger.training — одно предложение в строке, а слова отделяются от своих тегов символом подчеркивания:

About_IN 10_CD Euro_NNP ,_, I_PRP reckon_VBP ._.
That_DT sounds_VBZ good_JJ ._.
person Daniel Naber    schedule 23.10.2013
comment
привет @Daniel, спасибо за ссылку, я попробовал, и она работает нормально, но теперь проблема в том, что она не очень точная. мой набор тренировочных данных составляет около 4 строк. это причина? должен ли я предоставить более разнообразный и большой набор данных? и еще одна вещь, поскольку я определяю новые теги, которые он должен использовать, использует ли он контекст слова? - person yash6; 24.10.2013
comment
Да, вам нужно будет использовать (гораздо) больше данных, чем четыре строки. Я думаю, что есть также отсечка по умолчанию, так что теги POS, которые не встречаются как минимум n раз в обучающих данных, просто игнорируются. Для проверки попробуйте установить отсечку на 0. - person Daniel Naber; 24.10.2013
comment
превосходно! Я хотел бы попросить продолжение. Можно ли переобучить модель? Допустим, сначала я тренирую его на 10 000 предложений. Затем я хочу добавить еще 2 предложения. Придется ли мне снова тренировать все это на 10002 предложениях, или я могу повторно использовать уже обученную модель и каким-то образом дополнить ее новыми данными? - person AbtPst; 22.03.2017

Вот подробное руководство с полным кодом:

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

В зависимости от вашего домена вы можете создать набор данных автоматически или вручную. Создание такого набора данных вручную может быть очень болезненным, такие инструменты, как POS tagger может помочь сделать процесс намного проще.

Формат обучающих данных

Данные обучения передаются в виде текстового файла, где каждая строка представляет собой один элемент данных. Каждое слово в строке должно быть помечено в формате, подобном "слово_LABEL", слово и имя метки разделены символом подчеркивания '_'.

anki_Brand overdrive_Brand
just_ModelName dance_ModelName 2018_ModelName
aoc_Brand 27"_ScreenSize monitor_Category
horizon_ModelName zero_ModelName dawn_ModelName
cm_Unknown 700_Unknown modem_Category
computer_Category
Train model

Важным классом здесь является POSModel, который содержит реальную модель. Мы используем класс POSTaggerME для построения модели. Ниже приведен код для построения модели из файла обучающих данных.

public POSModel train(String filepath) {
  POSModel model = null;
  TrainingParameters parameters = TrainingParameters.defaultParams();
  parameters.put(TrainingParameters.ITERATIONS_PARAM, "100");

  try {
    try (InputStream dataIn = new FileInputStream(filepath)) {
        ObjectStream<String> lineStream = new PlainTextByLineStream(new InputStreamFactory() {
            @Override
            public InputStream createInputStream() throws IOException {
                return dataIn;
            }
        }, StandardCharsets.UTF_8);
        ObjectStream<POSSample> sampleStream = new WordTagSampleStream(lineStream);

        model = POSTaggerME.train("en", sampleStream, parameters, new POSTaggerFactory());
        return model;
    }
  }
  catch (Exception e) {
    e.printStackTrace();
  }
  return null;

}

Используйте модель для пометки.

Наконец, мы можем увидеть, как модель можно использовать для пометки невидимых запросов:

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);
    }
}
person user439521    schedule 23.03.2018