Java 将培训数据添加到现有模型(bin文件)

Java 将培训数据添加到现有模型(bin文件),java,text-mining,training-data,opennlp,Java,Text Mining,Training Data,Opennlp,我正在尝试使用OpenNLP将额外的培训数据添加到我的nl personTest.bin文件中。 现在的问题是,当我运行代码来添加额外的trainingsdata时,它会删除已经存在的数据,而只添加我的新数据 我如何添加额外的培训数据而不是替换它 我确实使用了以下代码(从中获得) 公共类列车名 { 公共静态void main(字符串[]args) { 火车(“nl”、“person”、“namen.txt”、“nl ner personTest.bin”); } 公共静态字符串序列(字符串lan

我正在尝试使用
OpenNLP
将额外的培训数据添加到我的
nl personTest.bin
文件中。 现在的问题是,当我运行代码来添加额外的trainingsdata时,它会删除已经存在的数据,而只添加我的新数据

我如何添加额外的培训数据而不是替换它

我确实使用了以下代码(从中获得)

公共类列车名
{
公共静态void main(字符串[]args)
{
火车(“nl”、“person”、“namen.txt”、“nl ner personTest.bin”);
}
公共静态字符串序列(字符串lang、字符串实体、InputStreamFactory inputStream、FileOutputStream modelStream){
Charset Charset=Charset.forName(“UTF-8”);
TokenNameFinderModel model=null;
ObjectStream sampleStream=null;
试一试{
ObjectStream lineStream=新的明文ByLineStream(inputStream,字符集);
sampleStream=新名称采样数据流(lineStream);
TokenNameFinderFactory nameFinderFactory=新的TokenNameFinderFactory();
model=NameFinderME.train(“nl”、“person”、sampleStream、TrainingParameters.defaultParams(),
nameFinderFactory);
}捕获(FileNotFoundException fio){
}捕获(io异常){
}最后{
试一试{
sampleStream.close();
}捕获(io异常){
}
}
BufferedOutputStream modelOut=null;
试一试{
modelOut=新的BufferedOutputStream(modelStream);
序列化(modelOut);
}捕获(io异常){
}最后{
if(modelOut!=null){
试一试{
modelOut.close();
}捕获(io异常){
}
}
}
return“培训模块出现问题。”;
}
公共静态字符串序列(字符串lang、字符串实体、字符串taggedCoprusFile、,
字符串(模型文件){
试一试{
InputStreamFactory inputStream=新的InputStreamFactory(){
FileInputStream FileInputStream=新的FileInputStream(“namen.txt”);
公共InputStream createInputStream()引发IOException{
返回fileInputStream;
}
};
返回列车(语言、实体、输入流、,
新的FileOutputStream(modelFile));
}捕获(例外e){
e、 printStackTrace();
}
return“培训模块出现问题。”;
} }
有人有解决这个问题的办法吗

因为如果我想有一个准确的训练集,我需要至少15K
我认为OpenNLP不支持扩展现有的二进制NLP模型

如果您有所有可用的培训数据,请收集所有数据,然后立即进行培训。你可以用。我修改了您的示例以使用另一个
InputStreamFactory

public String train(String lang, String entity, InputStreamFactory inputStream, FileOutputStream modelStream) {

    // ....
    try {
        ObjectStream<String> lineStream = new PlainTextByLineStream(trainingDataInputStreamFactory(Arrays.asList(
                new File("trainingdata1.txt"),
                new File("trainingdata2.txt"),
                new File("trainingdata3.txt")
        )), charset);

        // ...
    } 

    // ...
}

private InputStreamFactory trainingDataInputStreamFactory(List<File> trainingFiles) {
    return new InputStreamFactory() {
        @Override
        public InputStream createInputStream() throws IOException {
            List<InputStream> inputStreams = trainingFiles.stream()
                    .map(f -> {
                        try {
                            return new FileInputStream(f);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                            return null;
                        }
                    })
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());

            return new SequenceInputStream(new Vector<>(inputStreams).elements());
        }
    };
}
公共字符串序列(字符串lang、字符串实体、InputStreamFactory inputStream、FileOutputStream modelStream){
// ....
试一试{
ObjectStream lineStream=新的明文ByLineStream(trainingDataInputStreamFactory(Arrays.asList(
新文件(“trainingdata1.txt”),
新文件(“trainingdata2.txt”),
新文件(“trainingdata3.txt”)
)),字符集);
// ...
} 
// ...
}
私有InputStreamFactory培训数据InputStreamFactory(列出培训文件){
返回新的InputStreamFactory(){
@凌驾
公共InputStream createInputStream()引发IOException{
List inputStreams=trainingFiles.stream()
.map(f->{
试一试{
返回新的FileInputStream(f);
}catch(filenotfounde异常){
e、 printStackTrace();
返回null;
}
})
.filter(对象::非空)
.collect(Collectors.toList());
返回新的SequenceInputStream(新向量(inputStreams.elements());
}
};
}

我认为OpenNLP不支持扩展现有的二进制NLP模型

如果您有所有可用的培训数据,请收集所有数据,然后立即进行培训。你可以用。我修改了您的示例以使用另一个
InputStreamFactory

public String train(String lang, String entity, InputStreamFactory inputStream, FileOutputStream modelStream) {

    // ....
    try {
        ObjectStream<String> lineStream = new PlainTextByLineStream(trainingDataInputStreamFactory(Arrays.asList(
                new File("trainingdata1.txt"),
                new File("trainingdata2.txt"),
                new File("trainingdata3.txt")
        )), charset);

        // ...
    } 

    // ...
}

private InputStreamFactory trainingDataInputStreamFactory(List<File> trainingFiles) {
    return new InputStreamFactory() {
        @Override
        public InputStream createInputStream() throws IOException {
            List<InputStream> inputStreams = trainingFiles.stream()
                    .map(f -> {
                        try {
                            return new FileInputStream(f);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                            return null;
                        }
                    })
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());

            return new SequenceInputStream(new Vector<>(inputStreams).elements());
        }
    };
}
公共字符串序列(字符串lang、字符串实体、InputStreamFactory inputStream、FileOutputStream modelStream){
// ....
试一试{
ObjectStream lineStream=新的明文ByLineStream(trainingDataInputStreamFactory(Arrays.asList(
新文件(“trainingdata1.txt”),
新文件(“trainingdata2.txt”),
新文件(“trainingdata3.txt”)
)),字符集);
// ...
} 
// ...
}
私有InputStreamFactory培训数据InputStreamFactory(列出培训文件){
返回新的InputStreamFactory(){
@凌驾
公共InputStream createInputStream()引发IOException{
List inputStreams=trainingFiles.stream()
.map(f->{
试一试{
返回新的FileInputStream(f);
}catch(filenotfounde异常){
e、 printStackTrace();
返回null;
}
})
.filter(对象::非空)
.collect(Collectors.toList());
返回新的SequenceInputStream(新向量(inputStreams.elements());
}
};
}

谢谢@Schrieveslaach@Patrick,仅供参考:我正在开发一个工具集,帮助您从带注释的语料库创建NLP模型。请看一看,如果您有任何问题,请告诉我。;-)谢谢,我会的