首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

python搭建NPL模型的详细步骤和代码

  • 25-04-25 01:21
  • 2998
  • 13674
blog.csdn.net

在这里插入图片描述


目录

  • **一、环境准备**
  • **二、数据准备**
  • **三、文本预处理**
    • **1. 清理文本**
  • **四、特征工程**
    • **1. TF-IDF**
    • **2. Word2Vec**
  • **五、搭建 NLP 模型**
    • **1. 逻辑回归**
    • **2. LSTM 深度学习模型**
  • **六、使用预训练的 BERT 模型**
  • **七、模型评估**
  • **八、部署模型**
  • **总结**
      • 1. **人机交互的核心技术**
      • 2. **推动AI技术发展的动力**
      • 3. **广泛的应用场景**
      • 4. **多模态融合的关键环节**
      • 5. **行业数字化转型的加速器**
      • 6. **未来发展的潜力**

一、环境准备

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

pip install numpy pandas scikit-learn nltk spacy transformers torch tensorflow
  • 1
  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

三、文本预处理

1. 清理文本

在 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

四、特征工程

在深度学习之前,我们可以使用 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)
  • 1
  • 2
  • 3
  • 4
  • 5

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")
  • 1
  • 2
  • 3
  • 4
  • 5

五、搭建 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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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()}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

在这里插入图片描述

六、使用预训练的 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()}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

七、模型评估

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

八、部署模型

可以使用 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"}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行:

uvicorn main:app --reload
  • 1

总结

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

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

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


自然语言处理是人工智能领域的一个重要方向,主要研究计算机如何理解、生成和处理人类语言。它可以根据任务类型和方法分为以下几类:
(1)按任务类型分类
类别到序列:例如情感分析,将文本分类为正面、负面或中性。
序列到类别:例如文本分类,将文本归为特定类别。
同步的序列到序列:例如机器翻译,将一种语言的文本转换为另一种语言。
异步的序列到序列:例如问答系统,根据问题生成答案。
(2)按技术方法分类
传统机器学习方法:依赖人工特征工程,如支持向量机(SVM)、朴素贝叶斯(NB)等。
深度学习方法:通过构建深度神经网络模型自动学习文本特征,如循环神经网络(RNN)、长短时记忆网络(LSTM)、Transformer等。
无模板方法:基于大规模语料库的学习,无需预定义模板或规则。
(3)按应用领域分类
文本分析:包括情感分析、文本分类、命名实体识别等。
语音处理:如语音识别和自然语言生成。
机器翻译:将文本或语音从一种语言转换为另一种语言。


自然语言处理(NLP)在人工智能(AI)开发中占据着极为重要的地位,是连接人类语言世界与数字世界的桥梁,以下是其在AI开发中的地位和作用:

1. 人机交互的核心技术

NLP赋予计算机理解和生成人类语言的能力,是实现人机自然交互的关键技术之一。通过NLP,计算机能够理解人类的意图,并据此作出反应或执行任务,从而极大地提升了人机交互的效率和自然性。

2. 推动AI技术发展的动力

NLP是人工智能的三大支柱之一(另两者为机器学习和计算机视觉),其发展推动了AI系统的智能化水平。随着深度学习技术的不断进步,NLP在文本分类、情感分析、机器翻译等任务上的表现显著提升,进一步拓展了AI的应用范围。

3. 广泛的应用场景

NLP技术已经渗透到各个领域,包括但不限于:

  • 机器翻译:帮助人们跨越语言障碍进行交流。
  • 情感分析:用于分析文本中的情感倾向,帮助企业了解客户态度。
  • 智能客服:快速、准确地理解客户问题并提供解决方案。
  • 信息检索:提升搜索引擎的语义理解能力,优化搜索结果。
  • 医疗健康:用于电子病历的自动摘要和疾病诊断辅助。
  • 金融领域:分析市场新闻、预测股价趋势。

4. 多模态融合的关键环节

随着AI技术的发展,NLP还将与计算机视觉、语音识别等其他AI分支进一步融合。例如,语音识别与NLP的结合使得智能语音助手能够更好地理解用户指令;多模态学习则通过融合视觉、听觉和文本信息,实现更智能的交互。

5. 行业数字化转型的加速器

NLP技术在各行各业的应用不仅提高了工作效率,还促进了行业的数字化转型和智能化升级。例如,在教育领域,智能辅导系统通过理解学生的学习情况,提供个性化的学习建议。

6. 未来发展的潜力

未来,NLP将继续在AI领域发挥重要作用,包括跨语言模型的开发、多模态信息融合以及人机协作能力的增强。这些创新将进一步拓展NLP的应用范围和服务能力。

综上所述,NLP作为AI开发中的重要分支,不仅在技术层面推动了AI的发展,还在实际应用中为人类生活和各行业带来了深远的影响。其在未来的发展中仍将扮演不可或缺的角色。

编程是艺术
微信公众号
文章主要分享软件开发和编程学习方面的知识
注:本文转载自blog.csdn.net的百锦再@新空间代码工作室的文章"https://blog.csdn.net/sixpp/article/details/146031481"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

108
Python
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top