【问题标题】:how to create our own training data for opennlp parser如何为 opennlp 解析器创建我们自己的训练数据
【发布时间】:2013-10-23 06:45:09
【问题描述】:

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

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

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: opennlp pos-tagger


    【解决方案1】:

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

    【讨论】:

    • 嗨@Daniel,感谢您的链接,我确实尝试过它并且工作正常,但现在的问题是它不是很准确。我的训练数据集大约 4 行大。是这个原因吗?我应该提供更多样化和更大的数据集吗?还有一件事,当我定义它应该使用的新标签时,它是否使用了这个词的上下文?
    • 是的,您需要使用(多于)四行数据。我认为还有一个默认截止值,因此在训练数据中至少没有出现 n 次的 POS 标签会被简单地忽略。为了进行测试,请尝试将截止设置为 0。
    • 太棒了!我想问一个跟进。是否可以重新训练模型?假设我一开始用 10,000 个句子训练它。然后我想再添加2个句子。我必须在 10002 个句子上再次训练整个东西,还是我可以重用已经训练过的模型并以某种方式用新数据增强它?
    【解决方案2】:

    这里有一个详细的教程和完整的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      相关资源
      最近更新 更多