16.1 Nuotaikų analizė ir duomenų rinkinys
Plintant internetinei socialinei žiniasklaidai ir apžvalgų platformoms, buvo užfiksuota gausybė nuomonių duomenų, turinčių didelį potencialą palaikyti sprendimų priėmimo procesus. Nuotaikų analizė tiria žmonių nuotaikas jų sukurtame tekste, pavyzdžiui, produktų atsiliepimuose, tinklaraščių komentaruose ir forumų diskusijose. Ji plačiai taikoma tokiose skirtingose srityse kaip politika (pvz., visuomenės nuotaikų politikos atžvilgiu analizė), finansai (pvz., rinkos nuotaikų analizė) ir rinkodara (pvz., produktų tyrimai ir prekių ženklų valdymas).
Kadangi nuotaikas galima suskirstyti į diskrečius poliškumus arba skales (pvz., teigiama ir neigiama), nuotaikų analizę galime laikyti teksto klasifikavimo užduotimi, kuri kintamo ilgio teksto seką paverčia fiksuoto ilgio teksto kategorija. Šiame skyriuje nuotaikų analizei naudosime Stanfordo didelį filmų apžvalgų duomenų rinkinį. Jį sudaro apmokymo ir testavimo aibės, kurių kiekvienoje yra 25000 filmų apžvalgų, atsisiųstų iš IMDb. Abiejuose duomenų rinkiniuose yra vienodas skaičius „teigiamų“ ir „neigiamų“ žymenų, nurodančių skirtingus nuotaikų poliškumus.
from d2l import mxnet as d2l
from mxnet import np, npx
import os
npx.set_np()
from d2l import torch as d2l
import torch
from torch import nn
import os
16.1.1 Duomenų rinkinio skaitymas
Pirmiausia atsisiųskite ir išpakuokite šį IMDb apžvalgų duomenų rinkinį
kelyje ../data/aclImdb.
#@save
d2l.DATA_HUB['aclImdb'] = (d2l.DATA_URL + 'aclImdb_v1.tar.gz',
'01ada507287d82875905620988597833ad4e0903')
data_dir = d2l.download_extract('aclImdb', 'aclImdb')
Toliau nuskaitykite apmokymo ir testavimo duomenų rinkinius. Kiekvienas pavyzdys yra apžvalga ir jos žymuo: 1 „teigiamam“ ir 0 „neigiamam“.
#@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])
16.1.2 Duomenų rinkinio išankstinis apdorojimas
Kiekvieną žodį laikydami teksto vienetu ir atfiltruodami žodžius, pasirodančius rečiau nei 5 kartus, sukuriame žodyną iš apmokymo duomenų rinkinio.
train_tokens = d2l.tokenize(train_data[0], token='word')
vocab = d2l.Vocab(train_tokens, min_freq=5, reserved_tokens=['<pad>'])
Po teksto skaidymo į teksto vienetus nubraižykime apžvalgų ilgių teksto vienetais histogramą.
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));
Kaip ir tikėjomės, apžvalgos yra skirtingo ilgio. Kad vienu metu apdorotume tokių apžvalgų minirinkinį, kiekvienos apžvalgos ilgį nustatome 500 su nukirtimu ir užpildymu, panašiai kaip mašininio vertimo duomenų rinkinio išankstinio apdorojimo žingsnyje 10.5 skyrelis.
num_steps = 500 # sequence length
train_features = d2l.tensor([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) for line in train_tokens])
print(train_features.shape)
16.1.3 Duomenų iteratorių kūrimas
Dabar galime sukurti duomenų iteratorius. Kiekvienoje iteracijoje grąžinamas pavyzdžių minirinkinys.
train_iter = d2l.load_array((train_features, train_data[1]), 64)
for X, y in train_iter:
print('X:', X.shape, ', y:', y.shape)
break
print('# batches:', len(train_iter))
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))
16.1.4 Viskas kartu
Galiausiai aukščiau pateiktus žingsnius apgaubiame funkcija load_data_imdb.
Ji grąžina IMDb apžvalgų duomenų rinkinio apmokymo ir testavimo duomenų iteratorius bei žodyną.
#@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 = np.array([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) for line in train_tokens])
test_features = np.array([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) for line in test_tokens])
train_iter = d2l.load_array((train_features, train_data[1]), batch_size)
test_iter = d2l.load_array((test_features, test_data[1]), batch_size,
is_train=False)
return train_iter, test_iter, vocab
#@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['<pad>']) for line in train_tokens])
test_features = torch.tensor([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) 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
16.1.5 Santrauka
- Nuotaikų analizė tiria žmonių nuotaikas jų sukurtame tekste, kuri laikoma teksto klasifikavimo problema, paverčiančia kintamo ilgio teksto seką fiksuoto ilgio teksto kategorija.
- Po išankstinio apdorojimo galime įkelti Stanfordo didelį filmų apžvalgų duomenų rinkinį (IMDb apžvalgų duomenų rinkinį) į duomenų iteratorius su žodynu.
16.1.6 Pratimai
- Kokius šio skyrelio hiperparametrus galime keisti, kad paspartintume nuotaikų analizės modelių apmokymą?
- Ar galite įgyvendinti funkciją, kuri įkeltų Amazon apžvalgų duomenų rinkinį į duomenų iteratorius ir žymenis nuotaikų analizei?
