【发布时间】:2020-12-14 06:55:56
【问题描述】:
我正在评估将 OpenNLP 用作文档分类器。我有一个经过清理的训练语料库,包含大约 4k 个文件,大约 150 个类别。文档中有许多共享的、大部分不相关的词 - 但其中许多词在 n-gram 中变得相关,所以我使用以下参数:
TrainingParameters params = new TrainingParameters();
params.put(TrainingParameters.ITERATIONS_PARAM, 20000);
params.put(TrainingParameters.CUTOFF_PARAM, 10);
DoccatFactory dcFactory = new DoccatFactory(new FeatureGenerator[] { new NGramFeatureGenerator(3, 10) });
params.put(AbstractTrainer.ALGORITHM_PARAM, NaiveBayesTrainer.NAIVE_BAYES_VALUE);
其中一些类别适用于几乎完全相同的文档(想想样板法律文档,文档实例之间可能只有名称和地址不同) - 并且与测试集中的文档大部分相同。但是,无论我如何调整这些参数,我都无法摆脱“1 个结果模式”的结果。运行测试时,测试集中的每个文档都被标记为“A 类”。
通过从以前使用 BagOfWordsFeatureGenerator 到 NGramFeatureGenerator,以及从 maxent 到 Naive Bayes,我确实设法对输出进行了一个小的更改;在更改之前,测试集中的每个文档都被分配到“A 类”,但在更改之后,所有文档现在都被分配到“B 类”。但除此之外,我似乎根本无法移动表盘。
我试过摆弄迭代、截止、ngram 大小、使用 maxent 代替贝叶斯等;但都无济于事。
我在互联网上找到的教程示例代码使用了更小的训练集和更少的迭代,并且能够执行至少一些基本的差异化。
通常在这种情况下 - 令人困惑的缺乏预期行为 - 工程师忘记按下一些简单的开关,或者对基本知识有一些致命的缺乏。我非常有能力应对这两种失败。此外,我没有接受过数据科学培训,尽管我已经阅读了 O'Reilly 的几本关于该主题的书籍。所以问题可能是程序性的。训练集是否太小?迭代次数是否减少了一个数量级?不同的算法会更合适吗?令我感到非常惊讶的是,没有任何调整使表盘远离“1 个结果”的结果。
感谢任何回应。
【问题讨论】:
标签: nlp data-science naivebayes opennlp maxent