在opennlp中训练词性标注器

时间:2013-10-22 06:49:49

标签: bin opennlp pos-tagger

我正在尝试训练opennlp POS标记器,它会根据我的特定词汇标记句子中的单词。例如:

正常的POS标记后:

句子:NodeManager / NNP失败/ VBD到/ TO启动/ VB / DT服务器/ NN

使用我的pos标记模型后:

句子:NodeManager / AGENT失败/ OTHER到/ OTHER启动/ OTHER其他服务器/ OBJECT

其中AGENT,OTHER,OBJECT是我定义的标签。

所以基本上我正在定义自己的标签字典。并希望POS标签使用我的模型。

我已经检查了apache文档中的这个

我找到了以下代码

POSModel model = null;

InputStream dataIn = null;
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)
{
   e.printStackTrace();
}
finally {
  if (dataIn != null) {
    try {
      dataIn.close();
    }
    catch (IOException e) {
      // Not an issue, training already finished.
      // The exception should be logged and investigated
      // if part of a production system.
      e.printStackTrace();
    }
  }
}

这里当他们打开FileInputStream到en-pos.train时,我猜这个en-pos.train是一个.bin文件,就像他们以前用过的所有文件一样,但只是它是自定义的。有人可以告诉我如何获取.bin文件吗?

或者en-pos.train在哪里?到底是什么?如何创造它?

我提取了他们通常使用的bin文件

烯POS-maxent.bin。它有xml文件,我们在其中定义标签字典,模型文件和属性文件。我根据自己的需要更改了它们,但我的问题是从内容生成.bin文件。

3 个答案:

答案 0 :(得分:1)

http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.postagger.training.tool

看看这里,您可以通过opennlp应用程序直接创建bin文件,命令在网站上给出。

答案 1 :(得分:0)

这很简单:

培训自己的模型后,将其转储到文件中(随意调用):

public void writeToFile(POSModel model, String modelOutpath) {
    try (OutputStream modelOut = new BufferedOutputStream(new FileOutputStream(modelOutpath))) {
        model.serialize(modelOut);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

然后加载文件,如下所示:

public POSModel getModel(String modelPath) {
try {
    try (InputStream modelIn = new FileInputStream(modelPath)) {
        POSModel model = new POSModel(modelIn);
        return model;
    }
}
catch (Exception e) {
    e.printStackTrace();
}
return model;

}

现在您可以使用加载的模型并进行标记。

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

这是一个详细的教程,其中包含有关如何训练和使用您自己的基于Open NLP的POS标记器的完整代码:

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

答案 2 :(得分:-1)

我认为“en-pos.train”是包含训练集的输入文件。 http://opennlp.apache.org/documentation/manual/opennlp.html文档中提到的培训集是:

About_IN 10_CD Euro_NNP,_,I_PRP reckon_VBP ._。 That_DT sounds_VBZ good_JJ ._。