Skip to content

PyTorch 实例 - 文本情感分析项目

文本情感分析是自然语言处理(NLP)中的一项基础任务,旨在判断一段文本表达的情感倾向(正面/负面)。本项目将使用PyTorch构建一个深度学习模型,实现对电影评论的情感分类。

情感分析的应用场景

  • 产品评论分析
  • 社交媒体舆情监控
  • 客户服务反馈分类
  • 市场趋势预测

环境准备

所需工具和库

实例

python
import torch

import torch.nn as nn

import torch.optim as optim

from torchtext.data import Field, TabularDataset, BucketIterator

import spacy

import numpy as np

安装依赖

bash
pip install torch torchtext spacy
python -m spacy download en_core_web_sm

数据准备

数据集介绍

使用IMDB电影评论数据集,包含50,000条带有情感标签(正面/负面)的评论。

数据预处理

实例

python
# 定义字段处理

TEXT = Field(tokenize='spacy', 

            tokenizer_language='en_core_web_sm',

            include_lengths=True)

LABEL = Field(sequential=False, use_vocab=False)

# 加载数据集

train_data, test_data = TabularDataset.splits(

    path='./data',

    train='train.csv',

    test='test.csv',

    format='csv',

    fields=[('text', TEXT), ('label', LABEL)]

)

# 构建词汇表

TEXT.build_vocab(train_data, 

                max_size=25000,

                vectors="glove.6B.100d")

模型构建

LSTM模型架构

933a8b19-400c-4d4b-814e-e83c6c89.png

4.2 模型实现代码

实例

python
class SentimentLSTM(nn.Module):

    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim, n_layers):

        super().__init__()

        self.embedding = nn.Embedding(vocab_size, embedding_dim)

        self.lstm = nn.LSTM(embedding_dim, 

                           hidden_dim, 

                           num_layers=n_layers,

                           bidirectional=True)

        self.fc = nn.Linear(hidden_dim * 2, output_dim)

        self.dropout = nn.Dropout(0.5)

        

    def forward(self, text, text_lengths):

        embedded = self.dropout(self.embedding(text))

        packed_embedded = nn.utils.rnn.pack_padded_sequence(

            embedded, text_lengths.to('cpu'))

        packed_output, (hidden, cell) = self.lstm(packed_embedded)

        hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1))

        return self.fc(hidden)

模型训练

训练参数设置

实例

python
# 模型参数

INPUT_DIM = len(TEXT.vocab)

EMBEDDING_DIM = 100

HIDDEN_DIM = 256

OUTPUT_DIM = 1

N_LAYERS = 2

# 初始化模型

model = SentimentLSTM(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS)

# 优化器和损失函数

optimizer = optim.Adam(model.parameters())

criterion = nn.BCEWithLogitsLoss()

训练循环

实例

python
def train(model, iterator, optimizer, criterion):

    epoch_loss = 0

    epoch_acc = 0

    

    model.train()

    

    for batch in iterator:

        text, text_lengths = batch.text

        predictions = model(text, text_lengths).squeeze(1)

        loss = criterion(predictions, batch.label)

        

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()

        

        epoch_loss += loss.item()

        epoch_acc += accuracy(predictions, batch.label)

        

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

模型评估

评估函数

实例

python
def evaluate(model, iterator, criterion):

    epoch_loss = 0

    epoch_acc = 0

    

    model.eval()

    

    with torch.no_grad():

        for batch in iterator:

            text, text_lengths = batch.text

            predictions = model(text, text_lengths).squeeze(1)

            loss = criterion(predictions, batch.label)

            epoch_loss += loss.item()

            epoch_acc += accuracy(predictions, batch.label)

            

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

准确率计算

实例

python
def accuracy(preds, y):

    rounded_preds = torch.round(torch.sigmoid(preds))

    correct = (rounded_preds == y).float()

    acc = correct.sum() / len(correct)

    return acc

模型应用

预测新文本

实例

python
def predict_sentiment(model, sentence):

    tokenized = [tok.text for tok in nlp.tokenizer(sentence)]

    indexed = [TEXT.vocab.stoi[t] for t in tokenized]

    length = [len(indexed)]

    tensor = torch.LongTensor(indexed).to(device)

    tensor = tensor.unsqueeze(1)

    length_tensor = torch.LongTensor(length)

    prediction = torch.sigmoid(model(tensor, length_tensor))

    return prediction.item()

示例预测

实例

python
positive_review = "This movie was fantastic! I really enjoyed it."

negative_review = "The film was terrible and boring."

print(f"Positive review score: {predict_sentiment(model, positive_review):.4f}")

print(f"Negative review score: {predict_sentiment(model, negative_review):.4f}")

AI 思考中...

PyTorch 实例 – 图像分类项目

PyTorch 模型保存和加载

基于 VitePress 构建,部署于 GitHub Pages