我正在使用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所说,这使分类器不再可训练。 最佳答案
AbstractExternalizable.compileTo()方法仅调用要序列化的对象的compileTo()方法,并将输出发送到指定的文件。
由于DynamicLMClassifier.compileTo()方法产生的LMClassifier
就是反序列化时得到的。 LMClassifier几乎是同一件事,如果有的话,则更高效,更紧凑,主要区别在于它不可训练。因此,如果您打算在分类器最初创建后继续对其进行训练,那么这只是一个问题。
如果需要继续训练分类器,则可以分别序列化LanguageModels(大多数LanguageModels实现Compilable),并通过调用动态分类器的构造函数并将其传递给反序列化模型列表来重新创建动态分类器。我从未尝试过这种方法,但是我相信这是推荐的方法,尤其是在重构了LingPipe对象的序列化之后。