当前位置: 首页 > 知识库问答 >
问题:

在opennlp中训练词性标记器

弘康安
2023-03-14

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

正常词性标注后:

句子:NodeManager/NNP失败/VBD to/TO start/VB the/DT server/NN

使用我的词性标注模型后:

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

其中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();
    }
  }
}

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

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

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

en-pos-maxent.bin.它有我们定义标签字典的xml文件,一个模型文件和一个属性文件。我已经根据我的需要更改了它们,但我的问题是从内容生成. bin文件。

共有2个答案

邵畅
2023-03-14

这很简单:

训练自己的模型后,将其转储到一个文件(可以随意调用):

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

韩嘉祯
2023-03-14

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

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

 类似资料:
  • 编辑1:主要的问题是在训练完一个NER模型后,我将它应用到令牌上。因此,它不会识别“轮滑”,因为在代币中,它们以“轮滑”和“滑冰”的形式出现,而NER模型现在无法识别这个爱好。

  • 在某些语言(例如越南语)中,一些词汇由多个单词组成。因此,一些包含多个单词的标记可以被标记,而不仅仅是使用空格。 我有以下意见: 预期产出: 训练数据我_连接需要在一个令牌中粘在一起的单词: 这是我用来训练的命令行 带参数 但是,输出不能在一个标记中连接多个单词,但它被空格拆分。 我运行以获取输出的命令 我应该如何处理我们的配置参数中的训练数据,以训练每个标记都有多个单词的标记器?

  • 我发现很难创建自己的openNLP模型。谁能告诉我,如何拥有自己的模型。培训应该如何进行。 输入应该是什么,输出模型文件将存储在哪里。

  • 我试图使用官方OpenNLP网站手册示例来训练一个新模型,以下是示例: 问题出在2º线上, 帮我说:不赞成。改用PlainTextByLineStream(InputStreamFactory,Charset)。但是我不知道如何使用这个构造函数。我想举一个例子,使用同一个语料库文件使用这个未弃用的构造函数。 我已经编写了下一段代码,使用opennlp帮助和两种使用train方法的方法,不推荐的和建

  • 我是使用NER进行Open NLP实体提取的新手,我在Open NLP NER中训练和评估了实体提取的模型,当我给出带有一个词的实体的输入文本时,它可以正常工作例如:“我想购买吉百利” 但它不适用于多词场景,例如:“我想买一台苹果MacBook” 如何训练模特选择多个单词 PS:我知道我需要做一些与NLP中提供的Bigram相关的事情,但是如何使用OpenNLP呢?

  • 我试图用下面的代码训练模型,但我一直在方法上收到错误,它告诉我将更改为。为什么?