Как сохранить CoreDocument в Stanford NLP на диск 2 - PullRequest
0 голосов
/ 29 декабря 2018

Следовал предложению профессора Мэннинга использовать ProtobufAnnotationSerializer и сделал что-то не так.

использовал serializer.writeCoreDocument в правильно работающем документе;Позже прочитайте записанный файл с парой = serializer.read;затем использовал pair.second InputStream p2 = pair.second;p2 был пустым, что приводило к нулевому указателю при запуске Pair pair3 = serializer.read (p2);

public void writeDoc(CoreDocument document, String filename ) {
    AnnotationSerializer serializer = new 
ProtobufAnnotationSerializer();
    FileOutputStream fos = null;
    try { 
        OutputStream ks = new FileOutputStream(filename);
        ks = serializer.writeCoreDocument(document, ks);
        ks.flush();
        ks.close();
    }catch(IOException ioex) {
        logger.error("IOException "+ioex);
    }
  }

public void ReadSavedDoc(String filename) {
    // Read
    byte[]kb = null;
    try {
        File initialFile = new File(filename);
        InputStream ks = new FileInputStream(initialFile);
        ProtobufAnnotationSerializer serializer = new 
ProtobufAnnotationSerializer();
        InputStream kis = new 
ByteArrayInputStream(ks.readAllBytes());
        ks.close();
        Pair<Annotation, InputStream> pair = serializer.read(kis);
        InputStream p2 = pair.second;
        int nump2 = p2.available();
        logger.info(nump2);
        byte[] ba = p2.readAllBytes();
        Annotation readAnnotation = pair.first;
        Pair<Annotation, InputStream> pair3 = serializer.read(p2);
        kis.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }  catch (ClassCastException e) {
        e.printStackTrace();
    } catch(Exception ex) {
        logger.error("Exception: "+ex);
        ex.printStackTrace();
    }

}   

1 Ответ

0 голосов
/ 29 декабря 2018

Эта строка не нужна и должна быть удалена:

Pair<Annotation, InputStream> pair3 = serializer.read(p2);

Если вы правильно установили readAnnotation, это конец процесса чтения / записи.p2 пусто, потому что вы уже прочитали все его содержимое.

Здесь есть наглядный пример использования сериализации:

https://github.com/stanfordnlp/CoreNLP/blob/master/itest/src/edu/stanford/nlp/pipeline/ProtobufSerializationSanityITest.java

У вас будеттакже построить CoreDocument из Annotation.

CoreDocument readDocument = new CoreDocument(readAnnotation);
...