文本分类模型训练好以后,如果只能在 notebook 里运行,就很难给别人演示。
这一课不做正式部署,只做一个本地交互页面:输入一段中文文本,点击按钮,页面显示模型预测结果。
我们用 Streamlit,是因为它适合快速把 Python 脚本变成演示页面,不需要写 HTML/CSS/JavaScript。
本课目标
假设你已经有一个保存好的 Pipeline:
text
models/text_classifier_pipeline.joblib
它包含:
- TF-IDF 向量化器;
- 分类模型;
- 训练阶段的特征处理流程。
这节课要做的是:
text
加载模型
-> 输入文本
-> 分词或清洗
-> 调用 predict
-> 在页面展示结果
安装 Streamlit
先安装:
bash
pip install streamlit joblib jieba scikit-learn
如果你的模型训练时用到了别的库,也要在当前环境里安装同样依赖。
推荐目录结构
可以先用这个最小结构:
text
text-classifier-demo/
app.py
models/
text_classifier_pipeline.joblib
app.py 是页面入口,models 目录放模型文件。
写一个最小页面
先创建 app.py:
python
import streamlit as st
st.set_page_config(page_title="中文文本分类演示")
st.title("中文文本分类演示")
st.write("输入一段文本,查看模型预测类别。")
text = st.text_area("请输入文本", height=160)
if st.button("开始预测"):
if not text.strip():
st.warning("请先输入文本")
else:
st.success("这里显示预测结果")
运行:
bash
streamlit run app.py
如果页面能打开,说明 Streamlit 基础环境没问题。
加载模型
接着加载模型:
python
from pathlib import Path
import joblib
import streamlit as st
MODEL_PATH = Path("models/text_classifier_pipeline.joblib")
@st.cache_resource
def load_model():
return joblib.load(MODEL_PATH)
model = load_model()
这里用了 @st.cache_resource,作用是让模型只加载一次。否则页面每次刷新或交互都重新加载,会变慢。
加入文本预处理
如果你的 Pipeline 输入的是原始文本,可以直接传入原句。
如果你的 Pipeline 输入的是分词后的文本,就要保持和训练阶段一致:
python
import jieba
def cut_text(text):
return " ".join(jieba.lcut(str(text)))
预测时:
python
input_text = cut_text(text)
pred = model.predict([input_text])[0]
训练和预测的预处理必须一致。否则模型看到的特征空间会变。
完整预测代码
把页面和模型合起来:
python
from pathlib import Path
import jieba
import joblib
import streamlit as st
MODEL_PATH = Path("models/text_classifier_pipeline.joblib")
st.set_page_config(page_title="中文文本分类演示")
st.title("中文文本分类演示")
st.caption("输入中文文本,查看模型预测类别。")
@st.cache_resource
def load_model():
return joblib.load(MODEL_PATH)
def cut_text(text):
return " ".join(jieba.lcut(str(text)))
model = load_model()
text = st.text_area("请输入文本", height=180)
if st.button("开始预测"):
if not text.strip():
st.warning("请先输入文本")
else:
input_text = cut_text(text)
label = model.predict([input_text])[0]
st.success(f"预测类别:{label}")
这就是一个最小可运行版本。
如果模型支持置信度
有些模型支持 predict_proba():
python
if hasattr(model, "predict_proba"):
proba = model.predict_proba([input_text])[0]
classes = model.classes_
scores = dict(zip(classes, proba))
st.write(scores)
可以用表格展示,按概率从高到低排序:
python
import pandas as pd
score_df = pd.DataFrame({
"类别": classes,
"概率": proba,
}).sort_values("概率", ascending=False)
st.dataframe(score_df, use_container_width=True)
注意:概率不一定等于真实可信度。它只是模型的输出分布,仍然要结合测试集评估。
增加错误提示
模型文件不存在时,不要让页面直接崩掉:
python
if not MODEL_PATH.exists():
st.error("没有找到模型文件,请先训练并保存模型。")
st.stop()
这样别人打开页面时,也能知道问题出在哪里。
批量预测:上传 CSV 一次分类多条
单条输入演示够用以后,可以加一个文件上传组件,批量预测一个 CSV。核心是用 st.file_uploader 读文件,预测完用 st.dataframe 展示、st.download_button 导出:
python
import pandas as pd
st.title("批量文本分类")
uploaded_file = st.file_uploader("上传 CSV(至少包含 text 列)", type=["csv"])
if uploaded_file is not None:
df = pd.read_csv(uploaded_file)
st.write(f"共 {len(df)} 条待分类文本")
if st.button("开始批量分类"):
# 训练时如果分过词,这里也要走同样的分词
cut_texts = [cut_text(t) for t in df["text"].values]
df["预测类别"] = model.predict(cut_texts)
st.dataframe(df.head(50))
st.write("分类分布:")
st.bar_chart(df["预测类别"].value_counts())
csv = df.to_csv(index=False).encode("utf-8-sig")
st.download_button("下载结果 CSV", csv, "result.csv")
utf-8-sig 带 BOM,Excel 打开中文不会乱码。
Streamlit 的常用组件可以归成几类:
| 组件 | 作用 |
|---|---|
st.title / write / success |
页面元素:标题、文本、提示 |
st.text_area / file_uploader |
输入:多行文本、文件上传 |
st.button |
触发动作 |
st.dataframe / bar_chart |
展示:表格、图表 |
st.download_button |
导出 CSV |
核心思想是你写 Python,Streamlit 负责生成页面。
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 的价值是快速演示:
text
输入文本
-> 加载模型
-> 复用训练时的预处理
-> predict
-> 展示结果
它适合教学、验证和内部演示。正式部署还需要 API、日志、安全和环境管理。
下一阶段我们回到 PyTorch,先补 Tensor 进阶操作,再理解自动微分和计算图。
在线阅读
原文地址:https://bestsdz.xyz/posts/streamlit-text-classification-demo/