色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch教程-10.5。機器翻譯和數據集

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀

在引起人們對現代 RNN 廣泛興趣的重大突破中,有一項是統計機器翻譯應用領域的重大進展 。在這里,模型以一種語言的句子呈現,并且必須預測另一種語言的相應句子。請注意,由于兩種語言的語法結構不同,這里的句子可能有不同的長度,并且兩個句子中相應的詞可能不會以相同的順序出現。

許多問題都具有這種在兩個這樣的“未對齊”序列之間進行映射的風格。示例包括從對話提示到回復或從問題到答案的映射。廣義上,此類問題稱為 序列到序列(seq2seq) 問題,它們是本章剩余部分和 第 11 節大部分內容的重點。

在本節中,我們將介紹機器翻譯問題和我們將在后續示例中使用的示例數據集。幾十年來,語言間翻譯的統計公式一直很流行 (Brown等人,1990 年,Brown等人,1988 年),甚至在研究人員使神經網絡方法起作用之前(這些方法通常被統稱為神經機器翻譯)。

首先,我們需要一些新代碼來處理我們的數據。與我們在9.3 節中看到的語言建模不同,這里的每個示例都包含兩個單獨的文本序列,一個是源語言,另一個(翻譯)是目標語言。以下代碼片段將展示如何將預處理后的數據加載到小批量中進行訓練。

import os
import torch
from d2l import torch as d2l

import os
from mxnet import np, npx
from d2l import mxnet as d2l

npx.set_np()

import os
from jax import numpy as jnp
from d2l import jax as d2l

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

import os
import tensorflow as tf
from d2l import tensorflow as d2l

10.5.1。下載和預處理數據集

首先,我們 從 Tatoeba Project 下載由雙語句子對組成的英法數據集。數據集中的每一行都是一個制表符分隔的對,由一個英文文本序列和翻譯后的法文文本序列組成。請注意,每個文本序列可以只是一個句子,也可以是一段多句。在這個英語翻譯成法語的機器翻譯問題中,英語被稱為源語言,法語被稱為目標語言。

class MTFraEng(d2l.DataModule): #@save
  """The English-French dataset."""
  def _download(self):
    d2l.extract(d2l.download(
      d2l.DATA_URL+'fra-eng.zip', self.root,
      '94646ad1522d915e7b0f9296181140edcf86a4f5'))
    with open(self.root + '/fra-eng/fra.txt', encoding='utf-8') as f:
      return f.read()

data = MTFraEng()
raw_text = data._download()
print(raw_text[:75])

Downloading ../data/fra-eng.zip from http://d2l-data.s3-accelerate.amazonaws.com/fra-eng.zip...
Go. Va !
Hi. Salut !
Run!    Cours?!
Run!    Courez?!
Who?    Qui ?
Wow!    ?a alors?!

class MTFraEng(d2l.DataModule): #@save
  """The English-French dataset."""
  def _download(self):
    d2l.extract(d2l.download(
      d2l.DATA_URL+'fra-eng.zip', self.root,
      '94646ad1522d915e7b0f9296181140edcf86a4f5'))
    with open(self.root + '/fra-eng/fra.txt', encoding='utf-8') as f:
      return f.read()

data = MTFraEng()
raw_text = data._download()
print(raw_text[:75])

Go. Va !
Hi. Salut !
Run!    Cours?!
Run!    Courez?!
Who?    Qui ?
Wow!    ?a alors?!

class MTFraEng(d2l.DataModule): #@save
  """The English-French dataset."""
  def _download(self):
    d2l.extract(d2l.download(
      d2l.DATA_URL+'fra-eng.zip', self.root,
      '94646ad1522d915e7b0f9296181140edcf86a4f5'))
    with open(self.root + '/fra-eng/fra.txt', encoding='utf-8') as f:
      return f.read()

data = MTFraEng()
raw_text = data._download()
print(raw_text[:75])

Go. Va !
Hi. Salut !
Run!    Cours?!
Run!    Courez?!
Who?    Qui ?
Wow!    ?a alors?!

class MTFraEng(d2l.DataModule): #@save
  """The English-French dataset."""
  def _download(self):
    d2l.extract(d2l.download(
      d2l.DATA_URL+'fra-eng.zip', self.root,
      '94646ad1522d915e7b0f9296181140edcf86a4f5'))
    with open(self.root + '/fra-eng/fra.txt', encoding='utf-8') as f:
      return f.read()

data = MTFraEng()
raw_text = data._download()
print(raw_text[:75])

Go. Va !
Hi. Salut !
Run!    Cours?!
Run!    Courez?!
Who?    Qui ?
Wow!    ?a alors?!

下載數據集后,我們對原始文本數據進行幾個預處理步驟。例如,我們將不間斷空格替換為空格,將大寫字母轉換為小寫字母,在單詞和標點符號之間插入空格。

@d2l.add_to_class(MTFraEng) #@save
def _preprocess(self, text):
  # Replace non-breaking space with space
  text = text.replace('u202f', ' ').replace('xa0', ' ')
  # Insert space between words and punctuation marks
  no_space = lambda char, prev_char: char in ',.!?' and prev_char != ' '
  out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
      for i, char in enumerate(text.lower())]
  return ''.join(out)

text = data._preprocess(raw_text)
print(text[:80])

go .    va !
hi .    salut !
run !    cours !
run !    courez !
who ?    qui ?
wow !    ?a alors !

@d2l.add_to_class(MTFraEng) #@save
def _preprocess(self, text):
  # Replace non-breaking space with space
  text = text.replace('u202f', ' ').replace('xa0', ' ')
  # Insert space between words and punctuation marks
  no_space = lambda char, prev_char: char in ',.!?' and prev_char != ' '
  out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
      for i, char in enumerate(text.lower())]
  return ''.join(out)

text = data._preprocess(raw_text)
print(text[:80])

go .    va !
hi .    salut !
run !    cours !
run !    courez !
who ?    qui ?
wow !    ?a alors !

@d2l.add_to_class(MTFraEng) #@save
def _preprocess(self, text):
  # Replace non-breaking space with space
  text = text.replace('u202f', ' ').replace('xa0', ' ')
  # Insert space between words and punctuation marks
  no_space = lambda char, prev_char: char in ',.!?' and prev_char != ' '
  out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
      for i, char in enumerate(text.lower())]
  return ''.join(out)

text = data._preprocess(raw_text)
print(text[:80])

go .    va !
hi .    salut !
run !    cours !
run !    courez !
who ?    qui ?
wow !    ?a alors !

@d2l.add_to_class(MTFraEng) #@save
def _preprocess(self, text):
  # Replace non-breaking space with space
  text = text.replace('u202f', ' ').replace('xa0', ' ')
  # Insert space between words and punctuation marks
  no_space = lambda char, prev_char: char in ',.!?' and prev_char != ' '
  out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
      for i, char in enumerate(text.lower())]
  return ''.join(out)

text = data._preprocess(raw_text)
print(text[:80])

go .    va !
hi .    salut !
run !    cours !
run !    courez !
who ?    qui ?
wow !    ?a alors !

10.5.2。代幣化

與第 9.3 節中的字符級標記化不同 ,對于機器翻譯,我們在這里更喜歡單詞級標記化(當今最先進的模型使用更復雜的標記化技術)。以下_tokenize方法對第一個max_examples文本序列對進行分詞,其中每個分詞要么是一個單詞,要么是一個標點符號。我們將特殊的“”標記附加到每個序列的末尾,以指示序列的結束。當模型通過生成一個接一個標記的序列標記進行預測時,“”標記的生成表明輸出序列是完整的。最后,下面的方法返回兩個令牌列表列表:src和tgt。具體來說,src[i]是來自ith源語言(此處為英語)的文本序列和tgt[i]目標語言(此處為法語)的文本序列。

@d2l.add_to_class(MTFraEng) #@save
def _tokenize(self, text, max_examples=None):
  src, tgt = [], []
  for i, line in enumerate(text.split('n')):
    if max_examples and i > max_examples: break
    parts = line.split('t')
    if len(parts) == 2:
      # Skip empty tokens
      src.append([t for t in f'{parts[0]} '.split(' ') if t])
      tgt.append([t for t in f'{parts[1]} '.split(' ') if t])
  return src, tgt

src, tgt = data._tokenize(text)
src[:6], tgt[:6]

([['go', '.', ''],
 ['hi', '.', ''],
 ['run', '!', ''],
 ['run', '!', ''],
 ['who', '?', ''],
 ['wow', '!', '']],
 [['va', '!', ''],
 ['salut', '!', ''],
 ['cours', '!', ''],
 ['courez', '!', ''],
 ['qui', '?', ''],
 ['?a', 'alors', '!', '']])

@d2l.add_to_class(MTFraEng) #@save
def _tokenize(self, text, max_examples=None):
  src, tgt = [], []
  for i, line in enumerate(text.split('n')):
    if max_examples and i > max_examples: break
    parts = line.split('t')
    if len(parts) == 2:
      # Skip empty tokens
      src.append([t for t in f'{parts[0]} '.split(' ') if t])
      tgt.append([t for t in f'{parts[1]} '.split(' ') if t])
  return src, tgt

src, tgt = data._tokenize(text)
src[:6], tgt[:6]

([['go', '.', ''],
 ['hi', '.', ''],
 ['run', '!', ''],
 ['run', '!', ''],
 ['who', '?', ''],
 ['wow', '!', '']],
 [['va', '!', ''],
 ['salut', '!', ''],
 ['cours', '!', ''],
 ['courez', '!', ''],
 ['qui', '?', ''],
 ['?a', 'alors', '!', '']])

@d2l.add_to_class(MTFraEng) #@save
def _tokenize(self, text, max_examples=None):
  src, tgt = [], []
  for i, line in enumerate(text.split('n')):
    if max_examples and i > max_examples: break
    parts = line.split('t')
    if len(parts) == 2:
      # Skip empty tokens
      src.append([t for t in f'{parts[0]} '.split(' ') if t])
      tgt.append([t for t in f'{parts[1]} '.split(' ') if t])
  return src, tgt

src, tgt = data._tokenize(text)
src[:6], tgt[:6]

([['go', '.', ''],
 ['hi', '.', ''],
 ['run', '!', ''],
 ['run', '!', ''],
 ['who', '?', ''],
 ['wow', '!', '']],
 [['va', '!', ''],
 ['salut', '!', ''],
 ['cours', '!', ''],
 ['courez', '!', ''],
 ['qui', '?', ''],
 ['?a', 'alors', '!', '']])

@d2l.add_to_class(MTFraEng) #@save
def _tokenize(self, text, max_examples=None):
  src, tgt = [], []
  for i, line in enumerate(text.split('n')):
    if max_examples and i > max_examples: break
    parts = line.split('t')
    if len(parts) == 2:
      # Skip empty tokens
      src.append([t for t in f'{parts[0]} '.split(' ') if t])
      tgt.append([t for t in f'{parts[1]} '.split(' ') if t])
  return src, tgt

src, tgt = data._tokenize(text)
src[:6], tgt[:6]

([['go', '.', ''],
 ['hi', '.', ''],
 ['run', '!', ''],
 ['run', '!', ''],
 ['who', '?', ''],
 ['wow', '!', '']],
 [['va', '!', ''],
 ['salut', '!', ''],
 ['cours', '!', ''],
 ['courez', '!', ''],
 ['qui', '?', ''],
 ['?a', 'alors', '!', '']])

讓我們繪制每個文本序列的標記數量的直方圖。在這個簡單的英法數據集中,大多數文本序列的標記少于 20 個。

#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
  """Plot the histogram for list length pairs."""
  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', src, tgt);

poYBAGR9N2iABw1YAAF3AJUP1Cw291.svg

#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
  """Plot the histogram for list length pairs."""
  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', src, tgt);

poYBAGR9N2iABw1YAAF3AJUP1Cw291.svg

#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
  """Plot the histogram for list length pairs."""
  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', src, tgt);

poYBAGR9N2iABw1YAAF3AJUP1Cw291.svg

#@save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
  """Plot the histogram for list length pairs."""
  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', src, tgt);

poYBAGR9N2iABw1YAAF3AJUP1Cw291.svg

10.5.3。固定長度的加載序列

回想一下,在語言建模中,每個示例序列(一個句子的一部分或多個句子的跨度)都有固定的長度。這是由第 9.3 節num_steps中的(時間步數或標記數)參數指定的。在機器翻譯中,每個示例都是一對源文本序列和目標文本序列,其中這兩個文本序列可能具有不同的長度。

為了計算效率,我們仍然可以通過截斷和填充一次處理一小批文本序列。假設同一個小批量中的每個序列都應該具有相同的長度 num_steps。如果文本序列少于num_steps標記,我們將繼續在其末尾附加特殊的“”標記,直到其長度達到num_steps. num_steps否則,我們將通過僅獲取其第一個標記并丟棄其余標記來截斷文本序列。這樣,每個文本序列將具有相同的長度,以相同形狀的小批量加載。此外,我們還記錄了不包括填充標記的源序列長度。我們稍后將介紹的某些模型將需要此信息

由于機器翻譯數據集由多對語言組成,我們可以分別為源語言和目標語言構建兩個詞匯表。使用詞級標記化,詞匯量將明顯大于使用字符級標記化的詞匯量。為了減輕這一點,在這里,我們將看上去不到2倍相同的未知數(“”)令牌視為罕見的令牌。正如我們稍后將解釋的(圖 10.7.1),當使用目標序列進行訓練時,解碼器輸出(標簽標記)可以是相同的解碼器輸入(目標標記),移動一個標記;特殊的序列開頭“”標記將用作預測目標序列的第一個輸入標記(圖 10.7.3)。

@d2l.add_to_class(MTFraEng) #@save
def __init__(self, batch_size, num_steps=9, num_train=512, num_val=128):
  super(MTFraEng, self).__init__()
  self.save_hyperparameters()
  self.arrays, self.src_vocab, self.tgt_vocab = self._build_arrays(
    self._download())

@d2l.add_to_class(MTFraEng) #@save
def _build_arrays(self, raw_text, src_vocab=None, tgt_vocab=None):
  def _build_array(sentences, vocab, is_tgt=False):
    pad_or_trim = lambda seq, t: (
      seq[:t] if len(seq) > t else seq + [''] * (t - len(seq)))
    sentences = [pad_or_trim(s, self.num_steps) for s in sentences]
    if is_tgt:
      sentences = [[''] + s for s in sentences]
    if vocab is None:
      vocab = d2l.Vocab(sentences, min_freq=2)
    array = torch.tensor([vocab[s] for s in sentences])
    valid_len = (array != vocab['']).type(torch.int32).sum(1)
    return array, vocab, valid_len
  src, tgt = self._tokenize(self._preprocess(raw_text),
               self.num_train + self.num_val)
  src_array, src_vocab, src_valid_len = _build_array(src, src_vocab)
  tgt_array, tgt_vocab, _ = _build_array(tgt, tgt_vocab, True)
  return ((src_array, tgt_array[:,:-1], src_valid_len, tgt_array[:,1:]),
      src_vocab, tgt_vocab)

@d2l.add_to_class(MTFraEng) #@save
def __init__(self, batch_size, num_steps=9, num_train=512, num_val=128):
  super(MTFraEng, self).__init__()
  self.save_hyperparameters()
  self.arrays, self.src_vocab, self.tgt_vocab = self._build_arrays(
    self._download())

@d2l.add_to_class(MTFraEng) #@save
def _build_arrays(self, raw_text, src_vocab=None, tgt_vocab=None):
  def _build_array(sentences, vocab, is_tgt=False):
    pad_or_trim = lambda seq, t: (
      seq[:t] if len(seq) > t else seq + [''] * (t - len(seq)))
    sentences = [pad_or_trim(s, self.num_steps) for s in sentences]
    if is_tgt:
      sentences = [[''] + s for s in sentences]
    if vocab is None:
      vocab = d2l.Vocab(sentences, min_freq=2)
    array = np.array([vocab[s] for s in sentences])
    valid_len = (array != vocab['']).astype(np.int32).sum(1)
    return array, vocab, valid_len
  src, tgt = self._tokenize(self._preprocess(raw_text),
               self.num_train + self.num_val)
  src_array, src_vocab, src_valid_len = _build_array(src, src_vocab)
  tgt_array, tgt_vocab, _ = _build_array(tgt, tgt_vocab, True)
  return ((src_array, tgt_array[:,:-1], src_valid_len, tgt_array[:,1:]),
      src_vocab, tgt_vocab)

@d2l.add_to_class(MTFraEng) #@save
def __init__(self, batch_size, num_steps=9, num_train=512, num_val=128):
  super(MTFraEng, self).__init__()
  self.save_hyperparameters()
  self.arrays, self.src_vocab, self.tgt_vocab = self._build_arrays(
    self._download())

@d2l.add_to_class(MTFraEng) #@save
def _build_arrays(self, raw_text, src_vocab=None, tgt_vocab=None):
  def _build_array(sentences, vocab, is_tgt=False):
    pad_or_trim = lambda seq, t: (
      seq[:t] if len(seq) > t else seq + [''] * (t - len(seq)))
    sentences = [pad_or_trim(s, self.num_steps) for s in sentences]
    if is_tgt:
      sentences = [[''] + s for s in sentences]
    if vocab is None:
      vocab = d2l.Vocab(sentences, min_freq=2)
    array = jnp.array([vocab[s] for s in sentences])
    valid_len = (array != vocab['']).astype(jnp.int32).sum(1)
    return array, vocab, valid_len
  src, tgt = self._tokenize(self._preprocess(raw_text),
               self.num_train + self.num_val)
  src_array, src_vocab, src_valid_len = _build_array(src, src_vocab)
  tgt_array, tgt_vocab, _ = _build_array(tgt, tgt_vocab, True)
  return ((src_array, tgt_array[:,:-1], src_valid_len, tgt_array[:,1:]),
      src_vocab, tgt_vocab)

@d2l.add_to_class(MTFraEng) #@save
def __init__(self, batch_size, num_steps=9, num_train=512, num_val=128):
  super(MTFraEng, self).__init__()
  self.save_hyperparameters()
  self.arrays, self.src_vocab, self.tgt_vocab = self._build_arrays(
    self._download())

@d2l.add_to_class(MTFraEng) #@save
def _build_arrays(self, raw_text, src_vocab=None, tgt_vocab=None):
  def _build_array(sentences, vocab, is_tgt=False):
    pad_or_trim = lambda seq, t: (
      seq[:t] if len(seq) > t else seq + [''] * (t - len(seq)))
    sentences = [pad_or_trim(s, self.num_steps) for s in sentences]
    if is_tgt:
      sentences = [[''] + s for s in sentences]
    if vocab is None:
      vocab = d2l.Vocab(sentences, min_freq=2)
    array = tf.constant([vocab[s] for s in sentences])
    valid_len = tf.reduce_sum(
      tf.cast(array != vocab[''], tf.int32), 1)
    return array, vocab, valid_len
  src, tgt = self._tokenize(self._preprocess(raw_text),
               self.num_train + self.num_val)
  src_array, src_vocab, src_valid_len = _build_array(src, src_vocab)
  tgt_array, tgt_vocab, _ = _build_array(tgt, tgt_vocab, True)
  return ((src_array, tgt_array[:,:-1], src_valid_len, tgt_array[:,1:]),
      src_vocab, tgt_vocab)

10.5.4。讀取數據集

最后,我們定義get_dataloader返回數據迭代器的方法。

@d2l.add_to_class(MTFraEng) #@save
def get_dataloader(self, train):
  idx = slice(0, self.num_train) if train else slice(self.num_train, None)
  return self.get_tensorloader(self.arrays, train, idx)

讓我們從英法數據集中讀取第一個小批量。

data = MTFraEng(batch_size=3)
src, tgt, src_valid_len, label = next(iter(data.train_dataloader()))
print('source:', src.type(torch.int32))
print('decoder input:', tgt.type(torch.int32))
print('source len excluding pad:', src_valid_len.type(torch.int32))
print('label:', label.type(torch.int32))

source: tensor([[ 83, 174,  2,  3,  4,  4,  4,  4,  4],
    [ 84, 32, 91,  2,  3,  4,  4,  4,  4],
    [144, 174,  0,  3,  4,  4,  4,  4,  4]], dtype=torch.int32)
decoder input: tensor([[ 3,  6,  0,  4,  5,  5,  5,  5,  5],
    [ 3, 108, 112, 84,  2,  4,  5,  5,  5],
    [ 3, 87,  0,  4,  5,  5,  5,  5,  5]], dtype=torch.int32)
source len excluding pad: tensor([4, 5, 4], dtype=torch.int32)
label: tensor([[ 6,  0,  4,  5,  5,  5,  5,  5,  5],
    [108, 112, 84,  2,  4,  5,  5,  5,  5],
    [ 87,  0,  4,  5,  5,  5,  5,  5,  5]], dtype=torch.int32)

data = MTFraEng(batch_size=3)
src, tgt, src_valid_len, label = next(iter(data.train_dataloader()))
print('source:', src.astype(np.int32))
print('decoder input:', tgt.astype(np.int32))
print('source len excluding pad:', src_valid_len.astype(np.int32))
print('label:', label.astype(np.int32))

source: [[84 5 2 3 4 4 4 4 4]
 [84 5 2 3 4 4 4 4 4]
 [59 9 2 3 4 4 4 4 4]]
decoder input: [[ 3 108  6  2  4  5  5  5  5]
 [ 3 105  6  2  4  5  5  5  5]
 [ 3 203  0  4  5  5  5  5  5]]
source len excluding pad: [4 4 4]
label: [[108  6  2  4  5  5  5  5  5]
 [105  6  2  4  5  5  5  5  5]
 [203  0  4  5  5  5  5  5  5]]

data = MTFraEng(batch_size=3)
src, tgt, src_valid_len, label = next(iter(data.train_dataloader()))
print('source:', src.astype(jnp.int32))
print('decoder input:', tgt.astype(jnp.int32))
print('source len excluding pad:', src_valid_len.astype(jnp.int32))
print('label:', label.astype(jnp.int32))

source: [[ 86 43  2  3  4  4  4  4  4]
 [176 165  2  3  4  4  4  4  4]
 [143 111  2  3  4  4  4  4  4]]
decoder input: [[ 3 108 183 98  2  4  5  5  5]
 [ 3  6 42  0  4  5  5  5  5]
 [ 3  6  0  4  5  5  5  5  5]]
source len excluding pad: [4 4 4]
label: [[108 183 98  2  4  5  5  5  5]
 [ 6 42  0  4  5  5  5  5  5]
 [ 6  0  4  5  5  5  5  5  5]]

data = MTFraEng(batch_size=3)
src, tgt, src_valid_len, label = next(iter(data.train_dataloader()))
print('source:', tf.cast(src, tf.int32))
print('decoder input:', tf.cast(tgt, tf.int32))
print('source len excluding pad:', tf.cast(src_valid_len, tf.int32))
print('label:', tf.cast(label, tf.int32))

source: tf.Tensor(
[[ 92 115  2  3  4  4  4  4  4]
 [155 168  2  3  4  4  4  4  4]
 [ 86 121  2  3  4  4  4  4  4]], shape=(3, 9), dtype=int32)
decoder input: tf.Tensor(
[[ 3 37  6  2  4  5  5  5  5]
 [ 3  6 192  2  4  5  5  5  5]
 [ 3 108 202 30  2  4  5  5  5]], shape=(3, 9), dtype=int32)
source len excluding pad: tf.Tensor([4 4 4], shape=(3,), dtype=int32)
label: tf.Tensor(
[[ 37  6  2  4  5  5  5  5  5]
 [ 6 192  2  4  5  5  5  5  5]
 [108 202 30  2  4  5  5  5  5]], shape=(3, 9), dtype=int32)

下面我們展示了一對由上述方法處理的源序列和目標序列_build_arrays(以字符串格式)。

@d2l.add_to_class(MTFraEng) #@save
def build(self, src_sentences, tgt_sentences):
  raw_text = 'n'.join([src + 't' + tgt for src, tgt in zip(
    src_sentences, tgt_sentences)])
  arrays, _, _ = self._build_arrays(
    raw_text, self.src_vocab, self.tgt_vocab)
  return arrays

src, tgt, _, _ = data.build(['hi .'], ['salut .'])
print('source:', data.src_vocab.to_tokens(src[0].type(torch.int32)))
print('target:', data.tgt_vocab.to_tokens(tgt[0].type(torch.int32)))

source: ['hi', '.', '', '', '', '', '', '', '']
target: ['', 'salut', '.', '', '', '', '', '', '']

@d2l.add_to_class(MTFraEng) #@save
def build(self, src_sentences, tgt_sentences):
  raw_text = 'n'.join([src + 't' + tgt for src, tgt in zip(
    src_sentences, tgt_sentences)])
  arrays, _, _ = self._build_arrays(
    raw_text, self.src_vocab, self.tgt_vocab)
  return arrays

src, tgt, _, _ = data.build(['hi .'], ['salut .'])
print('source:', data.src_vocab.to_tokens(src[0].astype(np.int32)))
print('target:', data.tgt_vocab.to_tokens(tgt[0].astype(np.int32)))

source: ['hi', '.', '', '', '', '', '', '', '']
target: ['', 'salut', '.', '', '', '', '', '', '']

@d2l.add_to_class(MTFraEng) #@save
def build(self, src_sentences, tgt_sentences):
  raw_text = 'n'.join([src + 't' + tgt for src, tgt in zip(
    src_sentences, tgt_sentences)])
  arrays, _, _ = self._build_arrays(
    raw_text, self.src_vocab, self.tgt_vocab)
  return arrays

src, tgt, _, _ = data.build(['hi .'], ['salut .'])
print('source:', data.src_vocab.to_tokens(src[0].astype(jnp.int32)))
print('target:', data.tgt_vocab.to_tokens(tgt[0].astype(jnp.int32)))

source: ['hi', '.', '', '', '', '', '', '', '']
target: ['', 'salut', '.', '', '', '', '', '', '']

@d2l.add_to_class(MTFraEng) #@save
def build(self, src_sentences, tgt_sentences):
  raw_text = 'n'.join([src + 't' + tgt for src, tgt in zip(
    src_sentences, tgt_sentences)])
  arrays, _, _ = self._build_arrays(
    raw_text, self.src_vocab, self.tgt_vocab)
  return arrays

src, tgt, _, _ = data.build(['hi .'], ['salut .'])
print('source:', data.src_vocab.to_tokens(tf.cast(src[0], tf.int32)))
print('target:', data.tgt_vocab.to_tokens(tf.cast(tgt[0], tf.int32)))

source: ['hi', '.', '', '', '', '', '', '', '']
target: ['', 'salut', '.', '', '', '', '', '', '']

10.5.5。概括

在自然語言處理中,機器翻譯是指將代表源語言文本字符串的序列自動映射到代表目標語言中合理翻譯的字符串的任務。使用詞級標記化,詞匯量將明顯大于使用字符級標記化,但序列長度會短得多。為了減輕大詞匯量,我們可以將不常見的標記視為一些“未知”標記。我們可以截斷和填充文本序列,以便它們都具有相同的長度以加載到小批量中?,F代實現通常將具有相似長度的序列存儲起來,以避免在填充上浪費過多的計算。

10.5.6。練習

max_examples在 方法中嘗試不同的參數值_tokenize。這如何影響源語言和目標語言的詞匯量?

某些語言(例如中文和日文)中的文本沒有字界指示符(例如,空格)。對于這種情況,詞級標記化仍然是一個好主意嗎?為什么或者為什么不?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據集
    +關注

    關注

    4

    文章

    1209

    瀏覽量

    24793
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13328
收藏 人收藏

    評論

    相關推薦

    機器翻譯三大核心技術原理 | AI知識科普

    ,應用場景越多,需要的規則也越來越多,規則之間的沖突也逐漸出現。于是很多科研學家開始思考,是否能讓機器自動從數據庫里學習相應的規則,1993年IBM提出基于詞的統計翻譯模型標志著第二代機器翻譯
    發表于 07-06 10:30

    神經機器翻譯的方法有哪些?

    目前,神經機器翻譯(NMT)已經成為在學術界和工業界最先進的機器翻譯方法。最初的這種基于編碼器-解碼器架構的機器翻譯系統都針對單個語言對進行翻譯。近期的工作開始探索去擴展這種辦法以支持
    發表于 11-23 12:14

    從冷戰到深度學習,機器翻譯歷史不簡單!

    深度學習機器翻譯 實現高質量機器翻譯的夢想已經存在了很多年,很多科學家都為這一夢想貢獻了自己的時間和心力。從早期的基于規則的機器翻譯到如今廣泛應用的神經機器翻譯,
    發表于 09-17 09:23 ?436次閱讀

    機器翻譯的真實水平如何,夢想與現實的距離到底有多遠?

    近年來,隨著計算機性能的提高,云計算、大數據機器學習等相關技術迅速發展,人工智能再度崛起,機器翻譯重新成為人們關注的焦點。一時間,機器翻譯系統如雨后春筍般涌現,各種報道隨之呈井噴式爆
    的頭像 發表于 03-22 14:08 ?4147次閱讀

    換個角度來聊機器翻譯

    同時期國內科技企業在機器翻譯上的進展也非常迅速,以語音和語義理解見長的科大訊飛在2014年國際口語翻譯大賽IWSLT上獲得中英和英中兩個翻譯方向的全球第一名,在2015年又在由美國國家標準技術研究院組織的
    的頭像 發表于 04-24 13:55 ?3520次閱讀
    換個角度來聊<b class='flag-5'>機器翻譯</b>

    機器翻譯走紅的背后是什么

    未來需要新的算法和語義層面的綜合性突破,促進機器翻譯產品的迭代和產業全面升級。
    發表于 07-14 10:02 ?1035次閱讀

    未來機器翻譯會取代人工翻譯

    所謂機器翻譯,就是利用計算機將一種自然語言(源語言)轉換為另一種自然語言(目標語言)的過程。它是計算語言學的一個分支,是人工智能的終極目標之一,具有重要的科學研究價值。而且機器翻譯又具有重要
    的頭像 發表于 12-29 10:12 ?5063次閱讀

    基于句子級上下文的神經機器翻譯綜述

    基于句子級上下文的神經機器翻譯綜述
    發表于 06-29 16:26 ?64次下載

    Google遵循AI原則減少機器翻譯的性別偏見

    得益于神經機器翻譯 (NMT) 的進步,譯文更加自然流暢,但與此同時,這些譯文也反映出訓練數據存在社會偏見和刻板印象。因此,Google 持續致力于遵循 AI 原則,開發創新技術,減少機器翻譯
    的頭像 發表于 08-24 10:14 ?2888次閱讀

    PyTorch教程10.5機器翻譯和數據

    電子發燒友網站提供《PyTorch教程10.5機器翻譯和數據.pdf》資料免費下載
    發表于 06-05 15:14 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>10.5</b>之<b class='flag-5'>機器翻譯</b><b class='flag-5'>和數據</b><b class='flag-5'>集</b>

    PyTorch教程10.7之用于機器翻譯的編碼器-解碼器Seq2Seq

    電子發燒友網站提供《PyTorch教程10.7之用于機器翻譯的編碼器-解碼器Seq2Seq.pdf》資料免費下載
    發表于 06-05 18:14 ?0次下載
    <b class='flag-5'>PyTorch</b>教程10.7之用于<b class='flag-5'>機器翻譯</b>的編碼器-解碼器Seq2Seq

    PyTorch教程14.9之語義分割和數據

    電子發燒友網站提供《PyTorch教程14.9之語義分割和數據.pdf》資料免費下載
    發表于 06-05 11:10 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.9之語義分割<b class='flag-5'>和數據</b><b class='flag-5'>集</b>

    PyTorch教程16.1之情緒分析和數據

    電子發燒友網站提供《PyTorch教程16.1之情緒分析和數據.pdf》資料免費下載
    發表于 06-05 10:54 ?0次下載
    <b class='flag-5'>PyTorch</b>教程16.1之情緒分析<b class='flag-5'>和數據</b><b class='flag-5'>集</b>

    PyTorch教程16.4之自然語言推理和數據

    電子發燒友網站提供《PyTorch教程16.4之自然語言推理和數據.pdf》資料免費下載
    發表于 06-05 10:57 ?0次下載
    <b class='flag-5'>PyTorch</b>教程16.4之自然語言推理<b class='flag-5'>和數據</b><b class='flag-5'>集</b>

    機器翻譯研究進展

    成為主流,如神經網絡機器翻譯。神經網絡機器翻譯機器從大量數據中自動學習翻譯知識,而不依靠人類專家撰寫規則,可以顯著提升
    的頭像 發表于 07-06 11:19 ?878次閱讀
    <b class='flag-5'>機器翻譯</b>研究進展
    主站蜘蛛池模板: 泰国淫乐园实录 | 日本A级作爱片金瓶双艳 | 韩国成人理伦片免费播放 | 久久99热狠狠色AV蜜臀 | 亚洲精品久久久久AV无码林星阑 | 黑人操白逼 | 国产成人精品免费视频软件 | 奶头被客人吸得又红又肿 | 国产av免费观看日本 | 男欢女爱免费视频 | a在线视频免费观看 | 99国内精品久久久久久久清纯 | 亚洲国产成人精品不卡青青草原 | 欧美视频精品一区二区三区 | lesbabes性欧美 | 被窝伦理午夜电影网 | 午夜不卡久久精品无码免费 | 在线成人精品国产区免费 | 久久伦理影院 | chinesevideos原创麻豆| 老师给美女同学开嫩苞 | 穿着丝袜被男生强行啪啪 | 国产av免费观看日本 | 亚洲中文字幕无码爆乳APP | 干了快生了的孕妇 | 热の中文 AV天堂 | 亚洲成人黄色在线 | 亚洲精品国产熟女久久久 | 国产精品永久AV无码视频 | 日韩亚洲人成在线 | 国产1769一七六九视频在线 | 亚洲AV无码一区二区三区乱子伦 | 国产在线亚洲精品观 | 国产1000部成人免费视频 | 美国色情三级欧美三级纸匠情挑 | 日日噜噜噜噜夜夜爽亚洲精品 | 日本乱子伦一区二区三区 | 亚洲精品无AMM毛片 亚洲精品网址 | 十八禁肉动漫无修在线播放 | 99热久这里都是精品小草 | 色欲久久99精品久久久久久AV |