使用Streamlit部署情感分析模型时遭遇ValueError问题求助
使用Streamlit部署情感分析模型时遭遇ValueError问题求助
嘿,我完全懂你这种摸不着头脑的感觉——明明严格照着训练时的流程来做,怎么放到Streamlit里就跑不通了呢?别着急,我帮你揪出代码里的几个关键问题:
问题根源分析
- TF-IDF向量器不匹配:你在部署代码里重新初始化了
TfidfVectorizer并调用fit_transform(Xtrain),这会生成一个和训练模型时完全不同的词汇表!训练好的模型只认识它训练时用的那个TF-IDF向量器生成的特征,新拟合的向量器特征维度、词汇对应关系都变了,自然会预测失败。 - 输入格式错误:Streamlit的
st.text_input返回的是单个字符串,直接传给tf.transform()的话,它会把字符串的每个字符当成一个独立样本来处理,这显然不是你想要的,维度完全对不上。
修复后的代码
先确保你在训练模型的时候,把当时用的TF-IDF向量器也保存下来了(训练阶段要加这行):
# 训练阶段执行的保存步骤(你之前可能漏了这个) joblib.dump(tf, 'tfidf_vectorizer.pkl')
然后修改你的Streamlit部署代码:
import streamlit as st import numpy as np import pickle from sklearn.svm import LinearSVC from sklearn.feature_extraction.text import TfidfVectorizer import joblib import pandas as pd # 这里只需要加载保存好的模型和TF-IDF向量器,不需要重新加载数据集拟合! model = joblib.load('model.pkl') tf = joblib.load('tfidf_vectorizer.pkl') # 加载训练时用的向量器 st.title('Analisis Sentimen') txt = st.text_input('masukkan teks yang ingin dianalisis') # 只有当用户输入文本后才执行预测,避免空输入报错 if txt: # 把单个字符串转成列表,符合TF-IDF transform的输入要求 txt_input = [txt] # 用训练好的向量器转换输入文本,不需要转成DataFrame txt_vector = tf.transform(txt_input) # 直接用向量预测 pred = model.predict(txt_vector) print(pred) st.write(pred)
额外说明
- 为什么不需要重新加载数据集?因为训练时的TF-IDF向量器已经保存了所有需要的词汇信息,部署时不需要再碰训练数据,既节省资源又避免引入不一致性。
- 加个
if txt:判断是为了防止用户还没输入文本就触发预测,导致空输入的错误。
这样修改后,应该就能正常运行啦!
备注:内容来源于stack exchange,提问作者krsnbcd
相关产品推荐
相关产品推荐

