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

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

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

蓝绿部署发布于 2026/3/30更新于 2026/10/15108 浏览
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. 总结

更多推荐文章

查看全部
  • Coze 与 Dify 低代码 AI 平台深度对比
  • C++ STL stack、queue 及 priority_queue 深度剖析
  • MySQL 数据库基础入门:从概念到实战
  • C++微服务 UserServer 设计与实现
  • Intel GPU 加速 llama.cpp:SYCL 后端配置与性能调优指南
  • Qwen3-VL 与 Qwen2-VL 对比:视觉感知升级实战评测
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源与参赛攻略
  • LLaMA Factory 大模型微调实战指南
  • 基于 AI Agent 的米家智能家居通用控制方案
  • 15 款互联网行业必备 AI 工具深度评测与推荐
  • VRCX 使用指南:VRChat 社交管理工具功能详解
  • Z-Image-Turbo 企业级 AI 绘画平台搭建与批量部署实战
  • ClawX:OpenClaw 可视化桌面客户端,零门槛使用 AI 智能体
  • Obsidian Text Generator 插件实战与配置指南
  • Java 应用报错 No buffer space available 排查与解决
  • 基于 Spring Boot 的书法比赛评分系统设计与实现
  • 医疗多模态大模型概述:医学影像分析与核心算法总结
  • 被工具定义的编程时代:VS Code 与 JetBrains 效率提升指南
  • JiuwenClaw AI 智能体实战:从安装到多端协同应用
  • Z-Image i2L 本地 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