【问题标题】:SparkNLP PipelineModel which includes AnnotatorApproach in stagesSparkNLP PipelineModel,分阶段包含 AnnotatorApproach
【发布时间】:2021-12-29 16:28:04
【问题描述】:

在 SparkNLP 的 PipelineModel 中,所有阶段都必须是 AnnotatorModel 类型。但是,如果其中一个注释器模型需要数据集中的某个列作为输入,而该输入列是 AnnotatorApproach 的输出,该怎么办?

例如,我有一个训练有素的 NER 模型(作为管道的最后阶段),它需要令牌和 POS 标签作为两个输入。 POS 标记器也需要令牌。但 Tokenizer 是 AnnotatorApproach,我无法将其添加到管道中。

这是 Tokenizer 的实例化方式(在 Java 中):

AnnotatorApproach<TokenizerModel> tokenizer = new Tokenizer();

这行得通:

Pipeline pipeline = new Pipeline().setStages( new PipelineStage[]{tokenizer} );

但这不起作用,因为 Tokenizer 不是 Transformer:

List<Transformer> list;
list.add(tokenizer);
PipelineModel pipelineModel = new PipelineModel("ID42", list);

【问题讨论】:

  • 一种解决方法似乎是构造一个 Pipeline 而不是 PipelineModel,然后在此管道上调用 fit(data).transform(data)。这可行,但不知何故似乎违反直觉。也许我在这里遗漏了一些重要的概念点。
  • PS:另一个问题是,由于性能原因,我想使用LightPipeline 进行预测。但是,我无法从Pipeline 构造LightPipeline,只能从PipelineModel 构造。

标签: java apache-spark nlp johnsnowlabs-spark-nlp


【解决方案1】:

始终拟合管道将为您返回一个准备好进行推理的管道,即使您拟合空数据集也是如此。 如果您只依赖不需要培训的注释器,那也没关系。 这是推荐的用法,在通常没有必要的情况下操作各个阶段,很麻烦,并且可能导致错误。

【讨论】:

  • 非常感谢@Alberto 的帮助。这使它更清楚。因此,一个解决方案是创建一个预处理管道并将其安装在一个空数据帧上以接收一个 PipelineModel。然后可以将此 PipelineModel 与预训练的模型组合成一个两阶段的 PipelineModel,从中可以构建 LightPipeline。请注意:空数据集仍然必须具有预期数据的模式。这可能会使为复杂数据类型预先构建它有点棘手。
  • 确实如此,但大多数时候在 NLP 管道中您输入的是一个字符串列,所以这样做,empty_data = spark.createDataFrame([[""]]).toDF("text")在大多数情况下就足够了
猜你喜欢
  • 2017-12-03
  • 2016-12-04
  • 2019-04-15
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2022-12-30
  • 2018-05-22
  • 2020-01-21
相关资源
最近更新 更多