Приведенный выше ответ дает возможность использовать существующие модели из OpenNLP, но если вам нужно обучить свою собственную модель, возможно, может помочь следующее:
Вот подробное руководство с полным кодом:
https://dataturks.com/blog/opennlp-pos-tagger-training-java-example.php
В зависимости от вашего домена, вы можете создать набор данных автоматически или вручную. Создание такого набора данных вручную может быть очень трудным, такие инструменты, как POS tagger , могут сделать процесс намного проще.
Формат данных обучения
Данные обучения передаются в виде текстового файла, где каждая строка представляет собой один элемент данных. Каждое слово в строке должно быть помечено в формате, подобном «word_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
Модель поезда
Важным классом здесь является 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);
}
}