.. _sec_sentiment:
Duygu Analizi ve Veri Kümesi
============================
Çevrimiçi sosyal medya ve inceleme platformlarının çoğalmasıyla
birlikte, karar verme süreçlerini desteklemek için büyük bir potansiyel
taşıyan bir çok görüş içeren veri kaydedildi. *Duygu analizi* ürün
incelemeleri, blog yorumları ve forum tartışmaları gibi insanların
ürettikleri metinlerdeki duyguları inceler. Siyaset (örn. politikalara
yönelik kamu duygularının analizi), finans (örneğin, pazarın
duygularının analizi) ve pazarlama (örneğin, ürün araştırması ve marka
yönetimi) kadar çeşitli alanlarda geniş uygulamalara sahiptir.
Duygular ayrık kutuplar veya ölçekler (örneğin, pozitif ve negatif)
olarak sınıflandırılabileceğinden, duygu analizini, değişen uzunluktaki
bir metin dizisini sabit uzunlukta bir metin kategorisine dönüştüren bir
metin sınıflandırma görevi olarak düşünebiliriz. Bu bölümde, duygu
analizi için Stanford'un `film incelemesi büyük veri
kümesini `__
kullanacağız. IMDb'den indirilen 25000 film incelemesini içeren bir
eğitim kümesi ve bir test kümesinden oluşur. Her iki veri kümesinde de,
farklı duygu kutuplarını gösteren eşit sayıda “pozitif” ve “negatif”
etiketleri bulunur.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import os
from d2l import mxnet as d2l
from mxnet import np, npx
npx.set_np()
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import os
import torch
from torch import nn
from d2l import torch as d2l
.. raw:: html
.. raw:: html
Veri Kümesini Okuma
-------------------
İlk olarak, bu IMDb inceleme veri kümesini ``../data/aclImdb`` yoluna
indirin ve genişletin.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
d2l.DATA_HUB['aclImdb'] = (
'http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz',
'01ada507287d82875905620988597833ad4e0903')
data_dir = d2l.download_extract('aclImdb', 'aclImdb')
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
d2l.DATA_HUB['aclImdb'] = (
'http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz',
'01ada507287d82875905620988597833ad4e0903')
data_dir = d2l.download_extract('aclImdb', 'aclImdb')
.. raw:: html
.. raw:: html
Ardından, eğitim ve test veri kümelerini okuyun. Her örnek bir inceleme
ve onun etiketidir: “Pozitif” için 1 ve “negatif” için 0.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def read_imdb(data_dir, is_train):
"""IMDb inceleme veri kümesi metin dizilerini ve etiketlerini okuyun."""
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[0:60])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
# trainings: 25000
label: 1 review: Henry Hathaway was daring, as well as enthusiastic, for his
label: 1 review: An unassuming, subtle and lean film, "The Man in the White S
label: 1 review: Eddie Murphy really made me laugh my ass off on this HBO sta
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def read_imdb(data_dir, is_train):
"""IMDb inceleme veri kümesi metin dizilerini ve etiketlerini okuyun."""
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[0:60])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
# trainings: 25000
label: 1 review: Henry Hathaway was daring, as well as enthusiastic, for his
label: 1 review: An unassuming, subtle and lean film, "The Man in the White S
label: 1 review: Eddie Murphy really made me laugh my ass off on this HBO sta
.. raw:: html
.. raw:: html
Veri Kümesini Ön İşlemesi
-------------------------
Her kelimeye bir belirteç gibi davranarak ve 5 kereden az görünen
sözcükleri filtreleyerek, eğitim veri kümesinden bir kelime dağarcığı
oluşturuyoruz.
.. raw:: html
.. raw:: html
.. 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:: html
.. raw:: html
.. 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:: html
.. raw:: html
Belirteçlendirme işleminden sonra, inceleme uzunluklarının belirteçler
cinsinden histogramını çizelim.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
d2l.set_figsize()
d2l.plt.xlabel('inceleme başına belirteç sayısı')
d2l.plt.ylabel('adet')
d2l.plt.hist([len(line) for line in train_tokens], bins=range(0, 1000, 50));
.. figure:: output_sentiment-analysis-and-dataset_70179c_39_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
d2l.set_figsize()
d2l.plt.xlabel('inceleme başına belirteç sayısı')
d2l.plt.ylabel('adet')
d2l.plt.hist([len(line) for line in train_tokens], bins=range(0, 1000, 50));
.. figure:: output_sentiment-analysis-and-dataset_70179c_42_0.svg
.. raw:: html
.. raw:: html
Beklediğimiz gibi, incelemeler değişen uzunluklara sahiptir. Bu tür
incelemelerin minigrup işlemlerini her seferinde işlemek için,
:numref:`sec_machine_translation` içindeki makine çevirisi veri kümesi
için ön işleme adımına benzer olan budama ve dolgulama ile her
incelemenin uzunluğunu 500 olarak ayarladık.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
num_steps = 500 # dizi uzunluğu
train_features = np.array([d2l.truncate_pad(
vocab[line], num_steps, vocab['
']) for line in train_tokens])
print(train_features.shape)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(25000, 500)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
num_steps = 500 # dizi uzunluğu
train_features = torch.tensor([d2l.truncate_pad(
vocab[line], num_steps, vocab['
']) for line in train_tokens])
print(train_features.shape)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
torch.Size([25000, 500])
.. raw:: html
.. raw:: html
Veri Yineleyiciler Oluşturma
----------------------------
Şimdi veri yineleyiciler oluşturabiliriz. Her yinelemede, bir örnek
minigrubu döndürülür.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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))
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
X: (64, 500) , y: (64,)
# batches: 391
.. raw:: html
.. raw:: html
.. 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))
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
X: torch.Size([64, 500]) , y: torch.Size([64])
# batches: 391
.. raw:: html
.. raw:: html
Her Şeyleri Bir Araya Koymak
----------------------------
Son olarak, yukarıdaki adımları ``load_data_imdb`` işlevinde sarıyoruz.
İşlev eğitim ve test veri yineleyicileri ve IMDb inceleme veri kümesinin
kelime dağarcığını döndürür.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def load_data_imdb(batch_size, num_steps=500):
"""Veri yineleyicilerini ve IMDb inceleme veri kümesinin kelime dağarcığını döndür."""
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['
']) for line in train_tokens])
test_features = np.array([d2l.truncate_pad(
vocab[line], num_steps, vocab['']) 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
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def load_data_imdb(batch_size, num_steps=500):
"""Veri yineleyicilerini ve IMDb inceleme veri kümesinin kelime dağarcığını döndür."""
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
.. raw:: html
.. raw:: html
Özet
----
- Duygu analizi, değişen uzunluktaki bir metin dizisini sabit uzunlukta
bir metin kategorisine dönüştüren bir metin sınıflandırma problemi
olarak kabul edilen, insanların ürettikleri metindeki duygularını
inceler.
- Ön işlemeden sonra Stanford'un film inceleme büyük veri kümesini
(IMDb inceleme veri kümesini) kelime dağarcıklı veri yineleyicilerine
yükleyebiliriz.
Alıştırmalar
------------
1. Duygu analizi modellerinin eğitimi hızlandırmak için bu bölümdeki
hangi hiper parametreleri değiştirebiliriz?
2. `Amazon
incelemeleri `__ veri
kümesini duygu analizi için veri yineleyicilerine ve etiketlere
yükleme için bir işlev uygulayabilir misiniz?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html