Пример PyTorch - Проект анализа тональности текста

Анализ тональности текста — это фундаментальная задача в области обработки естественного языка (NLP), цель которой — определить тональную направленность (положительную/отрицательную), выраженную в фрагменте текста. В этом проекте PyTorch будет использоваться для построения модели глубокого обучения для классификации тональности отзывов о фильмах.

Сценарии применения анализа тональности

  • Анализ отзывов о товарах
  • Мониторинг общественного мнения в социальных сетях
  • Классификация отзывов о работе службы поддержки
  • Прогнозирование рыночных трендов

Подготовка окружения

Необходимые инструменты и библиотеки

Пример

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

Установка зависимостей

pip install torch torchtext spacy
python -m spacy download en_core_web_sm

Подготовка данных

Введение в набор данных

Используйте набор данных обзоров фильмов IMDB, содержащий 50,000 отзывов с метками тональности (положительная/отрицательная).

Предобработка данных

Пример

# Определение обработки полей
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

4.2 Код реализации модели

Пример

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)

Обучение модели

Настройки параметров обучения

Пример

# Параметры модели
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()

Цикл обучения

Пример

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(итератор)

Оценка модели

Функция оценки

Пример

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(итератор)

Вычисление точности

Пример

def accuracy(preds, y):
    rounded_preds = torch.round(torch.sigmoid(preds))
    correct = (rounded_preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

Применение модели

Предсказание нового текста

Пример

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()

Пример предсказания

Пример

positive_review = "Этот фильм был фантастическим! Мне очень понравилось."
negative_review = "Фильм был ужасным и скучным."

print(f"Оценка положительного отзыва: {predict_sentiment(model, positive_review):.4f}")
print(f"Оценка отрицательного отзыва: {predict_sentiment(model, negative_review):.4f}")
Другие расширения