Написание собственных моделей в openNLP

Если я использую такой запрос в командной строке

./opennlp TokenNameFinder en-ner-person.bin "input.txt" "output.txt"

Я напечатаю имена людей в output.txt, но я хочу написать собственные модели, чтобы я мог печатать свои собственные сущности.

E.g.

  1. каково значение риска на icm2500.
  2. Доставка prd_234 будет с опозданием.
  3. Watson обрабатывает router_34.

Если я передам эти строки, он должен проанализировать и извлечь product_entities. icm2500, prd_234, router_34... и т. д. это все продукты (мы можем сохранить эту информацию в файле и использовать ее для поиска моделей или openNLP).

Может кто-нибудь, пожалуйста, скажите мне, как это сделать?


person user3322698    schedule 24.06.2014    source источник


Ответы (1)


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

what is the risk value on <START:product> icm2500 <END>.
Delivery of <START:product> prd_234 <END> will be arrived late.
Watson is handling <START:product> router_34 <END>.

Убедитесь, что каждое предложение заканчивается новой строкой, и если в предложении есть новые строки, как-то избежать их. Как только вы создадите такой файл из своих данных, вы сможете использовать Java API для обучения такой модели.

public static void main(String[] args){

Charset charset = Charset.forName("UTF-8");
ObjectStream<String> lineStream =
        new PlainTextByLineStream(new FileInputStream("your file in the above format"), charset);
ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream);

TokenNameFinderModel model;

try {
  model = NameFinderME.train("en", "person", sampleStream, TrainingParameters.defaultParams(),
            null, Collections.<String, Object>emptyMap());
}
finally {
  sampleStream.close();
}

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

}

теперь вы можете использовать модель с namefinder.

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

вот документы opennlp, которые немного освещают NameFinder:

http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind.training.tool
person markgiaconia    schedule 25.06.2014
comment
Я сделал то, что вы сказали, я имею в виду, что создал свою собственную модель и передал эту строку, где находится icm2500, в качестве входных данных для кода gist.github.com/johnmiedema/7e7330e1b9263267bdfc с использованием моего собственного мода, но ничего не вышло.. И я тоже не знаю о подходе с регулярными выражениями ?? - person user3322698; 26.06.2014