情感分析模型Streamlit界面输出异常:恒同结果及多分数问题
问题分析与解决方案
你的代码存在两个核心问题,直接导致了预测结果异常:
1. texts_to_sequences参数类型错误
Tokenizer.texts_to_sequences()要求输入字符串列表,但你直接传入了单个字符串txt。此时函数会把字符串的每个字符当作独立文本处理,生成大量单字符序列,这就是模型输出一堆分数的原因。
2. pad_sequences缺少关键参数
训练模型时你肯定指定了固定的序列长度,预测时如果不设置maxlen,pad_sequences会自动用当前输入的最长序列长度(此处为1)填充,和训练时的输入维度不匹配,导致模型预测结果完全失真。
修正后的完整代码
import streamlit as st import tensorflow as tf from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences import numpy as np import pickle with open("tokenizer.pkl", "rb") as f: tokenizer = pickle.load(f) # 替换为你训练模型时使用的maxlen值 MAX_SEQUENCE_LENGTH = 100 @st.cache(allow_output_mutation=True) def load_model(): model = tf.keras.models.load_model('C:/Users/k/Downloads/test/model_final.h5') return model if __name__ == '__main__': model = load_model() st.title('情感分析') txt = st.text_input('输入文本') if not txt: st.warning("请先输入文本") st.stop() else: # 关键:将单个字符串包装成列表 text = [txt] text_seq = tokenizer.texts_to_sequences(text) # 对齐训练时的序列长度 text_padded = pad_sequences(text_seq, maxlen=MAX_SEQUENCE_LENGTH) # 提取单个预测值 prediction = model.predict(text_padded)[0][0] st.title('分析结果: ') st.write(f"预测分数: {prediction:.4f}") if prediction > 0.5: st.write('正面') else: st.write('负面')
核心修改说明
- 把
text = txt改为text = [txt],确保texts_to_sequences处理单条文本的列表输入 - 添加
MAX_SEQUENCE_LENGTH并在pad_sequences中指定,保证输入维度与训练阶段一致 - 通过
[0][0]提取单个预测值,避免输出数组格式的冗余结果
内容的提问来源于stack exchange,提问作者krsnbcd
相关产品推荐
相关产品推荐

