我是opennlp的新手,需要帮助来自定义解析器
我使用opennlp解析器和预先训练的模型en-pos-maxtent.bin来标记新的原始英语句子以及语音的相应部分,现在我想自定义标签。
例句: 狗跳过了墙。
使用en-pos-maxtent.bin进行POS标记后,结果为
狗 - NNP跳跃 - VBD
over-IN
- DT
墙 - NN
但是我想训练自己的模型并用我的自定义标签标记单词,如
DOG - PERP
跳了 - ACT
over-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”是什么?
这个文件的格式是什么?我们可以在这里指定自定义标签或者这个文件究竟是什么?
任何帮助将不胜感激
由于
答案 0 :(得分:4)
它记录在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 ._.
答案 1 :(得分:0)
以下是完整代码的详细教程:
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);
}
}