我怎样把一个中文文本分类项目,从训练脚本一路做到了 API 和前端

从 jieba 分词、TF-IDF 和随机森林开始,到 Flask 接口和 Streamlit 页面,这是一条更完整的中文文本分类落地链路。

学习路线:AI 入门与 PyTorch 基础(1~20) · 第 20 课
第 20 课黄昏里的开发者工作台,屏幕上是模糊的数据图和代码界面。
Learning Path

AI 入门与 PyTorch 基础(1~20)

从 AI 基本概念、机器学习任务、深度学习直觉、PyTorch 入门到中文文本分类项目全貌。

学完本阶段你能做到:能说清 AI、机器学习、深度学习、PyTorch 训练流程和一个中文文本分类项目的大致链路。

推荐读法:零基础建议顺序阅读;已有基础的读者可以把它当作路线地图和查漏补缺清单。

查看完整阶段 · 20 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「我怎样把一个中文文本分类项目,从训练脚本一路做到了 API 和前端」解决的核心问题
  • 知道它在「AI 入门与 PyTorch 基础(1~20)」中的位置
  • 把 分类与回归、Pipeline、TF-IDF 这些关键词联系起来

前置知识

  • 建议先读完上一篇:从垃圾短信识别项目里,我复盘了一个中文文本分类系统
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【Pipeline】Pipeline 让项目不再散落成一堆临时代码,也能减少训练和预测时步骤不一致的问题。 前面或后面会反复用到它。
  • 【TF-IDF】TF-IDF 会降低到处都出现的常见词权重,提高更能代表文本主题的词。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要只看模型分数,要把数据、特征、接口和复盘一起看。

课后练习

  • 用 3 句话向一个零基础朋友解释「我怎样把一个中文文本分类项目,从训练脚本一路做到了 API 和前端」。
  • 打开概念库里的「分类与回归」,补一遍它和本文的关系。
  • 回到路线页,选择下一阶段继续补齐。

自检练习与参考答案

1. 这个环节的输入和输出分别是什么?

项目文要先说清数据流。输入通常是原始数据或上一步结果,输出必须能被下一步稳定复用。

2. 如果训练和预测效果对不上,优先排查哪件事?

优先排查预处理是否一致,例如分词、TF-IDF 词表、标签映射、标准化器是否沿用训练阶段的同一套对象。

3. 为什么项目文章不能只看最终分数?

因为真实项目还要看数据质量、错误样本、部署入口、复用方式和失败边界。

这一阶段读完后,建议回到路线页选择下一阶段。

最近我又整理了一份中文文本分类项目笔记。和前一篇偏 RNN 的项目复盘不同,这次我更关注的是一条完整的落地路径:不仅训练模型,还把它接到了 API 和前端页面上。

这篇仍然是项目全貌,不是每个环节的最终讲解。你可以先看它怎样把训练、推理、接口和页面串起来;后续文本分类阶段会把“为什么这样分词、为什么这样向量化、怎样评估错误、怎样保存 Pipeline”逐步补齐。

如果说前一个项目让我理解了“模型怎么训练”,那这个项目更像是在回答另一个问题:一个文本分类模型,怎样才能从脚本跑到一个可以被别人直接使用的小系统。

第 20 课视频 · 文本分类:从训练到 API 和前端(约 1 分 45 秒)

这个项目做了什么

项目核心目标很直接:完成一个中文文本分类系统。

整个方案用到的主线是:

  • jieba 做中文分词
  • TF-IDF 做文本特征向量化
  • 随机森林完成分类
  • Flask 暴露预测接口
  • Streamlit 搭一个可交互页面

它不是那种只停留在“训练一下模型,打印个准确率”的项目,而是把训练、评估、推理、接口和前端都串了起来。

我理解的完整流程

这份笔记里最有价值的部分,是它把整个链路写得很清楚。

可以把这条流程压缩成下面这样:

原始文本数据 -> 数据分析 -> 中文分词与预处理 -> TF-IDF 向量化 -> 随机森林训练 -> 保存模型 -> 离线预测评估 -> Flask API -> Streamlit 前端

这意味着项目不只是“会训练”,而是已经有了一个比较完整的小型应用雏形。

为什么我觉得这个项目很适合入门

因为它刚好覆盖了中文文本分类里几个特别典型的环节,而且每一步都很容易看清楚作用。

1. 先做 EDA,而不是一上来就训练

项目第一步不是训练模型,而是先分析数据。

这一步主要看:

  • 样本总量够不够
  • 各类别是否均衡
  • 文本长度分布怎么样
  • 有没有异常长文本或空文本

这件事看起来不炫,但很重要。因为很多模型效果问题,本质上都不是模型本身,而是数据结构没先看清。

2. 让中文文本先变成机器能读的格式

中文文本分类里,模型不能直接拿句子就训练,所以必须先做分词和向量化。

这个项目的处理方式比较标准:

  • jieba.lcut() 分词
  • 把词语用空格拼起来
  • 交给 TfidfVectorizer 转成数值特征

这样做的好处是路径清晰、可解释性强,而且特别适合刚开始搭中文分类项目时使用。

3. 模型选择不复杂,但足够实用

这里没有一上来就堆很重的深度学习结构,而是用了随机森林。

我反而觉得这是一个优点。因为在很多入门或中小型文本分类任务里,TF-IDF + 传统分类器 依然是非常好的基线方案:

  • 训练快
  • 结果稳定
  • 调试容易
  • 对流程理解帮助很大

它也提醒我一件事:不是所有文本分类问题都必须从 Transformer 开始。

这条链路里我最喜欢的部分

最让我喜欢的是,这份笔记没有把项目停在模型训练,而是继续往后走了两步。

用 Flask 做预测接口

模型训练完成以后,通过 Flask 提供 /predict 接口,这样外部系统就可以通过 HTTP 请求拿到预测结果。

这一步的意义很大,因为它把“本地脚本”变成了“可调用能力”。

从这里开始,模型就不只是你自己电脑里的一段代码,而是一个能和其他模块连接的小服务。

用 Streamlit 做交互页面

再往后,项目还接了一个 Streamlit 页面。

这样做的好处是:

  • 可以直接输入文本观察分类结果
  • 不需要每次手工运行脚本
  • 更适合演示和汇报

很多时候,一个能直接操作的页面,比一堆训练日志更容易让人理解项目到底做成了什么。

这份笔记也暴露了几个很真实的问题

虽然这条链路已经很完整了,但从复盘角度看,还是能发现几个常见问题。

配置文件有重复

笔记里同时出现了根目录的 config.pydata/HF_config.py 两套配置方式。

这在练项目阶段很常见,但实际做大之后会带来维护问题:不同工作目录、不同脚本入口,很容易把路径搞乱。

如果以后继续优化,我会优先把配置统一掉。

项目说明偏“逐行讲解”,但还可以再上一个台阶

现在这份材料对初学者很友好,因为几乎把每一段代码都解释了。

但如果要进一步变成更成熟的项目文档,还可以再补几个东西:

  • 每个模块之间的输入输出契约
  • 模型最终效果指标
  • 线上推理时的依赖和资源消耗
  • 错误样本分析

这些内容会让项目从“能学懂”变成“更能复用”。

传统特征方案适合打底,但未必是终点

TF-IDF + 随机森林 作为基线方案很好,但它更适合做稳定起步。

如果任务继续往复杂语义、长文本、上下文依赖更强的方向走,那后面还是可以继续尝试更强的模型结构。

但我反而觉得,这一步不应该太急。先把一条轻量、清晰、能跑通的链路搭稳,本身就是很重要的能力。

这次整理给我的提醒

我越来越觉得,一个项目真正值钱的地方,不只是模型本身,而是有没有形成一条完整链路。

从数据分析到预处理,从训练到保存模型,从接口到前端,这些环节串起来之后,项目才开始有了“可演示、可复用、可继续迭代”的感觉。

这也是我想把这篇文章留在博客里的原因。

它记录的不只是一个中文文本分类项目怎么写,更是在提醒我:技术学习最稳的方式,往往不是只理解某个算法,而是把一个小系统从头到尾亲手走通。

Discussion

留言讨论