我正在使用 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
的类(class)应该是 LMClassifier<NGramProcessLM, MultivariateEstimator>
。因此它可以被初始化为 DynamicLMClassifier<NGramProcessLM>
并且在训练阶段有必要将其转换到 DynamicLMClassifier<NGramProcessLM>
。之后它可以被加载并用于对新对象进行分类。正如 @mjv 所说,这使得分类器不再可训练。
最佳答案
AbstractExternalizable.compileTo() 方法仅调用正在序列化的对象的compileTo() 方法,并将输出发送到指定的文件。
自 DynamicLMClassifier.compileTo()方法会生成一个LMClassifier
,这就是反序列化时得到的结果。 LMClassifier 几乎是一样的东西,如果有的话,它更高效、更紧凑,主要区别在于它不可训练;因此,如果您打算在初始创建后继续训练分类器,这只是一个问题。
如果需要继续训练分类器,可以单独序列化 LanguageModel(大多数 LanguageModel 实现 Compilable),并通过调用其构造函数并向其传递反序列化模型列表来重新创建动态分类器。我从未尝试过这种方法,但我相信这是推荐的方法,特别是现在 LingPipe 对象的序列化已被重构。
关于java - 存储 DynamicLMClassifier (Lingpipe),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12947090/