语⾔模型数据集(周杰伦专辑歌词)
⽂章⽬录
引⼊
参考⽂献:
【1】李沐、Aston Zhang等⽼师,动⼿学深度学习
1 原始数据处理
  函数参数包括原始数据集的选取范围及数据集的路径。返回值包括:
  1)idx2char_list:不重复字符列表;
  2)char2idx_dict:字符索引字典;
  3)dict_size:字典⼤⼩;
  4)char2idx_list:字符索引列表。
  函数返回值包括以上三个步骤的处理结果:
def load_jaychou_lyrics(tr_range=None, path="../Data/ip"):
"""
:param tr_range: 数据集选取范围
:param path: 数据集存储路径
"""
with zipfile.ZipFile(path)as zin:
with zin.open('')as f:
ori_data = f.read().decode("utf-8")
ori_data = place("\n"," ").replace("\r"," ")
"""设置原始数据集的选取范围并选取"""
if tr_range is None:
tr_range =(0,len(ori_data))
ori_data = ori_data[tr_range[0]: tr_range[1]]
# 不重复字符列表
idx2char_list =list(set(ori_data))
# 字符索引字典
char2idx_dict =dict([(char, i)for i, char in enumerate(idx2char_list)])
# 字典⼤⼩,即不重复字符的数量
萧敬腾新歌
dict_size =len(char2idx_dict)
# 字符索引列表
char2idx_list =[char2idx_dict[char]for char in ori_data]
return idx2char_list, char2idx_dict, dict_size, char2idx_list
2 时序数据的采样
55
  时序数据的⼀个样本通常包含连续的字符。例如时间步数为时,样本序列相应为个字符。假设样本序列为“想”、“要”、“有”、“直”、“升”,则该样本的标签序列为这些字符分别在训练集中的下⼀个字符,例如“要”、“有”、“直”、“升”、“机”。
  接下来使⽤两种⽅式对时序数据采样。
2.1 随机采样
  在随机采样中,每个样本是原始序列上任意截取的⼀段序列。相邻的两个随机⼩批量在原始序列上的位置不⼀定相邻。因此⽆法⽤⼀个⼩批量最终时间步的隐藏状态来初始化下⼀个⼩批量的隐藏状态。
  在模型训练时,每次随机采样都需要重新初始化隐藏状态:
def load_jaychou_lyrics_iter_random(data_idx, batch_size=2, num_step=5,
device=torch.device("cuda"if torch.cuda.is_available()else"cpu")):
"""
:param data_idx: 数据选取索引
:param batch_size: 批次⼤⼩
:param num_step: 每个样本的时间步数
:param device: 设备
"""
# 减1是因为输出的索引x是相应输⼊的索引y+1
num_data =(len(data_idx)-1)// num_step
num_epoch = num_data // batch_size
idx = np.random.permutation(num_data)
def_data(pos):
return data_idx[pos: pos + num_step]
for i in range(num_epoch):铃儿响叮当英文版
j = i * batch_size
batch_idx = idx[j: j + batch_size]
X =[_data(k * num_step)for k in batch_idx]
Y =[_data(k * num_step +1)for k in batch_idx]
sor(X, dtype=torch.float32, device=device),
if __name__ =='__main__':
for(a, b)in load_jaychou_lyrics_iter_random(list(range(30))):
print(a,"\n", b)
  输出如下:
tensor([[10.,11.,12.,13.,14.],鸿雁 额尔古纳乐队
[15.,16.,17.,18.,19.]])
tensor([[11.,12.,13.,14.,15.],
[16.,17.,18.,19.,20.]])
李小龙的师傅是谁
tensor([[20.,21.,22.,23.,24.],
[0.,1.,2.,3.,4.]])
tensor([[21.,22.,23.,24.,25.],
[1.,2.,3.,4.,5.]])
2.2 相邻采样
  这⾥的相邻采样是指:两个随机⼩批量在原始序列上的位置相毗邻。这时,就可以⽤⼀个⼩批量最终时间步的隐藏状态来初始化下⼀个⼩批量的隐藏状态,从⽽使下⼀个⼩批量的输出也取决于当前⼩批量的输⼊:
def load_jaychou_lyrics_iter_consecutive(data_idx, batch_size=2, num_step=5,
device=torch.device("cuda"if torch.cuda.is_available()else"cpu")): """
:param data_idx: 数据选取索引
:param batch_size: 批次⼤⼩
:param num_step: 每个样本的时间步数
:param device: 设备
"""
data_idx = sor(data_idx, dtype=torch.float32, device=device)
num_data =len(data_idx)
num_batch = num_data // batch_size
idx = data_idx[0: batch_size * num_batch].view(batch_size, num_batch)朱梓骁为什么消失了
num_epoch =(num_batch -1)// num_step
for i in range(num_epoch):
j = i * num_step
X = idx[:, j: j + num_step]
Y = idx[:, j +1: j + num_step +1]
yield X, Y
if __name__ =='__main__':
for(a, b)in load_jaychou_lyrics_iter_consecutive(list(range(30))):
print(a,"\n", b)
  输出如下:
tensor([[0.,1.,2.,3.,4.],
[15.,16.,17.,18.,19.]])
tensor([[1.,2.,3.,4.,5.],
[16.,17.,18.,19.,20.]])
黄晓明主演的电影tensor([[5.,6.,7.,8.,9.],
[20.,21.,22.,23.,24.]])
tensor([[6.,7.,8.,9.,10.],
[21.,22.,23.,24.,25.]])