跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 搭建 NLP 模型的详细步骤与代码

综述由AI生成基于 Python 的 NLP 模型搭建全流程,涵盖环境安装、IMDB 数据集加载、文本清洗(去除 HTML 标签、停用词)、特征提取(TF-IDF、Word2Vec)、模型构建(逻辑回归、LSTM、BERT)及模型评估与 FastAPI 部署。通过具体代码示例展示了从传统机器学习到深度学习的实现方法,适合初学者快速上手自然语言处理任务。

蓝绿部署发布于 2026/3/30更新于 2026/5/2431 浏览
Python 搭建 NLP 模型的详细步骤与代码

一、环境准备

在开始之前,我们需要安装 NLP 相关的 Python 库:

pip install numpy pandas scikit-learn nltk spacy transformers torch tensorflow
  • numpy 和 pandas 用于数据处理
  • scikit-learn 用于特征工程和评估
  • nltk 和 spacy 用于文本预处理
  • transformers 提供预训练的 NLP 模型
  • torch 和 tensorflow 用于深度学习建模

二、数据准备

我们以 IMDB 电影评论数据集为例,这是一个用于情感分析(情绪分类)的 NLP 任务。

import pandas as pd
from sklearn.model_selection import train_test_split

# 读取 IMDB 数据集
# url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
df = pd.read_csv("IMDB Dataset.csv")  # 数据集需要提前下载并存储

# 划分数据集
train_texts, test_texts, train_labels, test_labels = train_test_split(
    df['review'], df['sentiment'], test_size=0.2, random_state=42
)

# 转换标签为数值
train_labels = train_labels.map({'positive': 1, 'negative': 0})
test_labels = test_labels.map({'positive': 1, 'negative': 0})

三、文本预处理

1. 清理文本

在 NLP 任务中,我们通常需要去除 HTML 标签、标点符号、停用词等。

import re
import nltk
from nltk.corpus import stopwords
from nltk.tokenize  word_tokenize

nltk.download()
nltk.download()


 ():
    text = re.sub(, , text)  
    text = re.sub(, , text)  
    tokens = word_tokenize(text.lower())  
    tokens = [word  word  tokens  word   stopwords.words()]  
     .join(tokens)


train_texts = train_texts.apply(clean_text)
test_texts = test_texts.apply(clean_text)
import
'stopwords'
'punkt'
# 定义文本清理函数
def
clean_text
text
r'<.*?>'
''
# 移除 HTML 标签
r'[^a-zA-Z]'
' '
# 只保留字母
# 分词
for
in
if
not
in
'english'
# 去停用词
return
' '
# 处理数据

四、特征工程

在深度学习之前,我们可以使用 TF-IDF 或 Word2Vec 提取文本特征。

1. TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_texts)
X_test = vectorizer.transform(test_texts)

2. Word2Vec

使用 gensim 训练 Word2Vec 词向量。

from gensim.models import Word2Vec

sentences = [text.split() for text in train_texts]
word2vec_model = Word2Vec(sentences, vector_size=100, window=5, min_count=5, workers=4)
word2vec_model.save("word2vec.model")

五、搭建 NLP 模型

1. 逻辑回归

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

model = LogisticRegression()
model.fit(X_train, train_labels)

# 预测
preds = model.predict(X_test)
print("Logistic Regression Accuracy:", accuracy_score(test_labels, preds))

2. LSTM 深度学习模型

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 定义 LSTM 模型
class LSTMModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
        super(LSTMModel, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        embedded = self.embedding(x)
        _, (hidden, _) = self.lstm(embedded)
        return self.fc(hidden.squeeze(0))

# 超参数
VOCAB_SIZE = 5000
EMBEDDING_DIM = 100
HIDDEN_DIM = 128
OUTPUT_DIM = 1

model = LSTMModel(VOCAB_SIZE, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM)

# 训练模型
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(5):
    model.train()
    optimizer.zero_grad()
    outputs = model(torch.randint(0, VOCAB_SIZE, (len(train_labels), 50)))
    loss = criterion(outputs.squeeze(), torch.tensor(train_labels.values, dtype=torch.float))
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

六、使用预训练的 BERT 模型

from transformers import BertTokenizer, BertForSequenceClassification
from torch.utils.data import DataLoader

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')

# Tokenize 数据
train_encodings = tokenizer(list(train_texts), truncation=True, padding=True, max_length=512, return_tensors="pt")
test_encodings = tokenizer(list(test_texts), truncation=True, padding=True, max_length=512, return_tensors="pt")

# 转换为 PyTorch Dataset
class IMDbDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __len__(self):
        return len(self.labels)

    def __getitem__(self, idx):
        item = {key: val[idx] for key, val in self.encodings.items()}
        item["labels"] = torch.tensor(self.labels[idx])
        return item

train_dataset = IMDbDataset(train_encodings, list(train_labels))
test_dataset = IMDbDataset(test_encodings, list(test_labels))

# 训练 BERT
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)

model.train()
for epoch in range(3):
    for batch in train_loader:
        optimizer.zero_grad()
        outputs = model(**batch)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

七、模型评估

from sklearn.metrics import classification_report

model.eval()
preds = []
with torch.no_grad():
    for batch in test_dataset:
        output = model(**batch)
        preds.append(torch.argmax(output.logits, axis=1).numpy())

print(classification_report(test_labels, preds))

八、部署模型

可以使用 FastAPI 部署 NLP 模型:

from fastapi import FastAPI
import torch

app = FastAPI()

@app.post("/predict/")
def predict(text: str):
    encoding = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512)
    with torch.no_grad():
        output = model(**encoding)
        pred = torch.argmax(output.logits, axis=1).item()
    return {"sentiment": "positive" if pred == 1 else "negative"}

运行:

uvicorn main:app --reload

总结

本文介绍了 NLP 模型的完整实现流程:

  1. 数据预处理
  2. 特征工程
  3. 机器学习模型
  4. 深度学习 LSTM
  5. BERT 预训练模型
  6. 模型部署

可以根据业务需求选择合适的 NLP 方案。

目录

  1. 一、环境准备
  2. 二、数据准备
  3. 读取 IMDB 数据集
  4. url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
  5. 划分数据集
  6. 转换标签为数值
  7. 三、文本预处理
  8. 1. 清理文本
  9. 定义文本清理函数
  10. 处理数据
  11. 四、特征工程
  12. 1. TF-IDF
  13. 2. Word2Vec
  14. 五、搭建 NLP 模型
  15. 1. 逻辑回归
  16. 预测
  17. 2. LSTM 深度学习模型
  18. 定义 LSTM 模型
  19. 超参数
  20. 训练模型
  21. 六、使用预训练的 BERT 模型
  22. Tokenize 数据
  23. 转换为 PyTorch Dataset
  24. 训练 BERT
  25. 七、模型评估
  26. 八、部署模型
  27. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MaaS 平台与阿里 QWQ 技术:AI 调参实战指南
  • AI 时代程序员提效指南:主流工具实战与避坑
  • GeoServer 2.27.3 结合 GeoWebCache 发布 ArcGIS 切片(WMTS 服务)
  • 前端网页开发基础:HTML、CSS 与 JavaScript 入门教程
  • OpenClaw 实战指南:本地化 AI Agent 部署与优化
  • WebSphere 反序列化漏洞 CVE-2015-7450 原理与利用分析
  • 前端安全最佳实践:密码、XSS 与 CSRF 防护
  • 前端开发基础:HTML、CSS 与 JavaScript 入门
  • Z-Image-Turbo 镜像快速搭建与 AI 绘画教学指南
  • Python 与 Go 语言深度对比:特性、性能与应用场景分析
  • 无需插件修改 Copilot 接入第三方 OpenAI 接口方法
  • Chatwoot 私有化部署与网页集成实操
  • React 集成 Microi 吾码低代码平台开发指南
  • 网络安全基础教程:概念、加密与攻击防护
  • Coze 智能体与工作流开发基础教程
  • PentAGI Docker 环境部署指南
  • Qwen2.5-7B-Instruct 大模型 vLLM 推理加速与前端调用
  • GitHub Copilot 提示词工程指南:从基础到精通
  • OpenMV 人脸追踪算法工作原理揭秘
  • Flutter Genkit 在鸿蒙端的适配:模型幻觉审计与端云协同 AI 方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online