.. _sec_machine_translation:
Makine Çevirisi ve Veri Kümesi
==============================
Doğal dil işlemenin anahtarı olan dil modellerini tasarlamak için RNN
kullandık. Diğer bir amiral gemisi kıyaslaması, girdi dizilerini çıktı
dizilerine dönüştüren *dizi dönüştürme* modelleri için merkezi bir
problem düzlemi olan *makine çevirisi*\ dir. Çeşitli modern yapay zeka
uygulamalarında önemli bir rol oynayan dizi dönüştürme modelleri, bu
bölümün geri kalanının ve sonraki bölümün, :numref:`chap_attention`,
odağını oluşturacaktır. Bu amaçla, bu bölüm makine çevirisi sorununu ve
daha sonra kullanılacak veri kümesini anlatır.
*Makine çevirisi* bir dizinin bir dilden diğerine otomatik çevirisidir.
Aslında, bu alan, özellikle II. Dünya Savaşı'nda dil kodlarını kırmak
için bilgisayarların kullanılması göz önüne alınarak, sayısal
bilgisayarların icat edilmesinin kısa bir süre sonrasından 1940'lara
kadar uzanabilir. Onlarca yıldır, bu alanda, istatistiksel yaklaşımlar,
:cite:`Brown.Cocke.Della-Pietra.ea.1988,Brown.Cocke.Della-Pietra.ea.1990`,
sinir ağlarını kullanarak uçtan uca öğrenmenin yükselmesinin öncesine
kadar baskın olmuştur. İkincisi, çeviri modeli ve dil modeli gibi
bileşenlerde istatistiksel analiz içeren *istatistiksel makine
çevirisinden* ayırt edilmesi için genellikle *sinirsel makine çevirisi*
olarak adlandırılır.
Uçtan uca öğrenmeyi vurgulayan bu kitap, sinirsel makine çevirisi
yöntemlerine odaklanacaktır. Külliyatı tek bir dil olan
:numref:`sec_language_model` içindeki dil modeli problemimizden farklı
olarak, makine çevirisi veri kümeleri sırasıyla kaynak dilde ve hedef
dilde bulunan metin dizileri çiftlerinden oluşmaktadır. Bu nedenle, dil
modelleme için ön işleme rutinini yeniden kullanmak yerine, makine
çevirisi veri kümelerini ön işlemek için farklı bir yol gerekir.
Aşağıda, önceden işlenmiş verilerin eğitim için minigruplara nasıl
yükleneceğini gösteriyoruz.
.. 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 d2l import torch as d2l
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import os
import tensorflow as tf
from d2l import tensorflow as d2l
.. raw:: html
.. raw:: html
Veri Kümesini İndirme ve Ön işleme
----------------------------------
Başlangıç olarak, `Tatoeba Projesi'nden iki dilli cümle
çiftleri `__'nden oluşan bir
İngiliz-Fransız veri kümesini indiriyoruz. Veri kümedeki her satır, bir
sekmeyle ayrılmış İngilizce metin dizisi ve çevrilmiş Fransızca metin
dizisi çiftidir. Her metin dizisinin sadece bir cümle veya birden çok
cümleden oluşan bir paragraf olabileceğini unutmayın. İngilizce'nin
Fransızca'ya çevrildiği bu makine çevirisi probleminde, İngilizce
*kaynak dil*, Fransızca ise *hedef dil*\ dir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
'94646ad1522d915e7b0f9296181140edcf86a4f5')
#@save
def read_data_nmt():
"""İnglizce-Fransızca veri kümesini yükle."""
data_dir = d2l.download_extract('fra-eng')
with open(os.path.join(data_dir, 'fra.txt'), 'r') as f:
return f.read()
raw_text = read_data_nmt()
print(raw_text[:75])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
Go. Va !
Hi. Salut !
Run! Cours !
Run! Courez !
Who? Qui ?
Wow! Ça alors !
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
'94646ad1522d915e7b0f9296181140edcf86a4f5')
#@save
def read_data_nmt():
"""İnglizce-Fransızca veri kümesini yükle."""
data_dir = d2l.download_extract('fra-eng')
with open(os.path.join(data_dir, 'fra.txt'), 'r') as f:
return f.read()
raw_text = read_data_nmt()
print(raw_text[:75])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
Go. Va !
Hi. Salut !
Run! Cours !
Run! Courez !
Who? Qui ?
Wow! Ça alors !
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
'94646ad1522d915e7b0f9296181140edcf86a4f5')
#@save
def read_data_nmt():
"""İnglizce-Fransızca veri kümesini yükle."""
data_dir = d2l.download_extract('fra-eng')
with open(os.path.join(data_dir, 'fra.txt'), 'r') as f:
return f.read()
raw_text = read_data_nmt()
print(raw_text[:75])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
Go. Va !
Hi. Salut !
Run! Cours !
Run! Courez !
Who? Qui ?
Wow! Ça alors !
.. raw:: html
.. raw:: html
Veri kümesini indirdikten sonra, ham metin verileri için birkaç ön
işleme adımı ile devam ediyoruz. Örneğin, aralıksız boşluğu boşlukla
değiştirir, büyük harfleri küçük harflere dönüştürür ve sözcüklerle
noktalama işaretleri arasına boşluk ekleriz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def preprocess_nmt(text):
"""İngilizce-Fransızca veri kümesini ön işle."""
def no_space(char, prev_char):
return char in set(',.!?') and prev_char != ' '
# Bölünmez boşluğu boşlukla değiştirin ve büyük harfleri küçük
# harflere dönüştürün
text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
# Sözcükler ve noktalama işaretleri arasına boşluk ekleyin
out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
for i, char in enumerate(text)]
return ''.join(out)
text = preprocess_nmt(raw_text)
print(text[:80])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
go . va !
hi . salut !
run ! cours !
run ! courez !
who ? qui ?
wow ! ça alors !
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def preprocess_nmt(text):
"""İngilizce-Fransızca veri kümesini ön işle."""
def no_space(char, prev_char):
return char in set(',.!?') and prev_char != ' '
# Bölünmez boşluğu boşlukla değiştirin ve büyük harfleri küçük
# harflere dönüştürün
text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
# Sözcükler ve noktalama işaretleri arasına boşluk ekleyin
out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
for i, char in enumerate(text)]
return ''.join(out)
text = preprocess_nmt(raw_text)
print(text[:80])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
go . va !
hi . salut !
run ! cours !
run ! courez !
who ? qui ?
wow ! ça alors !
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def preprocess_nmt(text):
"""İngilizce-Fransızca veri kümesini ön işle."""
def no_space(char, prev_char):
return char in set(',.!?') and prev_char != ' '
# Bölünmez boşluğu boşlukla değiştirin ve büyük harfleri küçük
# harflere dönüştürün
text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
# Sözcükler ve noktalama işaretleri arasına boşluk ekleyin
out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
for i, char in enumerate(text)]
return ''.join(out)
text = preprocess_nmt(raw_text)
print(text[:80])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
go . va !
hi . salut !
run ! cours !
run ! courez !
who ? qui ?
wow ! ça alors !
.. raw:: html
.. raw:: html
Andıçlama
---------
:numref:`sec_language_model` içindeki karakter düzeyinde andıçlara
ayırmaktan farklı olarak, makine çevirisi için burada kelime düzeyinde
andıçlamayı tercih ediyoruz (son teknoloji modeller daha gelişmiş
andıçlama teknikleri kullanabilir). Aşağıdaki ``tokenize_nmt`` işlevi,
her andıç bir sözcük veya noktalama işareti olduğu ilk ``num_examples``
tane metin dizisi çiftini andıçlar. Bu işlev, andıç listelerinden oluşan
iki liste döndürür: ``source`` (kaynak) ve ``target`` (hedef).
Özellikle, ``source[i]`` kaynak dilde (İngilizce burada) :math:`i`.
metin dizisinden andıçların bir listesidir ve ``target[i]`` hedef
dildekileri (Fransızca burada) içerir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def tokenize_nmt(text, num_examples=None):
"""İngilizce-Fransızca veri kümesini andıçla."""
source, target = [], []
for i, line in enumerate(text.split('\n')):
if num_examples and i > num_examples:
break
parts = line.split('\t')
if len(parts) == 2:
source.append(parts[0].split(' '))
target.append(parts[1].split(' '))
return source, target
source, target = tokenize_nmt(text)
source[:6], target[:6]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
([['go', '.'],
['hi', '.'],
['run', '!'],
['run', '!'],
['who', '?'],
['wow', '!']],
[['va', '!'],
['salut', '!'],
['cours', '!'],
['courez', '!'],
['qui', '?'],
['ça', 'alors', '!']])
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def tokenize_nmt(text, num_examples=None):
"""İngilizce-Fransızca veri kümesini andıçla."""
source, target = [], []
for i, line in enumerate(text.split('\n')):
if num_examples and i > num_examples:
break
parts = line.split('\t')
if len(parts) == 2:
source.append(parts[0].split(' '))
target.append(parts[1].split(' '))
return source, target
source, target = tokenize_nmt(text)
source[:6], target[:6]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
([['go', '.'],
['hi', '.'],
['run', '!'],
['run', '!'],
['who', '?'],
['wow', '!']],
[['va', '!'],
['salut', '!'],
['cours', '!'],
['courez', '!'],
['qui', '?'],
['ça', 'alors', '!']])
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def tokenize_nmt(text, num_examples=None):
"""İngilizce-Fransızca veri kümesini andıçla."""
source, target = [], []
for i, line in enumerate(text.split('\n')):
if num_examples and i > num_examples:
break
parts = line.split('\t')
if len(parts) == 2:
source.append(parts[0].split(' '))
target.append(parts[1].split(' '))
return source, target
source, target = tokenize_nmt(text)
source[:6], target[:6]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
([['go', '.'],
['hi', '.'],
['run', '!'],
['run', '!'],
['who', '?'],
['wow', '!']],
[['va', '!'],
['salut', '!'],
['cours', '!'],
['courez', '!'],
['qui', '?'],
['ça', 'alors', '!']])
.. raw:: html
.. raw:: html
Metin dizisi başına andıç sayısının histogramını çizelim. Bu basit
İngilizce-Fransız veri kümesinde, metin dizilerinin çoğunun 20'den az
andıcı vardır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
"""Liste uzunluğu çiftleri için histogramı çizin."""
d2l.set_figsize()
_, _, patches = d2l.plt.hist(
[[len(l) for l in xlist], [len(l) for l in ylist]])
d2l.plt.xlabel(xlabel)
d2l.plt.ylabel(ylabel)
for patch in patches[1].patches:
patch.set_hatch('/')
d2l.plt.legend(legend)
show_list_len_pair_hist(['source', 'target'], '# tokens per sequence',
'count', source, target);
.. figure:: output_machine-translation-and-dataset_887557_51_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
"""Liste uzunluğu çiftleri için histogramı çizin."""
d2l.set_figsize()
_, _, patches = d2l.plt.hist(
[[len(l) for l in xlist], [len(l) for l in ylist]])
d2l.plt.xlabel(xlabel)
d2l.plt.ylabel(ylabel)
for patch in patches[1].patches:
patch.set_hatch('/')
d2l.plt.legend(legend)
show_list_len_pair_hist(['source', 'target'], '# tokens per sequence',
'count', source, target);
.. figure:: output_machine-translation-and-dataset_887557_54_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
"""Liste uzunluğu çiftleri için histogramı çizin."""
d2l.set_figsize()
_, _, patches = d2l.plt.hist(
[[len(l) for l in xlist], [len(l) for l in ylist]])
d2l.plt.xlabel(xlabel)
d2l.plt.ylabel(ylabel)
for patch in patches[1].patches:
patch.set_hatch('/')
d2l.plt.legend(legend)
show_list_len_pair_hist(['source', 'target'], '# tokens per sequence',
'count', source, target);
.. figure:: output_machine-translation-and-dataset_887557_57_0.svg
.. raw:: html
.. raw:: html
Kelime Dağarcığı
----------------
Makine çeviri veri kümesi dil çiftlerinden oluştuğundan, hem kaynak dil
hem de hedef dil için ayrı ayrı iki kelime hazinesi oluşturabiliriz.
Kelime düzeyinde andıçlamada, kelime dağarcığı boyutu, karakter
düzeyinde andıç kullanandan önemli ölçüde daha büyük olacaktır. Bunu
hafifletmek için, burada 2 defadan az görünen seyrek andıçları aynı
bilinmeyen ("") andıcı ile ifade ediyoruz. Bunun yanı sıra,
minigruplarda dizileri aynı uzunlukta dolgulamak için ("") ve
dizilerin başlangıcını işaretlemek için ("") veya sonunu
işaretlemek için ("") gibi ek özel andıçlar belirtiyoruz. Bu tür
özel andıçlar, doğal dil işleme görevlerinde yaygın olarak kullanılır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
src_vocab = d2l.Vocab(source, min_freq=2,
reserved_tokens=['
', '', ''])
len(src_vocab)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
10012
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
src_vocab = d2l.Vocab(source, min_freq=2,
reserved_tokens=['
', '', ''])
len(src_vocab)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
10012
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
src_vocab = d2l.Vocab(source, min_freq=2,
reserved_tokens=['
', '', ''])
len(src_vocab)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
10012
.. raw:: html
.. raw:: html
.. _subsec_mt_data_loading:
Veri Kümesini Okuma
-------------------
Dil modellemesinde, her dizi örneğinin, bir cümlenin bir kesimine veya
birden fazla cümle üzerine bir yayılan sabit bir uzunluğa sahip olduğunu
hatırlayın. Bu :numref:`sec_language_model` içindeki ``num_steps``
(zaman adımları veya andıç sayısı) bağımsız değişkeni tarafından
belirtilmiştir. Makine çevirisinde, her örnek, her metin dizisinin
farklı uzunluklara sahip olabileceği bir kaynak ve hedef metin dizisi
çiftidir.
Hesaplamada verimlilik için, yine de bir minigrup metin dizisini *kırkma
(truncation)* ve *dolgu* ile işleyebiliriz. Aynı minigruptaki her
dizinin aynı ``num_steps`` uzunluğunda olması gerektiğini varsayalım.
Bir metin dizisi ``num_steps`` andıçtan daha azsa, uzunluğu
``num_steps``'e ulaşana kadar özel "" andıcını sonuna eklemeye
devam edeceğiz. Aksi takdirde, metin sırasını yalnızca ilk ``num_steps``
andıcını alıp geri kalanını atarak keseceğiz. Bu şekilde, her metin
dizisi aynı şekle sahip minigruplar olarak yüklenebileceği aynı uzunluğa
sahip olacaktır.
Aşağıdaki ``truncate_pad`` işlevi metin dizilerini daha önce açıklandığı
gibi keser veya dolgular.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def truncate_pad(line, num_steps, padding_token):
"""Dizileri dolgula veya kırk"""
if len(line) > num_steps:
return line[:num_steps] # Truncate
return line + [padding_token] * (num_steps - len(line)) # Pad
truncate_pad(src_vocab[source[0]], 10, src_vocab['
'])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[47, 4, 1, 1, 1, 1, 1, 1, 1, 1]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def truncate_pad(line, num_steps, padding_token):
"""Dizileri dolgula veya kırk"""
if len(line) > num_steps:
return line[:num_steps] # Truncate
return line + [padding_token] * (num_steps - len(line)) # Pad
truncate_pad(src_vocab[source[0]], 10, src_vocab['
'])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[47, 4, 1, 1, 1, 1, 1, 1, 1, 1]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def truncate_pad(line, num_steps, padding_token):
"""Dizileri dolgula veya kırk"""
if len(line) > num_steps:
return line[:num_steps] # Truncate
return line + [padding_token] * (num_steps - len(line)) # Pad
truncate_pad(src_vocab[source[0]], 10, src_vocab['
'])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[47, 4, 1, 1, 1, 1, 1, 1, 1, 1]
.. raw:: html
.. raw:: html
Şimdi, metin dizilerini eğitimde minigruplara dönüştürmek için bir işlev
tanımlıyoruz. Dizinin sonunu belirtmek için her dizinin sonuna özel
“” andıcını ekliyoruz. Bir model bir diziyi her andıç sonrası bir
andıç oluşturarak tahmin ettiğinde, modelin “” andıcını oluşturması
çıktı dizisini tamamlandığını ifade edebilir. Ayrıca, dolgu andıçlarını
hariç tutarak her metin dizisinin uzunluğunu da kaydediyoruz. Bu bilgi,
daha sonra ele alacağımız bazı modellerde gerekli olacaktır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def build_array_nmt(lines, vocab, num_steps):
"""Makine çevirisinin metin dizilerini minigruplara dönüştürün."""
lines = [vocab[l] for l in lines]
lines = [l + [vocab['
']] for l in lines]
array = np.array([truncate_pad(
l, num_steps, vocab['']) for l in lines])
valid_len = (array != vocab['']).astype(np.int32).sum(1)
return array, valid_len
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def build_array_nmt(lines, vocab, num_steps):
"""Makine çevirisinin metin dizilerini minigruplara dönüştürün."""
lines = [vocab[l] for l in lines]
lines = [l + [vocab['
']] for l in lines]
array = torch.tensor([truncate_pad(
l, num_steps, vocab['']) for l in lines])
valid_len = (array != vocab['']).type(torch.int32).sum(1)
return array, valid_len
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def build_array_nmt(lines, vocab, num_steps):
"""Makine çevirisinin metin dizilerini minigruplara dönüştürün."""
lines = [vocab[l] for l in lines]
lines = [l + [vocab['
']] for l in lines]
array = tf.constant([truncate_pad(
l, num_steps, vocab['']) for l in lines])
valid_len = tf.reduce_sum(
tf.cast(array != vocab[''], tf.int32), 1)
return array, valid_len
.. raw:: html
.. raw:: html
Her Şeyi Bir Araya Koyma
------------------------
Son olarak, veri yineleyiciyi hem kaynak dil hem de hedef dil için
kelime dağarcıkları ile birlikte döndüren ``load_data_nmt`` işlevini
tanımlıyoruz.
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def load_data_nmt(batch_size, num_steps, num_examples=600):
"""Çeviri veri kümesinin yineleyicisini ve sözcük dağarcıklarını döndür."""
text = preprocess_nmt(read_data_nmt())
source, target = tokenize_nmt(text, num_examples)
src_vocab = d2l.Vocab(source, min_freq=2,
reserved_tokens=['', '', ''])
tgt_vocab = d2l.Vocab(target, min_freq=2,
reserved_tokens=['', '', ''])
src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)
tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)
data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)
data_iter = d2l.load_array(data_arrays, batch_size)
return data_iter, src_vocab, tgt_vocab
İngilizce-Fransız veri kümesinden ilk minigrubu okuyalım.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
print('X:', X.astype(np.int32))
print('valid lengths for X:', X_valid_len)
print('Y:', Y.astype(np.int32))
print('valid lengths for Y:', Y_valid_len)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
X: [[76 8 5 3 1 1 1 1]
[ 9 72 4 3 1 1 1 1]]
valid lengths for X: [4 4]
Y: [[ 0 28 5 3 1 1 1 1]
[ 0 55 4 3 1 1 1 1]]
valid lengths for Y: [4 4]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
print('X:', X.type(torch.int32))
print('valid lengths for X:', X_valid_len)
print('Y:', Y.type(torch.int32))
print('valid lengths for Y:', Y_valid_len)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
X: tensor([[ 9, 21, 4, 3, 1, 1, 1, 1],
[ 7, 59, 4, 3, 1, 1, 1, 1]], dtype=torch.int32)
valid lengths for X: tensor([4, 4])
Y: tensor([[97, 4, 3, 1, 1, 1, 1, 1],
[38, 7, 0, 4, 3, 1, 1, 1]], dtype=torch.int32)
valid lengths for Y: tensor([3, 5])
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
print('X:', tf.cast(X, tf.int32))
print('valid lengths for X:', X_valid_len)
print('Y:', tf.cast(Y, tf.int32))
print('valid lengths for Y:', Y_valid_len)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
X: tf.Tensor(
[[ 52 176 4 3 1 1 1 1]
[ 31 168 4 3 1 1 1 1]], shape=(2, 8), dtype=int32)
valid lengths for X: tf.Tensor([4 4], shape=(2,), dtype=int32)
Y: tf.Tensor(
[[30 0 22 5 3 1 1 1]
[ 0 5 3 1 1 1 1 1]], shape=(2, 8), dtype=int32)
valid lengths for Y: tf.Tensor([5 3], shape=(2,), dtype=int32)
.. raw:: html
.. raw:: html
Özet
----
- Makine çevirisi, bir dizinin bir dilden diğerine otomatik çevirisini
ifade eder.
- Kelime düzeyinde andıçlama kullanırsak, kelime dağarcığının boyutu,
karakter düzeyinde andıçlama kullanmaya göre önemli ölçüde daha büyük
olacaktır. Bunu hafifletmek için, seyrek kullanılan andıçları aynı
bilinmeyen andıç olarak ifade alabiliriz.
- Metin dizilerini kırkabilir ve dolgulayabiliriz, böylece hepsi
minigruplarda yüklenirken aynı uzunluğa sahip olurlar.
Alıştırmalar
------------
1. ``load_data_nmt`` işlevindeki ``num_examples`` değişkeninin farklı
değerlerini deneyin. Bu, kaynak ve hedef dillerin kelime dağarcığı
boyutlarını nasıl etkiler?
2. Çince ve Japonca gibi bazı dillerde metin, kelime sınır
göstergelerine (örn., boşluk) sahip değildir. Sözcük düzeyinde
andıçlama bu gibi durumlar için hala iyi bir fikir midir? Neden?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html