本文目录导读:
- 业务目标与数据准备
- 文本清洗(Data Cleaning)
- 分词(Tokenization)
- 文本预处理(Preprocessing)
- 模型训练(Model Training)
- 模型评估(Evaluation)
- 构建推理管线(Inference Pipeline)
- 模型部署(Deployment)
- 持续监控与更新
- 完整管线示意图(文字版):
业务目标与数据准备
目标:对用户评论进行情感二分类(正面/负面)。
数据示例:
“这家餐厅的菜品非常好吃,服务也很热情。” → 正面
“太难吃了,等了一个小时才上菜。” → 负面
原始数据:通常为一个CSV文件,包含“文本”和“标签”两列。
文本清洗(Data Cleaning)
目的:去除噪声,保留有效语义信息。
1 常见步骤
- 去除HTML标签(若爬取数据):
<br>, → 替换为空格 - 统一大小写:英文转小写
- 去除特殊符号/表情(保留有意义标点如“!”可能增强情感):根据任务决定
- 去除空格/换行:合并多余空白
- 处理数字:替换为
<NUM>或直接删除(情感分析中数字通常无意义)
2 代码示例(Python + re)
import re
def clean_text(text):
text = re.sub(r'<[^>]+>', '', text) # 去HTML
text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s,.!?]', '', text) # 保留中英文、数字、常用标点
text = re.sub(r'\s+', ' ', text).strip() # 合并空格
return text
分词(Tokenization)
中文需要分词(英文按空格分词即可)。
常用工具:jieba(轻量级)、pkuseg(学术级)
import jieba
def tokenize(text):
return ' '.join(jieba.cut(text))
# 输入:“这家餐厅非常好吃”
# 输出:“这家 餐厅 非常 好吃”
文本预处理(Preprocessing)
为模型训练做准备,包括去停用词(可选)、词干提取/词形还原(英文)、向量化。
1 停用词过滤
stopwords = set(["的", "了", "在", "是", "我"])
def remove_stopwords(tokens):
return [w for w in tokens if w not in stopwords]
2 特征提取(向量化)
将文本转为数值向量,常见方法:
- TF-IDF:经典,适合简单任务
- Word2Vec / GloVe:词向量(保留语义)
- BERT / 预训练模型:直接输出句向量
示例(TF-IDF):
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(max_features=5000) X_train = vectorizer.fit_transform(train_texts) # train_texts 是清洗+分词后的文本列表
模型训练(Model Training)
选择简单分类器(逻辑回归常作为基线)或深度学习模型。
逻辑回归(适合小数据、快速验证)
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2) model = LogisticRegression() model.fit(X_train, y_train)
进阶:BERT微调(更好效果)
使用 transformers 库加载预训练模型(如 bert-base-chinese),添加分类头进行微调。
模型评估(Evaluation)
计算准确率、精确率、召回率、F1分数,并观察混淆矩阵。
from sklearn.metrics import classification_report y_pred = model.predict(X_val) print(classification_report(y_val, y_pred, target_names=['负面', '正面']))
构建推理管线(Inference Pipeline)
将清洗、分词、向量化、预测串联为一个函数。
def predict_sentiment(text, vectorizer, model):
# 步骤1:清洗
text = clean_text(text)
# 步骤2:分词
tokens = tokenize(text)
# 步骤3:向量化(必须使用训练时拟合的 vectorizer)
features = vectorizer.transform([tokens])
# 步骤4:预测
pred = model.predict(features)[0]
prob = model.predict_proba(features).max()
return "正面" if pred == 1 else "负面", prob
模型部署(Deployment)
将训练好的模型和向量器部署到生产环境。
REST API(使用 Flask / FastAPI)
# app.py
from flask import Flask, request, jsonify
import joblib
app = Flask(__name__)
vectorizer = joblib.load("vectorizer.pkl")
model = joblib.load("model.pkl")
@app.route('/predict', methods=['POST'])
def predict():
text = request.json['text']
label, prob = predict_sentiment(text, vectorizer, model)
return jsonify({"label": label, "confidence": prob})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Docker 容器化 + 云部署
- 编写
Dockerfile打包应用 - 部署到 Kubernetes / AWS ECS / 阿里云函数计算
- 使用负载均衡(如 Nginx)处理高并发
边缘部署(移动端/嵌入式)
将模型转换为 ONNX 或 TensorFlow Lite 格式,用 C++/Java SDK 调用。
持续监控与更新
- 记录模型推理日志(输入文本、预测结果、置信度)
- 定期用新标注数据微调模型(增量学习)
- 监控准确率、延迟(p99 latency)、QPS
完整管线示意图(文字版):
原始文本 → 清洗 → 分词 → 特征提取 → 模型预测 → 输出标签
↑ ↑
正则库 TF-IDF
+ jieba (或BERT)
就是一个完整的NLP流水线案例,涵盖了从脏数据到生产API的核心环节,实际项目中可根据数据规模、实时性要求、硬件条件调整各环节(例如用BERT直接代替分词+TF-IDF,或用深度学习模型跳过手工特征提取)。