Spark NLP加载NER模型时inputCols错误/缺失问题求助
解决Spark NLP加载模型时的Wrong or Missing InputCols问题
问题根源
从你提供的模型元数据可以明确看到,BERT Embeddings组件的inputCols配置为["sentence","token"],但你预处理后的DataFrame中缺少sentence列,这就是报错的直接原因。模型训练时的Pipeline包含了SentenceDetector组件来生成sentence列,因此推理阶段必须提供完全匹配的输入列。
代码修正点
- 在预处理Pipeline中添加
SentenceDetector,生成模型依赖的sentence列 - 确保Tokenizer的输入列是
document(而非原始text),符合Spark NLP的标注流逻辑
修正后的完整代码
from pyspark.ml import PipelineModel import sparknlp from sparknlp.base import * from sparknlp.annotator import * from pyspark.ml import Pipeline spark = sparknlp.start() # 加载训练好的模型 loaded_model = PipelineModel.load("bert_diseases") # 构造输入数据 data = spark.createDataFrame([["I'd like to say we didn't expect that. Jane's boyfriend."]]).toDF("text") # 构建预处理Pipeline,包含模型需要的所有前置组件 documentAssembler = DocumentAssembler() \ .setInputCol("text") \ .setOutputCol("document") sentenceDetector = SentenceDetector() \ .setInputCols(["document"]) \ .setOutputCol("sentence") # 生成模型需要的sentence列 tokenizer = Tokenizer() \ .setInputCols(["document"]) \ .setOutputCol("token") # 组装预处理Pipeline并执行 preprocess_pipeline = Pipeline().setStages([documentAssembler, sentenceDetector, tokenizer]) processed_data = preprocess_pipeline.fit(data).transform(data) # 查看预处理后的列,确认包含document、sentence、token processed_data.select("document", "sentence", "token").show(truncate=False) # 调用模型进行推理 result = loaded_model.transform(processed_data) result.show()
额外注意事项
- 避免混淆
sparknlp.annotator.Tokenizer和pyspark.ml.feature.Tokenizer,前者生成的是Spark NLP的标注列,后者是普通文本列,模型只接受前者的输出 - 训练模型时的Pipeline组件配置(输入输出列名、组件顺序)必须和推理阶段完全一致,否则会出现输入不匹配的问题
内容的提问来源于stack exchange,提问作者padraig
相关产品推荐
相关产品推荐

