9.5 機器翻譯與數據集

語言模型是自然語言處理的關鍵,而機器翻譯是語言模型最成功的基準測試,因為機器翻譯正是將輸入序列轉換成輸出序列的序列轉換模型的核心問題。序列轉碼模型在各類現代人工智能應用中國呢發揮著至關重要的作用,因此我們將其作為本章剩余部分和第10章的重點,為此,本節將介紹機器翻譯問題及其后文需要使用的數據集。

機器翻譯指的是將序列從一種語言自動翻譯成另一種語言,這個研究領域可以追溯到數字計算機發明后不久的20世紀40年代,特別是在第二次世界大戰中使用計算機破譯語言編碼。幾十年來,幾十年來,在使用神經網絡進行端到端學習興起之前,統計學方法在這一領域一直占據主導地位,因為統計機器翻譯涉及翻譯模型和語言模型等組成部分的統計分析,而基于神經網絡的方法通常被稱為神經機器翻譯,用于將兩種翻譯模型區分開來。

本書的關注點是神經網絡機器翻譯方法,強調的是端到端的學習,與8.3 節中的語料庫是單一語言的語言模型問題不同,機器翻譯的數據集是由源語言和目標語言的文本序列對組成的,因此,我們需要一種完全不同的方法來預處理機器翻譯數據集,而不是復用語言模型的預處理程序,我們看一下如何將預處理后的數據加載到小批量中用于訓練。

import os

import torch

from d2l import torch as d2l

9.5.1 下載和預處理數據集

搜索Tah-delimited Bilingual Sentence Pairs, 下載一個由Tatoba項目的雙語句子對組成的英語-語法 數據集,數據集中的每一行都是制表符分隔的文本序列對,序列對由英語文本序列和翻譯后的語法文本序列組成。注意,每個文本序列可以是一個句子,也可以是包含多個句子的一個段落,在這個將英語翻譯成語法的機器翻譯問題中,英語是源語言,法語是目標語言。

d2l.DATA_HUB["fra-eng"] = (d2l.DATA_URL + 'fra-eng.zip', )

def read_data_nmt():

輸入英語。法語的數據集

data_dir = d2l.download_extract('fra-eng')

with open(os.path.join(data_dir, 'fra.txt'), 'r',

encoding='utf-8') as f:

return f.read()

raw_text = read_data_net()

下載數據集后,原始文本數據需要經過幾個預處理步驟,我們用空格代替不間斷空格,用小些字母替換大寫字母,并在檔次和標準符號之間插入空格。

def preprocess_nmt(text):

預處理 英語 法語 數據集

def no_space(char, prev_char):

return char in set('.17') and prev_char !=''

用空格替換不間斷空格

用小寫字母替換大寫字母

text = text.replace('\u202f', '').replace().lower()

在單詞和標點符號之間插入空格

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])

9.5.2 詞元化

在機器翻譯中,我們更喜歡單詞級詞元化。下面的tokenize_nmt 函數對前num_examples 個文本序列對進行詞元,其中每個詞元要么是一個詞,要么是一個標點符號。此函數返回兩個詞元的表 source和target, source[i] 是源語言 第i個文本序列的詞元列表,target[i]是目標語言第i個文本序列詞元列表。

def tokenize_nmt(text, num_exampels = None):

詞元化 英語,法語 數據集

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]

繪制每個文本序列所包含詞元直方圖在這個簡單英語-法語數據集中大多數文本序列的詞元少于20

def show_list_len_pair_hist(legend, xlabel, ylable, xlist, ylist):

繪制列表長度直方圖

d2l.set_figsize()

patchs = 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[l].patches:

patch.set_hatch('/')

d2l.plt.legend(legend)

show_list_len_pair_hist(['source', 'target'], '# tokens per sequence', 'count', source, target)

9.5.3 詞表

由于機器翻譯數據語言對組成我們可以分別語言目標語言構建兩個使用單詞詞元詞表大小明顯大于使用字符詞元詞表大小為了緩解問題這里我們將出現次數少于2低頻視為相同未知詞元除此之外我們制定了額外特定詞元小批量用于序列填充利用相同長度填充詞元以及序列開始詞元結束詞元這些特殊詞元自然語言處理任務比較常用

src_vocab = d2l.vocab(source, min_freq=2, reserved_tokens['pad'], 'bos', 'eos')

9.5.4 加載數據集

回想一下語言模型的序列樣本都有一個固定長度這個樣本是一個句子某一部分還是跨越多個句子一個片段這個固定長度是由8.3num_steps參數指定機器翻譯中每個樣本都是目標組成文本序列其中每個文本序列可能具有不同長度

為了提高計算效率我們仍然可以通過截斷填充方式實現一次處理一個小批量文本序列假設同一個小批量每個序列都應該具有相同長度num_steps那么如果文本序列詞元數少于num_streps我們其末尾添加特定pad詞元直到長度達到num_steps我們截斷文本序列只取num_steps詞元并且丟棄剩余詞元每個文本序列具有相同長度以便相同形狀小批量進行加載

下面truncate_pad函數截斷或者填充文本序列

def truncate_pad(line, num_steps, padding_token):

截斷填充文本序列

if len(line) > num_steps:

return line[:num_steps] 截斷

return line [padding_token] * (num_steps - len(line)) 填充

truncate_pad(src_vocab(source[0], 10, src_vocab('pad')))

我們定義一個可以文本序列轉換成小批量數據集用于訓練函數我們將特定eos詞元添加序列末尾用于表示序列結束當模型通過一個詞元一個eos 詞元添加所有序列末尾用于表示序列結束當模型通過一個詞元接一個詞元生成序列進行預測此外我們還記錄每個文本序列長度統計長度剔除填充詞元在稍后將要介紹一些模型會需要這個額長度信息

def build_array_nmt(lines, vocab, num_steps):

機器翻譯文本序列轉換小批量

lines = [vocab[l] for l in lines]

lines = [l + [vocab['eos']] for l in lines]

array = torch.tensor([truncate_pad(l, num_steps, vocab['pad']) for l in lines])

valid_len = (array != vocab['pad']).type(torch.int32).sum(l)

return array, valid_len

9.5.5 訓練模型

我們定義load_data_nmt函數來返回數據迭代器以及語言目標語言兩種詞表

def load_data_nmt(batch_size, num_steps, num_examples = 600):

返回翻譯數據集迭代器詞表

text = preprocess_nmt(read_data_nmt())

source, target = tokenize_nmt(text, num_examples)

src_vocab = d2l.vocab(source, min_freq=2, reserved_tokens=['pad', 'bos', 'eos'])

tgt_vocab = d2l.vocab(target, min_freq=2, reserved_tokens=['pad','bos','eos'])

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

下面我們讀出英語 法語 數據集中第一個小批量數據

train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)

for X, X_valid_len, Y, Yvalid_len in train_iter:

print('X:', X.type(torch.int32))

print('X的有效長度', X_valid_len)

print('Y:', Y.type(torch.int32))

break;

小結

機器翻譯指的是文本序列從一種語言自動翻譯成另一種語言

使用單詞詞元化詞表大小將明顯大于使用字符詞元詞表大小為了緩解問題可以低頻詞元視為相同未知詞元

通過截斷填充文本序列可以保證所有文本序列都具有相同長度以便小批量方式加載

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100247.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 內核鏡像與啟動組件全解析:從 vmlinux 到 extlinux.conf

🧠 Linux 內核鏡像與啟動組件全解析:從 vmlinux 到 extlinux.conf 在嵌入式 Linux 系統中,啟動流程涉及多個關鍵文件和機制。不同的鏡像格式和配置文件承擔著不同的職責,從內核編譯到 bootloader 加載,再到系統啟動。本…

【系統分析師】2024年下半年真題:論文及解題思路

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 試題一:論devops在企業信息系統開發中的應用 試題二:論系統業務流程分析方法及應用 試題三:論軟件測試方法及應用 試題四:論信息系統運維管理 試題一:論devops在企業信息系統開發中的應用 1、概要敘述你參與管理和…

AI GEO 實戰:借百度文小言優化,讓企業名稱成搜索熱詞

在當今數字化浪潮中,企業的線上曝光度和搜索可見性至關重要。百度作為國內占據主導地位的搜索引擎,其推出的大模型文小言蘊含著巨大的潛力。通過巧妙運用 AI GEO(生成式引擎優化)策略,企業完全有可能讓自己的公司名稱成…

文件操作知識點總結

目錄 1.為什么使用文件 2.什么是文件? 2.1 程序文件 2.2 數據文件 2.3 文件名 3.二進制文件和文本文件 4.文件的打開和關閉 4.1 流和標準流 4.1.1 流 4.1.2 標準流 4.2 文件指針 4.3 文件的打開和關閉 4.3.1 fopen函數 4.3.2 fclose函數 5.文件的順序…

oracle認證有哪幾種?如何選擇

Oracle(甲骨文)不僅是全球領先的數據庫軟件巨頭,更是企業級數據管理的代名詞,獲得Oracle認證,證明可從事Oracle數據庫服務器的數據操作和管理等工作。下面給大家詳細其主要認證類型及其在職業發展中的含金量&#xff0…

AppTest邀請測試測試流程

相比AppGallery邀請測試,AppTest邀請測試具備以下全新能力:若您同時發布了多個測試版本,AppTest支持測試版本自動升級到最新的測試版本。您可以選擇將當前最新在架版本的應用介紹截圖展示給測試人員,視覺效果更好,提升…

硬件 - oring多電源切換

目錄 一、ORing電路 1.1 ORING 電路 1.2 ORING 電路關鍵部分 二、多電源切換 2.1 主要思路 2.2 適用場景 一、ORing電路 1.1 ORING 電路 中文常稱 “或環電路” 或 “并聯冗余電路”是一種電源并聯冗余拓撲結構 核心功能:將多路獨立電源的輸出 “并聯整合”&a…

Qt多語言翻譯實戰指南:常見陷阱與動態切換解決方案

問題背景 在Qt項目國際化過程中,開發者經常會遇到各種翻譯邏輯問題,特別是需要實現運行時語言動態切換功能時。一個典型場景是:程序默認英文顯示,加載中文翻譯文件后界面變為中文,但再次切換回英文時卻失敗。本文將深入…

機器人要增加力矩要有那些條件和增加什么

機器人要增加力矩要有那些條件和增加什么進行詳細講解 好的,這是一個非常專業且重要的問題。為機器人增加力矩(通常指提升關節輸出扭矩)不是一個簡單的部件替換,而是一個涉及動力鏈、結構、控制和散熱的系統性工程。 以下將詳細講…

spring集成aes加密、rsa加密

文章目錄spring集成對稱加密spring集成rsa加密spring集成對稱加密 encrypt:key: aaabbb # 只配置這個參數就實現了對稱加密salt: 333444 # 這個可以不配置spring集成rsa加密 例如apollo,如果沒有配置encrypt.key,那么apollo不配置應該也是可以的&#…

OpenSTL PredRNNv2 模型復現與自定義數據集訓練

OpenSTL PredRNNv2 模型復現與自定義數據集訓練 概述 本文將詳細介紹如何復現 OpenSTL 中的 PredRNNv2 模型,并使用自定義的 NPY 格式數據集進行訓練和預測。我們將從環境配置開始,逐步講解數據預處理、模型構建、訓練過程和預測實現,最終實現…

Linux內核IPv4隧道模式封裝機制剖析

概述 在Linux網絡棧中,XFRM(Transform)子系統負責實現IPsec等安全協議的功能。其中,xfrm4_mode_tunnel.c是實現IPv4隧道模式封裝的核心模塊,為IPv4數據包提供隧道模式的封裝和解封裝能力。本文將深入分析這一模塊的實現機制。 模塊架構與功能 該模塊通過注冊到XFRM框架…

OPC Client第10講:實現主界面;獲取初始界面傳來的所有配置信息config【C++讀寫Excel:xlnx;ODBC;緩沖區】

接前面代碼內容: OPC Client第6講(wxwidgets):Logger.h日志記錄文件(單例模式);登錄后的主界面_wx.logger-CSDN博客 OPC Client第8講:OPC UA;KEPServerEX創建OPC服務器…

快速入門HarmonyOS應用開發(一)

目錄 前言 一、準備工作 二、實戰開發 2.1、Navigation簡介 2.2、頁面路由開發 2.2.1、創建常量 2.2.2、創建字符串資源 2.2.3、創建float資源 2.2.4、創建color資源 2.2.5、創建數據實體 2.2.6、創建頁面路由表 2.2.7、創建Navigation根容器 2.2.8、創建NavDesti…

AI 進課堂 - 語文教學流程重塑

AI 進課堂 - 語文教學流程重塑執教語文十余年,備課案頭的參考書堆得比學生作業本還高,批改作文時紅筆芯換得比粉筆還勤。 直到去年把 JBoltAI 請進課堂,那些重復機械的工作突然有了新解法,連課堂上孩子們的眼神都亮了許多 —— 這…

用戶是否可以同時使用快照和備份來保護云服務器數據安全?

在云計算環境中,云服務器已成為企業和個人數據存儲、應用部署和業務運營的重要平臺。隨著業務數據量的不斷增長,數據安全和業務連續性成為用戶關注的核心問題。云服務器提供的快照和備份功能為用戶提供了有效的數據保護手段,但很多人會疑問&a…

RDS-MYSQL,這個RDS是什么?和mysql有什么區別?

好的,這是一個非常常見且重要的問題。我用最通俗易懂的方式給你解釋清楚。 一、大白話解釋 你可以把 MySQL 和 RDS MySQL 的關系,想象成:MySQL:就像是你自己買零件組裝的一臺電腦。 你需要自己挑選CPU、內存、硬盤、主板&#xff…

arcgis中實現四色/五色法制圖

四色定理是圖論中的一個著名定理,它指出在任何地圖上,只需四種顏色就足以使任何相鄰的區域(擁有共同邊界線段,而非單個點)顏色不同。五色定理則是另一個更早被證明的、較弱但更易證的定理。在地圖制圖中,這…

Spring如何巧妙解決循環依賴問題

什么是循環依賴?循環依賴是指兩個或多個Bean之間相互依賴,形成閉環的情況。例如:AService依賴BService,而BService又依賴AService。這種場景下,傳統的創建順序無法滿足依賴注入的要求。Spring的三級緩存機制Spring通過…

CUDA 中Thrust exclusive_scan使用詳解

1. 基本概念Thrust 是 NVIDIA CUDA 提供的類似 C STL 的并行算法庫。Scan (前綴和):給定數組 [a0, a1, a2, ...],產生前綴和序列。Exclusive Scan (排他前綴和): 輸出位置 i 存放的是輸入數組中 0 到 i-1 的累積結果。換句話說,結…