首页 > 解决方案 > CRFClassifier:从流中加载模型给出异常“无效的流标头:1F8B0800”

问题描述

我正在尝试CRFClassifier从文件加载模型。这种方式有效:

// this works
classifier = CRFClassifier.getClassifier("../res/stanford-ner-2018-02-27/classifiers/english.all.3class.distsim.crf.ser.gz");

但是,当我想使用 streaminvalid stream header: 1F8B0800时,出现异常:

// this throws an exception
String modelResourcePath = "../res/stanford-ner-2018-02-27/classifiers/english.all.3class.distsim.crf.ser.gz";
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(modelResourcePath));
classifier = CRFClassifier.getClassifier(stream);

例外:

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 1F8B0800
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:866)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1473)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1456)
at edu.stanford.nlp.ie.crf.CRFClassifier.getClassifier(CRFClassifier.java:2890)
at com.sv.research.ner.stanford.StanfordEntityExtractor.<init>(StanfordEntityExtractor.java:34)
at com.sv.research.ner.stanford.StanfordEntityExtractor.main(StanfordEntityExtractor.java:59)

我希望这两种方式都是等价的。我通过流加载的原因是最终我想使用以下方式从 JAR 资源加载模型:

stream = ClassLoader.getSystemClassLoader().getResourceAsStream(modelResourcePath));

标签: stanford-nlp

解决方案


据我从他们的来源看到的,您尝试使用的分类器的方式是通过 GZIPInputStream 序列化的。

那么您可以尝试反序列化它们序列化的方式,如下所示:

BufferedInputStream stream = new BufferedInputStream(new GZIPInputStream(new FileInputStream(modelResourcePath)));

干杯


推荐阅读