我需要训练Opennlp中的Chunker将训练数据分类为名词短语。我该怎么办?在线文档没有解释如何在没有命令行的情况下执行此操作,并将其合并到程序中。它说使用en-chunker.train,但你如何制作该文件?
编辑:@Alaye 运行你在答案中给出的代码后,我得到以下错误,我无法修复:gprof bel gmon.out > output
(我的en-chunker.train只有你的样本数据集的前2行和最后一行。) 你能告诉我为什么会这样,以及如何解决它?
EDIT2:我让Chunker工作,但是当我将训练集中的句子改为除你在答案中给出的句子之外的任何句子时,它会出错。你能告诉我为什么会这样吗?
答案 0 :(得分:4)
训练数据的样本句子:
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP
account NN I-NP
deficit NN I-NP
will MD B-VP
narrow VB I-VP
to TO B-PP
only RB B-NP
# # I-NP
1.8 CD I-NP
billion CD I-NP
in IN B-PP
September NNP B-NP
. . O
这是你创建en-chunk.train文件的方法,你可以使用CLI创建相应的.bin文件:
$ opennlp ChunkerTrainerME -model en-chunker.bin -lang en -data en-chunker.train -encoding
或使用API
public class SentenceTrainer {
public static void trainModel(String inputFile, String modelFile)
throws IOException {
Objects.nonNull(inputFile);
Objects.nonNull(modelFile);
MarkableFileInputStreamFactory factory = new MarkableFileInputStreamFactory(
new File(inputFile));
Charset charset = Charset.forName("UTF-8");
ObjectStream<String> lineStream =
new PlainTextByLineStream(new FileInputStream("en-chunker.train"),charset);
ObjectStream<ChunkSample> sampleStream = new ChunkSampleStream(lineStream);
ChunkerModel model;
try {
model = ChunkerME.train("en", sampleStream,
new DefaultChunkerContextGenerator(), TrainingParameters.defaultParams());
}
finally {
sampleStream.close();
}
OutputStream modelOut = null;
try {
modelOut = new BufferedOutputStream(new FileOutputStream(modelFile));
model.serialize(modelOut);
} finally {
if (modelOut != null)
modelOut.close();
}
}
}
主要方法是:
public class Main {
public static void main(String args[]) throws IOException {
String inputFile = "//path//to//data.train";
String modelFile = "//path//to//.bin";
SentenceTrainer.trainModel(inputFile, modelFile);
}
}
参考:此blog
希望这有帮助!
PS:在.txt文件中收集/写入上述数据,并使用.train扩展名重命名,甚至可以使用trainingdata.txt。这就是你制作.train文件的方式。