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

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

在开始之前,我们需要安装 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})
在 NLP 任务中,我们通常需要去除 HTML 标签、标点符号、停用词等。
import re
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
nltk.download('stopwords')
nltk.download('punkt')
# 定义文本清理函数
def clean_text(text):
text = re.sub(r'<.*?>', '', text) # 移除 HTML 标签
text = re.sub(r'[^a-zA-Z]', ' ', text) # 只保留字母
tokens = word_tokenize(text.lower()) # 分词
tokens = [word for word in tokens if word not in stopwords.words('english')] # 去停用词
return ' '.join(tokens)
# 处理数据
train_texts = train_texts.apply(clean_text)
test_texts = test_texts.apply(clean_text)
在深度学习之前,我们可以使用 TF-IDF 或 Word2Vec 提取文本特征。
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)
使用 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")
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))
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()
()
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=)
optimizer = torch.optim.AdamW(model.parameters(), lr=)
model.train()
epoch ():
batch train_loader:
optimizer.zero_grad()
outputs = model(**batch)
loss = outputs.loss
loss.backward()
optimizer.step()
()
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 模型的完整实现流程:
可以根据业务需求选择合适的 NLP 方案。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online