.. _sec_sentiment: Анализ тональности и набор данных ================================= С распространением социальных сетей и платформ для отзывов было собрано огромное количество данных, содержащих мнения пользователей, что открывает большие возможности для поддержки процессов принятия решений. *Анализ тональности* изучает настроения людей, выраженные в их текстах, таких как отзывы о товарах, комментарии в блогах и обсуждения на форумах. Этот метод широко применяется в различных областях, включая политику (например, анализ общественного мнения о политических решениях), финансы (например, анализ настроений на рынке) и маркетинг (например, исследование продуктов и управление брендами). Поскольку тональность можно классифицировать по дискретным полярностям или шкалам (например, положительная и отрицательная), мы можем рассматривать анализ тональности как задачу классификации текста, которая преобразует текстовую последовательность переменной длины в категорию фиксированной длины. В этой главе мы будем использовать `большой набор данных отзывов о фильмах от Стэнфорда `__ для анализа тональности. Он состоит из обучающей выборки и тестовой выборки, каждая из которых содержит 25000 отзывов о фильмах, загруженных с IMDb. В обоих наборах данных количество меток «positive» (положительный) и «negative» (отрицательный) одинаково, что указывает на различные полярности тональности. .. raw:: latex \diilbookstyleinputcell .. code:: python import os import torch from torch import nn from d2l import torch as d2l Чтение набора данных -------------------- Сначала скачайте и распакуйте набор данных отзывов IMDb в путь ``../data/aclImdb``. .. raw:: latex \diilbookstyleinputcell .. code:: python #@save d2l.DATA_HUB['aclImdb'] = (d2l.DATA_URL + 'aclImdb_v1.tar.gz', '01ada507287d82875905620988597833ad4e0903') data_dir = d2l.download_extract('aclImdb', 'aclImdb') Далее прочитаем обучающую и тестовую выборки. Каждый пример — это отзыв и его метка: 1 для «положительного» и 0 для «отрицательного». .. raw:: latex \diilbookstyleinputcell .. code:: python #@save def read_imdb(data_dir, is_train): """Read the IMDb review dataset text sequences and labels.""" data, labels = [], [] for label in ('pos', 'neg'): folder_name = os.path.join(data_dir, 'train' if is_train else 'test', label) for file in os.listdir(folder_name): with open(os.path.join(folder_name, file), 'rb') as f: review = f.read().decode('utf-8').replace('\n', '') data.append(review) labels.append(1 if label == 'pos' else 0) return data, labels train_data = read_imdb(data_dir, is_train=True) print('# trainings:', len(train_data[0])) for x, y in zip(train_data[0][:3], train_data[1][:3]): print('label:', y, 'review:', x[:60]) Предобработка набора данных --------------------------- Рассматривая каждое слово как токен и отфильтровывая слова, которые встречаются менее 5 раз, мы создаём словарь на основе обучающего набора данных. .. raw:: latex \diilbookstyleinputcell .. code:: python train_tokens = d2l.tokenize(train_data[0], token='word') vocab = d2l.Vocab(train_tokens, min_freq=5, reserved_tokens=['']) После токенизации построим гистограмму длин отзывов в токенах. .. raw:: latex \diilbookstyleinputcell .. code:: python d2l.set_figsize() d2l.plt.xlabel('# tokens per review') d2l.plt.ylabel('count') d2l.plt.hist([len(line) for line in train_tokens], bins=range(0, 1000, 50)); Как и ожидалось, отзывы имеют разную длину. Чтобы обрабатывать мини-батчи таких отзывов, мы приводим длину каждого отзыва к 500 символам с помощью усечения и дополнения, что аналогично этапу предварительной обработки набора данных для машинного перевода в :numref:`sec_machine_translation`. .. raw:: latex \diilbookstyleinputcell .. code:: python num_steps = 500 # sequence length train_features = torch.tensor([d2l.truncate_pad( vocab[line], num_steps, vocab['']) for line in train_tokens]) print(train_features.shape) Создание итераторов данных -------------------------- Теперь мы можем создать итераторы данных. На каждой итерации возвращается мини-батч примеров. .. raw:: latex \diilbookstyleinputcell .. code:: python train_iter = d2l.load_array((train_features, torch.tensor(train_data[1])), 64) for X, y in train_iter: print('X:', X.shape, ', y:', y.shape) break print('# batches:', len(train_iter)) Собираем всё вместе ------------------- Наконец, мы объединяем описанные выше шаги в функцию ``load_data_imdb``. Она возвращает итераторы обучающих и тестовых наборов данных, а также словарь набора данных отзывов IMDb. .. raw:: latex \diilbookstyleinputcell .. code:: python #@save def load_data_imdb(batch_size, num_steps=500): """Return data iterators and the vocabulary of the IMDb review dataset.""" data_dir = d2l.download_extract('aclImdb', 'aclImdb') train_data = read_imdb(data_dir, True) test_data = read_imdb(data_dir, False) train_tokens = d2l.tokenize(train_data[0], token='word') test_tokens = d2l.tokenize(test_data[0], token='word') vocab = d2l.Vocab(train_tokens, min_freq=5) train_features = torch.tensor([d2l.truncate_pad( vocab[line], num_steps, vocab['']) for line in train_tokens]) test_features = torch.tensor([d2l.truncate_pad( vocab[line], num_steps, vocab['']) for line in test_tokens]) train_iter = d2l.load_array((train_features, torch.tensor(train_data[1])), batch_size) test_iter = d2l.load_array((test_features, torch.tensor(test_data[1])), batch_size, is_train=False) return train_iter, test_iter, vocab Итоги ----- - Анализ тональности изучает эмоции людей, выраженные в их текстах, и рассматривается как задача классификации текста, преобразующая текстовую последовательность переменной длины в категорию фиксированной длины. - После предварительной обработки мы можем загрузить большой набор данных отзывов о фильмах Стэнфорда (набор данных IMDb) в итераторы данных, используя словарь. Упражнения ---------- 1. Какие гиперпараметры в этом разделе можно изменить, чтобы ускорить обучение моделей анализа тональности? 2. Можете ли вы реализовать функцию для загрузки `набора данных отзывов Amazon `__ в итераторы данных и метки для анализа тональности? `Обсуждения `__