.. _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 `__ в
итераторы данных и метки для анализа тональности?
`Обсуждения `__