機器學習深度學習——seq2seq實現機器翻譯(數據集處理)

👨?🎓作者簡介:一位即將上大四,正專攻機器學習的保研er
🌌上期文章:機器學習&&深度學習——從編碼器-解碼器架構到seq2seq(機器翻譯)
📚訂閱專欄:機器學習&&深度學習
希望文章對你們有所幫助

在理解了seq2seq以后,開始用它來實現一個機器翻譯的模型。我們先要進行機器翻譯的數據集的選擇以及處理,在之后將正式使用seq2seq來進行訓練。

seq2seq實現機器翻譯

  • 機器翻譯與數據集
    • 下載和預處理數據集
    • 詞元化
    • 詞表
    • 加載數據集
    • 訓練模型

機器翻譯與數據集

語言模型是自然語言處理的關鍵,而機器翻譯是語言模型最成功的基準測試。因為機器翻譯正是將輸入序列轉換成輸出序列的序列轉換模型的核心問題。
機器翻譯指的是將序列從一種語言自動翻譯成另一種語言。我們這里的關注點是神經網絡機器翻譯方法,強調的是端到端的學習。機器翻譯的數據集是由源語言和目標語言的文本序列對組成的。我們需要將預處理后的數據加載到小批量中用于訓練。

import os
import torch
from d2l import torch as d2l

下載和預處理數據集

下載一個“英-法”數據集,數據集中每一行都是都是制表符分隔的文本序列對,序列對由英文文本序列和翻譯后的法語文本序列組成(每個文本序列可以是一個句子, 也可以是包含多個句子的一個段落)。在這個將英語翻譯成法語的機器翻譯問題中, 英語是源語言,法語是目標語言。

#@save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip','94646ad1522d915e7b0f9296181140edcf86a4f5')#@save
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_nmt()

我們可以打印查看一下:

print(raw_text[:75])

輸出結果:

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

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

#@save
def preprocess_nmt(text):"""預處理“英語-法語”數據集"""def no_space(char, prev_char):return char in set(',.!?') and prev_char != ' '# 使用空格替換不間斷空格# 使用小寫字母替換大寫字母text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()# 在單詞和標點符號之間插入空格out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else charfor i, char in enumerate(text)]return ''.join(out)text = preprocess_nmt(raw_text)

可以輸出查看:

print(text[:80])

運行結果:

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

詞元化

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

#@save
def tokenize_nmt(text, num_examples=None):"""詞元化“英語-法語”數據數據集"""source, target = [], []for i, line in enumerate(text.split('\n')):if num_examples and i > num_examples:breakparts = line.split('\t')if len(parts) == 2:source.append(parts[0].split(' '))target.append(parts[1].split(' '))return source, targetsource, target = tokenize_nmt(text)

可以輸出查看驗證:

print(source[:6], target[: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):"""繪制列表長度對的直方圖"""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)
d2l.plt.show()

在這里插入圖片描述

詞表

由于機器翻譯數據集由語言對組成,因此我們可以分別為源語言和目標語言構建兩個詞表。
使用單詞級詞元化時,詞表大小將明顯大于使用字符級詞元化時的詞表大小。為了緩解這一問題,我們做一個處理方法,將一些低頻率的詞元視為相同的未知詞元unk,在這里我們將出現次數少于2次視為低頻率詞元。
此外,我們還指定了額外的特定詞元,例如在小批量時用于將序列填充到相同長度的填充詞元pad,以及序列的開始詞元bos和結束詞元eos。
例如:

src_vocab = d2l.Vocab(source, min_freq=2,reserved_tokens=['<pad>', '<bos>', '<eos>'])
print(len(src_vocab))

輸出結果:

10012

加載數據集

在之前,我們做過語言模型的處理,而語言模型中的序列樣本都有一個固定的長度,這個固定長度由num_steps(時間步數或詞元數量)來決定的。而在機器翻譯中,每個樣本都是由源和目標組成的文本序列對,其中的每個文本序列可能具有不同的長度。
為了提高計算效率,我們仍然可以通過截斷和填充方式實現一次只處理一個小批量的文本序列。假設同一個小批量中的每個序列都應該具有相同的長度num_steps。那么若詞元數目數目少于num_steps,我們就在末位填充pad詞元;否則我們就截斷詞元取前num_steps個。只要每個文本序列具有相同的長度,就方便以相同形狀的小批量進行加載。
我們定義一個函數來實現對文本序列的截斷或填充。

#@save
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))  # 填充

驗證一下:

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

運行結果:

[47, 4, 1, 1, 1, 1, 1, 1, 1, 1]

可以分析一下這個運行結果,source[0]里面有兩個詞元,按照詞元的出現頻率來進行排序,分別是第47和第4,此時我們需要10個詞元,那就需要填充,理所當然要填充最常見的那種詞,造成的概率是最小的,所以其對應著詞表中的都是頻率最高的。
如果語料corpus、詞表這類概念忘記了,可以看我之前的這篇文章:
機器學習&&深度學習——文本預處理
現在我們定義一個函數,可以將文本序列轉換成小批量數據集用于訓練。我們將eos詞元添加到所有序列的末尾,用于表示序列的結束。當模型通過一個詞元接一個詞元地生成序列進行預測時,生成的eos詞元說明完成了序列的輸出工作。此外,我們還記錄了每個文本序列的初始長度(排除了填充詞元的長度),后序會用到。

#@save
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(1)  # 統計原始長度return array, valid_len

訓練模型

接下來就可以定義load_data_nmt函數來返回數據迭代器,以及源語言和目標語言的兩種詞表:

#@save
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, Y_valid_len in train_iter:print('X:', X.type(torch.int32))print('X的有效長度:', X_valid_len)print('Y:', Y.type(torch.int32))print('Y的有效長度:', Y_valid_len)break

運行結果:

X: tensor([[ 17, 119, 4, 3, 1, 1, 1, 1],
[ 6, 124, 4, 3, 1, 1, 1, 1]], dtype=torch.int32)
X的有效長度: tensor([4, 4])
Y: tensor([[11, 0, 4, 3, 1, 1, 1, 1],
[ 6, 27, 7, 0, 4, 3, 1, 1]], dtype=torch.int32)
Y的有效長度: tensor([4, 6])

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

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

相關文章

yolo源碼注釋1——文件結構

代碼基于yolov5 v6.0 目錄&#xff1a; yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py datasets # 用于存放數據集的默認文件夾yolov5 data # 模型訓練的超參數配置文件以及數據集配置文件 hyps # 存放超參…

C語言學習錯題集(五)

1.最大公倍數的求法(gcd已知) 2.報數 3.字符串最后必須有’\0’!!! 4.例題 5.例題 6.例題 1.最大公倍數的求法(gcd已知) int lcmgcd*(a/gcd)*(b/gcd);2.報數 報數游戲是這樣的&#xff1a;有n個人圍成一圈&#xff0c;按順序從1到n編好號。從第一個人開始報數&#xff0c;報到…

工程項目管理系統源碼+功能清單+項目模塊+spring cloud +spring boot em

? 工程項目管理軟件&#xff08;工程項目管理系統&#xff09;對建設工程項目管理組織建設、項目策劃決策、規劃設計、施工建設到竣工交付、總結評估、運維運營&#xff0c;全過程、全方位的對項目進行綜合管理 工程項目各模塊及其功能點清單 一、系統管理 1、數據字典&#…

代碼保護 code protection

為什么要做代碼保護&#xff1f; 為了保護知識產權并讓攻擊者的利用更加困難&#xff0c;組織應該為其軟件的逆向工程設置障礙(例如&#xff0c;反篡改、調試保護、反盜版特性、運行時完整性)&#xff0c;增加攻擊者分析和利用你的軟件所需的投入。代碼保護對于廣泛分布的代碼…

Markdown使用筆記

Markdown使用筆記 一、段落與強調 important denotes the impossible thing to do Because your ugly appearance, you cannot have a happy ending. 使用*括起來的為斜體 使用**括起來的是粗體 使用~~括起來的是刪除線 在句子后面添加<br>即可換行 二、標題 在…

常見期權策略類型有哪些?

這幾天在做一個期權策略類型的整理分類&#xff0c;怎么解釋期權策略&#xff0c;期權策略是現代金融市場中運用非常廣泛、變化非常豐富、結構非常精妙的金融衍生產品&#xff1b;同時也是一種更為復雜也更為靈活的投資工具&#xff0c;下文介紹常見期權策略類型有哪些&#xf…

iptables安全技術和防火墻

通信五元素 源ip和目標ip 源端口和目標端口 協議 通信四元素 源ip和目標ip 源端口和目標端口 iptables表鏈結構 Netfilter Linux防火墻是由Netfilter組件提供的&#xff0c;Netfilter工作在內核空間&#xff0c;集成在linux內核中 Netfilter是Linux 2.4.x之后新一代的Li…

CI/CD流水線實戰

不知道為什么&#xff0c;現在什么技術都想學&#xff0c;因為我覺得我遇到了技術的壁壘&#xff0c;大的項目接觸不到&#xff0c;做的項目一個字辣*。所以&#xff0c;整個人心浮氣躁&#xff0c;我已經得通過每天的騎行和長跑緩解這種浮躁了。一個周末&#xff0c;我再次宅在…

k8s問題匯總

作者前言 本文章為記錄使用k8s遇到的問題和解決方法&#xff0c;文章持續更新中… 目錄 作者前言正常配置ingress&#xff0c;但是訪問錯誤添加工作節點報錯安裝k8s報錯使用kubectl命令報錯container沒有運行安裝會出現kubelet異常&#xff0c;無法識別刪除k8s集群訪問dashboa…

Docker安裝RabbitMQ單機版

Docker安裝RabbitMQ單機版 先安裝Docker服務&#xff0c;可參考安裝Docker及學習 編寫rabbitmq-composefile.yml文件 這里以rabbitmq 3.11.16 版本為例 cat << \EOF > /opt/rabbitmq-composefile.yml version: 3 services:rabbitmq:image: rabbitmq:3.10.0-managem…

【Apollo】推動創新:探索阿波羅自動駕駛的進步(含安裝 Apollo的詳細教程)

前言 Apollo (阿波羅)是一個開放的、完整的、安全的平臺&#xff0c;將幫助汽車行業及自動駕駛領域的合作伙伴結合車輛和硬件系統&#xff0c;快速搭建一套屬于自己的自動駕駛系統。 開放能力、共享資源、加速創新、持續共贏是 Apollo 開放平臺的口號。百度把自己所擁有的強大、…

【密碼學】維京密碼

維京密碼 瑞典羅特布魯納巨石上的圖案看起來毫無意義&#xff0c;但是它確實是一種維京密碼。如果我們注意到每組圖案中長筆畫和短筆畫的數量&#xff0c;將得到一組數字2、4、2、3、3、5、2、3、3、6、3、5。組合配對得到24、23、35、23、36、35。現在考慮如圖1.4所示的內容&a…

【變形金剛03】使用 Pytorch 開始構建transformer

一、說明 在本教程中&#xff0c;我們將使用 PyTorch 從頭開始構建一個基本的轉換器模型。Vaswani等人在論文“注意力是你所需要的一切”中引入的Transformer模型是一種深度學習架構&#xff0c;專為序列到序列任務而設計&#xff0c;例如機器翻譯和文本摘要。它基于自我注意機…

iOS Epub閱讀器改造記錄

六個月前在這個YHEpubDemo閱讀器的基礎上做了一些優化&#xff0c;這里做一下記錄。 1.首行縮進修復 由于分頁的存在&#xff0c;新的一頁的首行可能是新的一行&#xff0c;則應該縮進&#xff1b;也可能是前面一頁段落的延續&#xff0c;這時候不應該縮進。YHEpubDemo基于XDS…

pycharm,VSCode 幾個好用的插件

pycharm Tabnine AI Code 可以在編寫程序的時候為你提供一些快捷方式&#xff0c;增加編程速度 Chinese 對英文不好的程序員來說是個不錯的選擇&#xff0c;可以將英文狀態下的pycharm變為中文版的 ChatGPT 可以跟ai聊天&#xff0c;ai可以解決你80%的問題 &#xff0c;也可以幫…

變形金剛:從零開始【01/2】

一、說明 在我們的日常生活中&#xff0c;無論你是否是數據科學家&#xff0c;你都在單向地使用變壓器模型。例如。如果您使用的是 ChatGPT 或 GPT-4 或任何 GPT&#xff0c;那么在為您回答問題的框中是變壓器的一部分。如果您是數據科學家或數據分析師&#xff0c;則可能正在使…

【BASH】回顧與知識點梳理(二十九)

【BASH】回顧與知識點梳理 二十九 二十九. 進程和工作管理29.1 什么是進程 (process)進程與程序 (process & program)子進程與父進程&#xff1a;fork and exec&#xff1a;進程呼叫的流程系統或網絡服務&#xff1a;常駐在內存的進程 29.2 Linux 的多人多任務環境多人環境…

SAP MM學習筆記23-購買發注的賬戶分配類型(勘定Category)

SAP中控制財務憑證過賬科目的是 賬號分配類型&#xff08;勘定Category&#xff09;欄目。 ?賬號分配類型&#xff08;勘定Category&#xff09;有&#xff1a; 1&#xff0c;K 原價Center&#xff08;成本中心。用于消耗物料采購 的過賬&#xff09; 2&#xff0c;E 得意先…

【云原生之Docker實戰】使用Docker部署Syncthing同步程序及基本使用

【云原生之Docker實戰】使用Docker部署Syncthing同步程序及基本使用 一、Syncthing介紹1.1 Syncthing簡介1.2 Syncthing特點1.3 備份和同步區別二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker comp…

LabVIEW對并行機器人結構進行建模仿真

LabVIEW對并行機器人結構進行建模仿真 為了對復雜機器人結構的數學模型進行建模、搜索、動畫和驗證&#xff0c;在工業機器人動態行為實驗室中&#xff0c;設計并實現了具有五個自由度的單臂型機器人。在研究臺上可以區分以下元素&#xff1a;帶有直流電機和編碼器的機器人;穩…