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

如何为opennlp解析器创建我们自己的训练数据,opennlp,pos-tagger,Opennlp,Pos Tagger,我是opennlp新手,需要帮助来定制解析器 我已经使用opennlp解析器和预先训练好的模型en-pos-maxtent.bin来标记新的原始英语句子和相应的词性,现在我想定制标记 例句: 狗跳过了墙 使用en-POS-maxtent.bin进行词性标注后,结果将为 狗-NNP 跳变VBD 过度使用 -DT wall-NN 但是我想训练我自己的模型,并用我的自定义标签标记单词,如 狗犯 突然行动 超视距 奥思 墙-OBJ 其中PERP、ACT、OTH、OBJ是适合我需要的标签。这可能吗 我查看

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

我已经使用opennlp解析器和预先训练好的模型en-pos-maxtent.bin来标记新的原始英语句子和相应的词性,现在我想定制标记

例句: 狗跳过了墙

使用en-POS-maxtent.bin进行词性标注后,结果将为

狗-NNP

跳变VBD

过度使用

-DT

wall-NN

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

狗犯

突然行动

超视距

奥思

墙-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”);
ObjectStream lineStream=新的明文ByLineStream(数据输入,“UTF-8”);
ObjectStream sampleStream=新单词TagSampleStream(lineStream);
model=POSTaggerME.train(“en”,sampleStream,TrainingParameters.defaultParams(),null,null);
}
捕获(IOE异常){
//读取或分析培训数据失败,培训失败
e、 printStackTrace();
}
我不明白这列火车是什么

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

任何帮助都将不胜感激

谢谢

每行记录一句话,单词与标签之间用下划线隔开:

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

以下是详细的教程,其中包含完整的代码:

根据您的域,您可以自动或手动构建数据集。手动构建这样一个数据集可能非常痛苦,像这样的工具可以帮助简化这个过程

训练数据格式

培训数据作为文本文件传递,其中每行是一个数据项。行中的每个单词都应以类似“word_LABEL”的格式进行标记,单词和标签名称之间用下划线“\u”分隔

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,它保存实际的模型。我们用我来做模型制作。下面是从训练数据文件构建模型的代码

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;

}
公共POS模型列车(字符串文件路径){
POSModel=null;
TrainingParameters=TrainingParameters.defaultParams();
parameters.put(TrainingParameters.ITERATIONS_PARAM,“100”);
试一试{
try(InputStream dataIn=newfileinputstream(filepath)){
ObjectStream lineStream=新的PlainTextByLineStream(新的InputStreamFactory()){
@凌驾
公共InputStream createInputStream()引发IOException{
返回数据输入;
}
},标准字符集。UTF_8);
ObjectStream sampleStream=新单词TagSampleStream(lineStream);
model=postagerme.train(“en”,sampleStream,参数,新的postagerFactory());
收益模型;
}
}
捕获(例外e){
e、 printStackTrace();
}
返回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);
    }
}
public void点标记(POSModel模型,字符串输入){
input=input.trim();
POSTaggerME tagger=新的POSTaggerME(型号);
Sequence[]sequences=tagger.topKSequences(input.split(“”));
对于(序列s:序列){
List tags=s.getoutcouts();
System.out.println(Arrays.asList(input.split(“”)+“=>”+标记);
}
}

hi@Daniel,谢谢你的链接,我试过了,效果很好,但现在的问题是它不是很准确。我的训练数据集大约有4行大。这就是原因吗?我是否应该提供更多样化和更大的数据集?还有一件事,在我定义它应该使用的新标记时,它是否使用了单词的上下文?是的,您需要使用(远)多于四行的数据。我认为还有一个默认的截止点,这样在训练数据中没有出现至少n次的POS标记就被忽略了。对于测试,请尝试将截止值设置为0.0!我想问一个后续问题。有可能对模型进行再培训吗?假设我一开始训练10000个句子。然后我想再加上两个句子。我需要用10002句话再次训练整个过程吗?或者我可以重用已经训练过的模型,并以某种方式用新数据扩充它吗?