当前位置: 首页 > 知识库问答 >
问题:

为什么OpenNLP的文档分类器训练得这么快?

秦光启
2023-03-14

OpenNLP的性能明显低于我测试过的其他文档分类器,所以在我放弃它之前,我决定确保我在玩所有的刻度盘和旋钮。对我来说最突出的一件事是OpenNLP,它可以非常快地训练我的模型(大约1.2秒)。我使用过的其他NLP工具可能需要几分钟甚至几个小时的训练。我的培训档案中有大约12k条记录。

我试图将迭代次数从10次增加到10000次,不幸的是,它似乎对训练时间或准确性没有任何影响。

奇怪的是OpenNLP的文档中关于训练持续时间的陈述如下:“现在可能是巡航到Hulu或其他地方的好时机,因为如果您有一个大型训练集,这可能需要一段时间”。这让我觉得我做错了什么。

            int TRAINING_ITERATIONS = 10000;

            InputStreamFactory dataIn = new MarkableFileInputStreamFactory(new File(dataSetFileName));
            ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, "UTF-8");
            ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream);

            // define the training parameters
            TrainingParameters params = new TrainingParameters();
            params.put(TrainingParameters.ITERATIONS_PARAM, TRAINING_ITERATIONS+"");
            params.put(TrainingParameters.CUTOFF_PARAM, 0+"");
            params.put(AbstractTrainer.ALGORITHM_PARAM, NaiveBayesTrainer.NAIVE_BAYES_VALUE);

            FeatureGenerator[] featureGenerators = { new NGramFeatureGenerator(1,1),
                    new NGramFeatureGenerator(2,3) };
            DoccatFactory factory = new DoccatFactory(featureGenerators);


            // create a model from training data
            StopWatch stopWatch = new StopWatch();

            // Start the watch, do some task and stop the watch.
            stopWatch.start();


            model = DocumentCategorizerME.train("en", sampleStream, params, factory);
            stopWatch.stop();
            System.out.println("Training Time: " + stopWatch.getTime()+"ms"); // finishes in 1.2 second!!! 

这是我得到的结果

Indexing events with TwoPass using cutoff of 0

    Computing event counts...  done. 2407 events
    Indexing...  done.
Collecting events... Done indexing in 0.84 s.
Incorporating indexed data for training...  
done.
    Number of Event Tokens: 2407
        Number of Outcomes: 12
      Number of Predicates: 44219
Computing model parameters...
Stats: (455/2407) 0.18903199002908183
...done.
Training Time: 1241ms

迭代参数有什么作用吗?

共有1个答案

徐经武
2023-03-14

好吧,我想出来了,朴素贝叶斯是一个非常快速的算法,因为它没有优化步骤。迭代次数参数实际上没有太多作用。如果你使用其中的任何其他训练算法,训练确实需要很长时间。令人惊讶的是,对于我的数据集,其他算法也会导致更差的准确性,尽管我对它进行了数小时的训练。

 类似资料:
  • 我试图用下面的代码训练模型,但我一直在方法上收到错误,它告诉我将更改为。为什么?

  • 我正在尝试使用OpenNLP对发票进行分类。根据它的描述,我将它分为两类。我已经建立了一个包含20K描述的培训文件,并将每个描述标记到正确的类中。 培训数据如下所示(第一列是代码,我将其用作类,第二列是发票描述): 使用OpenNLP的Document分类器,我实现了98.5%的正确率。但是,为了提高效率,我取了错误的分类文档并用它来扩展训练数据。 例如,当我第一次运行它时,“MOTONETA I

  • 我遵循的留档。我能够理解句子检测、标记器、名称查找器。但是我被分类器卡住了。原因是,我不明白,如何创建分类模型。 我确实明白我需要创建一个文件。格式非常清楚,它需要是一个类别空间和一个单行文档。以扩展名保存文件。 所以我创建了以下文件: 我给这个命令- Opennlp DoccatTrainer模型en-doccat.binlang en数据en-doccat.train编码UTF-8 它开始做某

  • 译者:bat67 最新版会在译者仓库首先同步。 目前为止,我们以及看到了如何定义网络,计算损失,并更新网络的权重。 现在可能会想, 数据呢? 通常来说,当必须处理图像、文本、音频或视频数据时,可以使用python标准库将数据加载到numpy数组里。然后将这个数组转化成torch.*Tensor。 对于图片,有Pillow,OpenCV等包可以使用 对于音频,有scipy和librosa等包可以使用

  • 我训练OpenNLP NER模型来检测一个新实体,但当我使用这个模型时,我遇到了以下异常: 我使用的是OpenNLP 1.6.0版,源代码如下: 谁能帮我解决这个问题。。

  • 我正在尝试使用opennlp处理文档分类器。但是我对训练文件有困难。当opennlp读取文件时,我收到以下错误: 我的培训文件如下所示: 我没有得到我可能错过的东西。