4

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

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

例句:狗跳过墙。

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

狗 - NNP

跳跃 - VBD

过 - 在

-DT

墙 - NN

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

狗 - PERP

跳了 - ACT

超过 - 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”是什么?

这个文件的格式是什么?我们可以在这里指定自定义标签还是这个文件到底是什么?

任何帮助,将不胜感激

谢谢

4

2 回答 2

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 ._.
于 2013-10-23T17:33:37.377 回答
0

这是一个包含完整代码的详细教程:

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

根据您的域,您可以自动或手动构建数据集。手动构建这样的数据集真的很痛苦,像POS 标记器这样的工具可以帮助简化这个过程。

训练数据格式

训练数据作为文本文件传递,其中每一行是一个数据项。行中的每个单词都应以“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);
    }
}
于 2018-03-23T06:53:29.450 回答