Keras Tokenizer处理新文本返回空序列致不同输入预测结果一致
问题原因
核心问题是待预测的新文本没有经过和训练集完全一致的预处理流程,和你提到的全零序列类问题触发逻辑不同。
你的测试集预测正常,是因为X_test['clean_txt']和训练集语料走了完全相同的清洗、格式化流程,分词器是在这批清洗后的语料上拟合的,自然能正常识别词元。
你手动传入的原始字符串没有走匹配的清洗流程,所有词都匹配不到分词器的词表,所以texts_to_sequences直接返回空列表。之后pad_sequences把空列表填充为长度150的全零向量,不管你输入什么原始文本,喂给模型的都是一模一样的全零输入,当然会返回完全相同的预测结果。
常见的预处理不匹配场景包括:
- 训练时把所有文本转成了小写,你传入的新文本包含大写词(比如测试用例里的
Mathematics,分词器只认识训练语料里的小写mathematics) - 训练时移除了停用词、特殊符号,做了词干提取/词形还原,你传入的是未处理的原始文本
- 训练时的
clean_txt是经过特殊格式化的(比如自定义分词后的拼接结果、n-gram组合),和你传入的空格分隔普通文本格式不一致
修复方法
- 把你训练阶段生成
clean_txt列的所有预处理步骤封装成独立的预处理函数,所有待预测的新文本必须先完整走完这套预处理流程,再送入分词器
参考示例如下,注意函数里的步骤必须和你训练时的清洗操作100%对齐,不能缺漏:
def clean_raw_text(raw_text): # 逐行复现你训练时的清洗逻辑,以下是常见操作示例,替换成你自己的实际步骤 text = raw_text.lower() # 转小写,如果你训练时做了这步就必须加 # 移除标点、特殊字符 # 过滤停用词 # 词干提取/词形还原 # 其他你在训练集清洗时做过的所有操作 return cleaned_text # 预测流程修正 raw_text = 'create a text classification code' processed_text = clean_raw_text(raw_text) token_seq = tokenizer.texts_to_sequences([processed_text]) # 先做校验,确认序列不为空 assert len(token_seq[0]) > 0, "预处理后的文本无匹配词元,请检查清洗流程" token_seq_padded = pad_sequences(token_seq, maxlen=pad_seq) pred = model.predict(token_seq_padded)
- 增加校验环节:每次转换完序列先打印结果,确认不是空列表、词元ID合法,再送入模型预测,避免全零输入的无效预测。
- 额外优化建议:实例化Tokenizer时可以设置
oov_token='<OOV>'参数,之后重新拟合分词器,这样即使遇到词表外的词,也会映射到固定的未登录词ID,不会直接丢弃词元导致序列为空。
内容的提问来源于stack exchange,提问作者Konstantinos Kyritsis
相关产品推荐
相关产品推荐

