用 Python 写一个“可落地”的人工智能文本分类:从数据到模型到上线示例
用 Python 写一个“可落地”的人工智能文本分类:从数据到模型到上线示例
很多人学“人工智能”时会卡在两个点:一是代码能跑但不知道在做什么;二是看起来很厉害但离“能用”很远。这篇文章我用一个最常见、最容易落地的任务——文本分类(比如情感分类/垃圾信息识别/工单分流)——带你从零到一写出一个能训练、能评估、能预测、还能保存上线的 Python AI 示例。
你会得到什么?
- 一份可直接运行的 Python 示例(含训练 + 评估 + 推理 + 保存/加载)
- 讲清楚:数据怎么准备、特征怎么做、模型怎么选、上线怎么用
- 不依赖复杂深度学习,也不需要大显卡(先把“能用”做出来)
1)任务定义:我们要做什么?
我们做一个小型“情感分类器”:
- 输入:一句文本(例如用户反馈、评论、工单内容)
- 输出:
positive(正向)或negative(负向)
实际业务里可以换成:
- “是否垃圾信息”
- “问题属于支付/登录/售后哪一类”
- “用户意向高/中/低”
- “客服优先级高/低”
2)为什么先用传统机器学习(而不是一上来 Transformer)?
你当然可以直接上大模型/深度学习,但在很多场景里,TF-IDF + 线性模型反而更适合快速落地:
- ✅ 数据少也能训练(几十到几千条就能起步)
- ✅ 训练快、部署简单、预测速度快
- ✅ 可解释性更好(能看哪些词影响预测)
- ✅ 不需要 GPU
等你把 MVP 跑通,再升级到更强的深度模型,路线会清晰很多。
3)完整可运行代码:从训练到上线
下面这段代码做了这些事:
- 准备一份示例数据(你可以替换成自己的 CSV)
- 划分训练集/测试集
- 用 TF-IDF 把文本变成数值特征
- 训练逻辑回归分类器
- 打印评估报告
- 保存模型文件
- 演示加载模型并预测新文本
> 说明:为了兼容中文,我们使用“字符级”TF-IDF(不依赖分词),对短文本非常常见。
# -- coding: utf-8 --
import joblib
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
def build_dataset():
"""
示例数据:你可以替换成自己的真实数据,比如从 CSV 读取:
texts = df["text"].tolist()
labels = df["label"].tolist()
"""
texts = [
"客服态度很好,问题很快解决了",
"体验太差了,根本用不了",
"物流很快,包装也很不错",
"一直报错,浪费时间",
"功能很强大,性价比高",
"退款流程麻烦,太失望了",
"页面清爽,操作顺手",
"完全不符合描述,差评",
"售后回复及时,点赞",
"卡顿严重,打开就闪退",
"非常满意,会推荐朋友",
"服务敷衍,问题没解决",
"教程清晰,上手很快",
"质量一般,体验不值这个价",
]
labels = [
"positive","negative","positive","negative","positive","negative",
"positive","negative","positive","negative","positive","negative",
"positive","negative"
]
return texts, labels
def train_and_save(model_path="sentiment_model.joblib"):
texts, labels = build_dataset()
X_train, X_test, y_train, y_test = train_test_split(
texts, labels, test_size=0.3, random_state=42, stratify=labels
)
# Pipeline:把“向量化 + 模型”串起来,部署时更方便
clf = Pipeline(steps=[
("tfidf", TfidfVectorizer(
analyzer="char", # 关键:中文用字符级特征,避免分词依赖
ngram_range=(2, 4), # 2~4 字符 ngram,能捕捉词组信息
min_df=1
)),
("lr", LogisticRegression(
max_iter=2000,
class_weight="balanced" # 数据不平衡时有用
))
])
clf.fit(X_train, y_train)
# 评估
y_pred = clf.predict(X_test)
print("=== Confusion Matrix ===")
print(confusion_matrix(y_test, y_pred))
print("\n=== Classification Report ===")
print(classification_report(y_test, y_pred))
# 保存模型(包含 TF-IDF + 分类器)
joblib.dump(clf, model_path)
print(f"\n✅ 模型已保存到:{model_path}")
def load_and_predict(model_path="sentiment_model.joblib"):
clf = joblib.load(model_path)
test_texts = [
"页面很好看,而且客服回复很快",
"真是太坑了,根本无法使用",
"功能可以,但有点卡",
"售后很耐心,解决了我所有问题"
]
preds = clf.predict(test_texts)
probs = clf.predict_proba(test_texts)
# 输出结果
for t, p, pr in zip(test_texts, preds, probs):
# pr 的顺序与 clf.classes_ 对应
prob_map = dict(zip(clf.classes_, pr))
print("\n文本:", t)
print("预测:", p)
print("置信度:", {k: round(v, 4) for k, v in prob_map.items()})
if name == "main":
train_and_save()
load_and_predict()
4)这段“人工智能代码”到底做了什么?
4.1 TF-IDF:把文字变成机器能理解的数字
TF:某个 ngram 在一句话里出现的频率IDF:某个 ngram 在所有文本里有多“稀有”- 稀有且能代表含义的片段(例如“差评”“闪退”“很满意”)会获得更高权重。
4.2 Logistic Regression:一个经典但很强的分类器
别被名字骗了,它不是“回归”,它经常用于分类任务:
- 输出每个类别的概率
- 训练快、泛化稳、部署简单
- 配合 TF-IDF 在文本任务里非常能打
5)如何替换成你自己的数据(真实落地关键)
假设你有个 data.csv:
| text | label |
|---|---|
| 客服很耐心 | positive |
| 一直报错 | negative |
你只需要把 build_dataset() 换成读 CSV:
import pandas as pd
def build_dataset_from_csv(path="data.csv"):
df = pd.read_csv(path)
texts = df["text"].astype(str).tolist()
labels = df["label"].astype(str).tolist()
return texts, labels
然后在训练函数里用它替换即可。
6)上线思路:怎么把它用到你的系统里?
最常见的上线方式有三种:
方式 A:作为脚本服务(最简单)
- 每次预测就运行一次 Python(适合低频任务)
- 缺点:启动开销略大
方式 B:做成一个轻量 API(推荐)
用 Flask/FastAPI 把 load_and_predict 改成接口:
/predict接收文本- 返回预测标签与概率
方式 C:嵌到现有应用里
比如你有 Django 项目:
- 在启动时加载
joblib模型 - 每次用户提交内容时调用
clf.predict()
7)你可以继续升级的方向(但别急着跳)
当你发现:
- 数据量变大
- 文本更复杂(长文、多意图、语义强)
- 你希望模型理解更深层语义
再考虑升级到:
- 朴素贝叶斯 / SVM(同属传统强基线)
- 预训练模型(如 BERT 类)微调
- 多标签分类、层级分类、意图识别
但我真心建议:先把这套“能跑能用”的基线吃透。很多项目就是靠这种简单模型长期稳定运行的。
8)最后的小结(一句话)
这篇文章的核心不是“炫技”,而是让你用 Python 写出一个真正能训练、评估、保存、加载、预测的人工智能模型,并且知道它在做什么——这才是 AI 落地的起点。
评论 0