2017-10-12 10 views
1

J'essaie d'ajouter des données d'entraînement supplémentaires à mon fichier nl-personTest.bin avec OpenNLP. Maintenant, mon problème est que lorsque je cours mon code pour ajouter les données de formation supplémentaires, il supprime les données déjà existantes et ajoute seulement mes nouvelles données.Ajouter des données d'entraînement au modèle existant (fichier bin)

Comment puis-je simplement ajouter des données de formation supplémentaires au lieu de les remplacer?

J'ai utilisé le code suivant, (il a obtenu de Open NLP NER is not properly trained)

public class TrainNames 
    { 
    public static void main(String[] args) 
    { 
     train("nl", "person", "namen.txt", "nl-ner-personTest.bin"); 
    } 

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

     Charset charset = Charset.forName("UTF-8"); 
     TokenNameFinderModel model = null; 
     ObjectStream<NameSample> sampleStream = null; 
     try { 
      ObjectStream<String> lineStream = new PlainTextByLineStream(inputStream, charset); 
      sampleStream = new NameSampleDataStream(lineStream); 
      TokenNameFinderFactory nameFinderFactory = new TokenNameFinderFactory(); 
      model = NameFinderME.train("nl", "person", sampleStream, TrainingParameters.defaultParams(), 
       nameFinderFactory); 
     } catch (FileNotFoundException fio) { 

     } catch (IOException io) { 

     } finally { 
      try { 
       sampleStream.close(); 
      } catch (IOException io) { 

      } 
     } 
     BufferedOutputStream modelOut = null; 
     try { 
      modelOut = new BufferedOutputStream(modelStream); 
      model.serialize(modelOut); 
     } catch (IOException io) { 

     } finally { 
      if (modelOut != null) { 
       try { 
        modelOut.close(); 
       } catch (IOException io) { 

       } 
      } 
     } 
     return "Something goes wrong with training module."; 
    } 

    public static String train(String lang, String entity, String taggedCoprusFile, 
           String modelFile) { 
     try { 
      InputStreamFactory inputStream = new InputStreamFactory() { 
       FileInputStream fileInputStream = new FileInputStream("namen.txt"); 

       public InputStream createInputStream() throws IOException { 
        return fileInputStream; 
       } 
      }; 

      return train(lang, entity, inputStream, 
       new FileOutputStream(modelFile)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return "Something goes wrong with training module."; 
    } } 

Toute personne des idées pour résoudre ce problème? Parce que si je veux avoir un trainingset précis, je dois avoir au moins 15K phrases dit la documentation.

Répondre

0

Je pense qu'OpenNLP ne prend pas en charge l'expansion de modèles PNL binaires existants.

Si vous disposez de toutes les données d'entraînement, collectez-les toutes et entraînez-les immédiatement. Vous pouvez utiliser SequenceInputStream. J'ai modifié votre exemple utiliser un autre 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()); 
     } 
    }; 
} 
+0

Merci @Schrieveslaach – Patrick

+1

@Patrick, pour votre information: Je développe un ensemble d'outils qui vous permet de créer des modèles de la PNL à partir de corpus annoté. S'il vous plaît, jetez un oeil [ici] (https://git.noc.fh-aachen.de/marc.schreiber/Towards-Effective-NLP-Application-Development) et si vous avez des questions, faites le moi savoir. ;-) – Schrieveslaach

+0

Merci, je vais y jeter un coup d'œil. @ Schrieveslaach – Patrick