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

OpenNLP文档分类培训

衡子安
2023-03-14

我正在尝试使用OpenNLP对发票进行分类。根据它的描述,我将它分为两类。我已经建立了一个包含20K描述的培训文件,并将每个描述标记到正确的类中。

培训数据如下所示(第一列是代码,我将其用作类,第二列是发票描述):

85171231 IPHONE 5S CINZA ESPACIAL 16GB (ME432BZA)
85171231 Galaxy S6 SM-G920I
85171231 motorola - MOTO G5 XT1672
00000000 MOTONETA ITALIKA AT110
00000000 CJ BOX UNIBOX MOLA 138X57X188 VINHO

使用OpenNLP的Document分类器,我实现了98.5%的正确率。但是,为了提高效率,我取了错误的分类文档并用它来扩展训练数据。

例如,当我第一次运行它时,“MOTONETA ITALIKA AT110”被归类为“85171231”。没关系,因为在第一次运行时,“MOTONETA ITALIKA AT110”没有被分类。所以,我教分类器明确地将“MOTONETA ITALIKA AT110”标记为“00000000”。

但是,再次运行它时,OpenNLP坚持将其归类为“85171231”,尽管训练数据包含一个指向“000000”的明确映射。

所以我的问题是:我在教OpenNLP吗?如何提高它的效率?

我使用的代码是:

MarkableFileInputStreamFactory dataIn = new MarkableFileInputStreamFactory("data.train");

ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, StandardCharsets.UTF_8);
ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream);

TrainingParameters params = new TrainingParameters();
params.put(TrainingParameters.ITERATIONS_PARAM, "100");
params.put(TrainingParameters.CUTOFF_PARAM, "0");

DoccatModel model = DocumentCategorizerME.train("pt", sampleStream, params, new DoccatFactory());

DocumentCategorizer doccat = new DocumentCategorizerME(model);
double[] aProbs = doccat.categorize("MOTONETA ITALIKA AT110".replaceAll("[^A-Za-z0-9 ]", " ").split(" "));
doccat.getBestCategory(aProbs);

共有1个答案

王炜
2023-03-14

默认情况下,DocumentCategorizer将使用单词包。这意味着不考虑术语的顺序。如果85171231组中出现频率较高的MOTONETA ITALIKA AT110的任何术语,分类器将倾向于使用该组。

您有几个选择:

  • 您可以将MOTONETA ITALIKA AT110的更多变体添加到组000000
  • 尝试更改特征生成器。

第二种选择是更改模型的创建,如下所示:

int minNgramSize = 2;
int maxNgramSize = 3;
DoccatFactory customFactory = new DoccatFactory(
    new FeatureGenerator[]{
        new BagOfWordsFeatureGenerator(),
        new NGramFeatureGenerator(minNgramSize, maxNgramSize)
    }
);
DoccatModel model = DocumentCategorizerME.train("pt", sampleStream, params, customFactory);

通过移除BagOfWordsFeatureGenerator并更改最小和最大ngram大小,可以使用特征生成器。

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

  • OpenNLP的性能明显低于我测试过的其他文档分类器,所以在我放弃它之前,我决定确保我在玩所有的刻度盘和旋钮。对我来说最突出的一件事是OpenNLP,它可以非常快地训练我的模型(大约1.2秒)。我使用过的其他NLP工具可能需要几分钟甚至几个小时的训练。我的培训档案中有大约12k条记录。 我试图将迭代次数从10次增加到10000次,不幸的是,它似乎对训练时间或准确性没有任何影响。 奇怪的是OpenN

  • 我试图将邮寄地址与简历(简历)隔离开来。简历来自许多不同的国家,因此没有标准的布局、格式、押韵或地址原因。 我有我的原始数据,这些数据已经被分割成句子和标记,并准备好标记。 问题: 如果我最感兴趣的是城市/城镇,我是否应该标记整个地址以获得最佳效果? 鉴于我寻找的地址主要出现在简历的前四分之一,我应该将训练数据削减到25%并对实时数据做同样的事情,还是通过将文档保持为一个整体并只标记我需要的部分来

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

  • 我想训练自己的自定义模型。我可以从哪里开始? 我使用这个样本数据来训练一个模型: 基本上,我想从给定的输入中找出一些无意义的文本。 我尝试了opennlp开发文档中给出的以下示例代码,但出现了错误:Model与name finder不兼容!

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