我正在评估OpenNLP用作文档分类程序。我有一个经过整理的训练语料库,其中包含大约150个类别的大约4k文件。文档中有很多共享的单词,大多数都是不相关的单词-但是这些单词中有很多变得以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结果”结果。
任何回应表示赞赏。