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

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

墨雨华
2023-03-14

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

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

例句:狗跳过墙。

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

狗-NNP

跳跃-VBD

超过-在

The-DT

wall-NN

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

狗-罪犯

跳-ACT

在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个答案

翟展
2023-03-14

下面是一个详细的教程,包含完整的代码:

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);
    }
}
许彦
2023-03-14

记录在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 ._.
 类似资料:
  • 我发现很难创建自己的openNLP模型。谁能告诉我,如何拥有自己的模型。培训应该如何进行。 输入应该是什么,输出模型文件将存储在哪里。

  • 我的要求是像这样分析句子。“给我找一本饥饿的潮汐书。”或者“饥饿的潮水或破碎的镜子,哪一个更好。”饥饿的潮汐和破碎的镜子是书的名字,为此我需要创建一个自定义模型,在给定的令牌数组中找到书的标题。因此,稍后我可以根据给定的句子创建一个查询。请让我知道我如何做到这一点,或者如果有任何其他方法来分析这样的句子。

  • 我可能需要为OpenNLP创建一个自定义训练集,这将需要我手动注释很多条目。 为了让事情变得更容易,GUI解决方案可能是最好的主意(手动编写注释标签并不酷),我刚刚发现了看起来像我需要的BRAT。 BRAT可以导出带注释的文件(. ann),但我在OpenNLP的手册中没有找到任何对该文件类型的引用,我不确定这是否可行。 我想做的是从BRAT导出这个带注释的文件并使用它来训练OpenNLP的模型,

  • 问题内容: 我必须用很多空手和当地的术语来分析非正式的英语文本。因此,我正在考虑为斯坦福标签创建模型。 如何为斯坦福标记者创建自己的标记语料库集以进行培训? 语料库的语法是什么?我的语料库应该达到多长时间才能达到理想的性能? 问题答案: 要训​​练PoS标记器,请参阅此邮件列表帖子,该帖子也包含在MaxentTagger类的JavaDocs中。 edu.stanford.nlp.tagger.ma

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

  • 我刚开始使用OpenNLP。我需要创建一个简单的训练模型来识别名称实体。