You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

情感分析模型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:21:02