NLP 從零開始:使用字符級 RNN 生成姓名
這是我們“NLP 從零開始”系列三部分教程中的第二部分。在第一個教程中,我們使用了 RNN 將姓名分類到其語言來源。這次我們將反過來,從語言生成姓名。
> python sample.py Russian RUS
Rovakov
Uantov
Shavakov> python sample.py German GER
Gerren
Ereng
Rosher> python sample.py Spanish SPA
Salla
Parer
Allan> python sample.py Chinese CHI
Chan
Hang
Iun
我們仍然手工構建了一個帶有幾個線性層的小型 RNN。主要區別在于,我們不再是在讀取所有字母后預測類別,而是輸入一個類別并一次輸出一個字母。循環預測字符以形成語言(這也可以使用單詞或其他更高階的結構來完成)通常被稱為“語言模型”。
推薦閱讀
我假設您至少已安裝 PyTorch,了解 Python,并理解張量 (Tensors)
- https://pytorch.ac.cn/ 安裝說明
- 使用 PyTorch 進行深度學習:60 分鐘速成 了解 PyTorch 的基本用法
- 通過示例學習 PyTorch 獲取廣泛而深入的概覽
- PyTorch for Former Torch Users 如果您是 Lua Torch 用戶
了解 RNN 及其工作原理也會有所幫助
- 循環神經網絡的驚人有效性 展示了許多實際示例
- 理解 LSTM 網絡 專門介紹了 LSTM,但對于理解 RNN 總體上也有幫助
我還建議閱讀前一個教程:NLP 從零開始:使用字符級 RNN 對姓名進行分類
準備數據
注意
從這里下載數據并將其解壓到當前目錄。
有關此過程的更多詳細信息,請參見上一個教程。簡而言之,有許多純文本文件 data/names/[Language].txt
,每行一個姓名。我們將行拆分成數組,將 Unicode 轉換為 ASCII,最終得到一個字典 {語言: [姓名 ...]}
。
from io import open
import glob
import os
import unicodedata
import stringall_letters = string.ascii_letters + " .,;'-"
n_letters = len(all_letters) + 1 # Plus EOS markerdef findFiles(path): return glob.glob(path)# Turn a Unicode string to plain ASCII, thanks to https://stackoverflow.com/a/518232/2809427
def unicodeToAscii(s):return ''.join(c for c in unicodedata.normalize('NFD', s)if unicodedata.category(c) != 'Mn'and c in all_letters)# Read a fil