我正在使用lingpipe进行情绪分析(遵循this代码),我正在尝试在训练后存储分类器。问题是存储后我无法加载它:
java.lang.ClassCastException: com.aliasi.classify.LMClassifier cannot be cast to com.aliasi.classify.DynamicLMClassifier
为了存储我使用的分类器:
AbstractExternalizable.compileTo(mClassifier, classifierFile);
并加载它:
mClassifier = (DynamicLMClassifier<NGramProcessLM>) AbstractExternalizable.readObject(classifierFile);
编辑:
我之前应该读过lingpipe的javadoc。要存储分类器并在之后加载mClassifier
的类应为LMClassifier<NGramProcessLM, MultivariateEstimator>
。因此,它可以初始化为DynamicLMClassifier<NGramProcessLM>
,在训练阶段,有必要将其强制转换为DynamicLMClassifier<NGramProcessLM>
。在此之后,它可以被加载并用于分类新对象。正如@mjv所说,这使分类器不再可训练。
答案 0 :(得分:1)
AbstractExternalizable.compileTo()方法只调用被序列化对象的compileTo()方法,并将输出发送到指定的文件。
由于DynamicLMClassifier.compileTo()方法产生的LMClassifier
是您反序列化时获得的结果。 LMClassifier几乎是一回事,如果有的话,效率更高,更紧凑,主要区别在于它不可训练;因此,如果您打算在初始创建后继续训练分类器,那么这只是一个问题。
如果您需要继续训练分类器,您可以单独序列化LanguageModel(大多数LanguageModel实现Compilable),并通过调用其构造函数并将其传递给反序列化模型列表来重新创建动态分类器。我从来没有尝试过这种方法,但我相信这是推荐的方法,特别是现在已经重构了LingPipe对象的序列化。