用 Streamlit 给文本分类模型做一个演示页面

📅 2026/7/21 22:41:54
用 Streamlit 给文本分类模型做一个演示页面
文本分类模型训练好以后如果只能在 notebook 里运行就很难给别人演示。这一课不做正式部署只做一个本地交互页面输入一段中文文本点击按钮页面显示模型预测结果。我们用 Streamlit是因为它适合快速把 Python 脚本变成演示页面不需要写 HTML/CSS/JavaScript。本课目标假设你已经有一个保存好的 Pipelinemodels/text_classifier_pipeline.joblib它包含TF-IDF 向量化器分类模型训练阶段的特征处理流程。这节课要做的是加载模型 - 输入文本 - 分词或清洗 - 调用 predict - 在页面展示结果安装 Streamlit先安装pipinstallstreamlit joblib jieba scikit-learn如果你的模型训练时用到了别的库也要在当前环境里安装同样依赖。推荐目录结构可以先用这个最小结构text-classifier-demo/ app.py models/ text_classifier_pipeline.joblibapp.py是页面入口models目录放模型文件。写一个最小页面先创建app.pyimportstreamlitasst st.set_page_config(page_title中文文本分类演示)st.title(中文文本分类演示)st.write(输入一段文本查看模型预测类别。)textst.text_area(请输入文本,height160)ifst.button(开始预测):ifnottext.strip():st.warning(请先输入文本)else:st.success(这里显示预测结果)运行streamlit run app.py如果页面能打开说明 Streamlit 基础环境没问题。加载模型接着加载模型frompathlibimportPathimportjoblibimportstreamlitasst MODEL_PATHPath(models/text_classifier_pipeline.joblib)st.cache_resourcedefload_model():returnjoblib.load(MODEL_PATH)modelload_model()这里用了st.cache_resource作用是让模型只加载一次。否则页面每次刷新或交互都重新加载会变慢。加入文本预处理如果你的 Pipeline 输入的是原始文本可以直接传入原句。如果你的 Pipeline 输入的是分词后的文本就要保持和训练阶段一致importjiebadefcut_text(text):return .join(jieba.lcut(str(text)))预测时input_textcut_text(text)predmodel.predict([input_text])[0]训练和预测的预处理必须一致。否则模型看到的特征空间会变。完整预测代码把页面和模型合起来frompathlibimportPathimportjiebaimportjoblibimportstreamlitasst MODEL_PATHPath(models/text_classifier_pipeline.joblib)st.set_page_config(page_title中文文本分类演示)st.title(中文文本分类演示)st.caption(输入中文文本查看模型预测类别。)st.cache_resourcedefload_model():returnjoblib.load(MODEL_PATH)defcut_text(text):return .join(jieba.lcut(str(text)))modelload_model()textst.text_area(请输入文本,height180)ifst.button(开始预测):ifnottext.strip():st.warning(请先输入文本)else:input_textcut_text(text)labelmodel.predict([input_text])[0]st.success(f预测类别{label})这就是一个最小可运行版本。如果模型支持置信度有些模型支持predict_proba()ifhasattr(model,predict_proba):probamodel.predict_proba([input_text])[0]classesmodel.classes_ scoresdict(zip(classes,proba))st.write(scores)可以用表格展示按概率从高到低排序importpandasaspd score_dfpd.DataFrame({类别:classes,概率:proba,}).sort_values(概率,ascendingFalse)st.dataframe(score_df,use_container_widthTrue)注意概率不一定等于真实可信度。它只是模型的输出分布仍然要结合测试集评估。增加错误提示模型文件不存在时不要让页面直接崩掉ifnotMODEL_PATH.exists():st.error(没有找到模型文件请先训练并保存模型。)st.stop()这样别人打开页面时也能知道问题出在哪里。批量预测上传 CSV 一次分类多条单条输入演示够用以后可以加一个文件上传组件批量预测一个 CSV。核心是用st.file_uploader读文件预测完用st.dataframe展示、st.download_button导出importpandasaspd st.title(批量文本分类)uploaded_filest.file_uploader(上传 CSV至少包含 text 列,type[csv])ifuploaded_fileisnotNone:dfpd.read_csv(uploaded_file)st.write(f共{len(df)}条待分类文本)ifst.button(开始批量分类):# 训练时如果分过词这里也要走同样的分词cut_texts[cut_text(t)fortindf[text].values]df[预测类别]model.predict(cut_texts)st.dataframe(df.head(50))st.write(分类分布)st.bar_chart(df[预测类别].value_counts())csvdf.to_csv(indexFalse).encode(utf-8-sig)st.download_button(下载结果 CSV,csv,result.csv)utf-8-sig带 BOMExcel 打开中文不会乱码。Streamlit 的常用组件可以归成几类组件作用st.title / write / success页面元素标题、文本、提示st.text_area / file_uploader输入多行文本、文件上传st.button触发动作st.dataframe / bar_chart展示表格、图表st.download_button导出 CSV核心思想是你写 PythonStreamlit 负责生成页面。Streamlit 演示不是正式部署这一课只把模型做成演示页面不等于正式线上服务。正式部署还要考虑依赖文件如何管理模型文件如何上传多用户同时访问日志和异常处理输入长度限制敏感内容过滤API 鉴权和安全。本地运行用streamlit run app.py浏览器会打开http://localhost:8501。如果想上线给别人用可以把app.py加模型加requirements.txt推到 GitHub用 Streamlit Cloud 或 Hugging Face Spaces 自动部署。但前面那些工程化问题仍然要单独处理。常见错误模型路径写错本地运行时相对路径以命令执行目录为准。建议用Path管理路径。预测前忘记分词如果训练时使用的是分词后的文本页面输入也要走同样分词。模型和依赖版本不一致joblib加载模型依赖 Python 对象结构。训练环境和演示环境里的 scikit-learn 版本差异太大可能加载失败。页面显示概率但不解释含义概率只是模型估计不代表一定正确。不要在页面上写成“准确率”。小结Streamlit 的价值是快速演示输入文本 - 加载模型 - 复用训练时的预处理 - predict - 展示结果它适合教学、验证和内部演示。正式部署还需要 API、日志、安全和环境管理。下一阶段我们回到 PyTorch先补 Tensor 进阶操作再理解自动微分和计算图。在线阅读点击这里阅读博客原文原文地址https://bestsdz.xyz/posts/streamlit-text-classification-demo/