java - 存储 DynamicLMClassifier (Lingpipe)

标签 java nlp

我正在使用 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/

相关文章:

Java 和 REST Web 服务 - GET 方法返回 JSONObject ["....."] 不是 JSONObject

java - 如何从gradle中的测试源引用子项目的生成工件

machine-learning - NLP 预训练模型的数据预处理(例如 ELMo、Bert)

python - 将文本分成句子 NLTK 与 spaCy

python - 需要帮助创建适当的模型来预测两个句子之间的语义相似性

nlp - StanleyCoreNLP : why two different data structures for cons. 解析和依赖解析?

machine-learning - word2vec 中互为标量倍数的词向量之间期望的语义关系是什么?

java - 无法在浏览器中打开新选项卡。它在同一选项卡中加载第二个网址

java - 我在使用嵌套 `if` 语句时遇到问题

java - 是否可以将泛型类型扩展到 Java 中的多个类?