你能否用一个完整的自然语言处理流水线案例总结从文本清洗到模型部署的全过程

访客 自然语言处理 2

本文目录导读:

  1. 业务目标与数据准备
  2. 文本清洗(Data Cleaning)
  3. 分词(Tokenization)
  4. 文本预处理(Preprocessing)
  5. 模型训练(Model Training)
  6. 模型评估(Evaluation)
  7. 构建推理管线(Inference Pipeline)
  8. 模型部署(Deployment)
  9. 持续监控与更新
  10. 完整管线示意图(文字版):

业务目标与数据准备

目标:对用户评论进行情感二分类(正面/负面)。
数据示例

“这家餐厅的菜品非常好吃,服务也很热情。” → 正面  
“太难吃了,等了一个小时才上菜。” → 负面  

原始数据:通常为一个CSV文件,包含“文本”和“标签”两列。


文本清洗(Data Cleaning)

目的:去除噪声,保留有效语义信息。

1 常见步骤

  • 去除HTML标签(若爬取数据):<br>, &nbsp; → 替换为空格
  • 统一大小写:英文转小写
  • 去除特殊符号/表情(保留有意义标点如“!”可能增强情感):根据任务决定
  • 去除空格/换行:合并多余空白
  • 处理数字:替换为 <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,或用深度学习模型跳过手工特征提取)。

标签: NLP流水线 模型部署

上一篇当前分类已是最后一篇

下一篇这个案例能帮你理解注意力机制在机器翻译中的作用吗

抱歉,评论功能暂时关闭!