如何为opennlp解析器创建自己的训练数据

时间:2013-10-23 06:45:09

标签: opennlp pos-tagger

我是opennlp的新手,需要帮助来自定义解析器

我使用opennlp解析器和预先训练的模型en-pos-maxtent.bin来标记新的原始英语句子以及语音的相应部分,现在我想自定义标签。

例句: 狗跳过了墙。

使用en-pos-maxtent.bin进行POS标记后,结果为

狗 - NNP

跳跃 - VBD

over-IN

- DT

墙 - NN

但是我想训练自己的模型并用我的自定义标签标记单词,如

DOG - PERP

跳了 - ACT

over-OTH

- OTH

墙 - OBJ

其中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”是什么?

这个文件的格式是什么?我们可以在这里指定自定义标签或者这个文件究竟是什么?

任何帮助将不胜感激

由于

2 个答案:

答案 0 :(得分:4)

它记录在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 ._.

答案 1 :(得分:0)

以下是完整代码的详细教程:

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
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);
    }
}