本文使用了 keras-transformer 第三方库,库的模型结构和使用方法如下图,需要构造 encoder_input (x1) decoder_input (x2) decoder_output (y) 三个矩阵,用于进行模型训练

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import jsonpath_tang = './tang/poet.tang.' # 读取 json 文件
def get_json(path):with open(path, 'r', encoding='utf-8') as f:data = json.load(f)return data

制作唐诗数据集 v2

# 对 ./tang/ 文件夹下的所有 json 文件进行遍历
import os# 获取文件夹下的所有文件名
def get_file_name(path):file_name = []for root, dirs, files in os.walk(path):for file in files:file_name.append(file)return file_namefile_name_ls = get_file_name('./tang/')ret_ls = []for file_name in file_name_ls:ls = get_json('./tang/' + file_name)n_ls = len(ls)for i in range(n_ls):para = ls[i]['paragraphs']para = ''.join(para)ret_ls.append(para)len(ret_ls) # 一共 57607 首诗歌
n_poet = len(ret_ls)
n_poet

查看前 10 首诗

for i in range(10):print(ret_ls[i])

# 给 ret_ls 的每一个元素,都在每个字之间加空格
for i in range(n_poet):ret_ls[i] = ' '.join(ret_ls[i])
for i in range(10):print(ret_ls[i])

# 给 ret_ls 的每一个元素,前后都加上 <SOS> 和 <EOS>
for i in range(n_poet):ret_ls[i] = '<SOS> ' + ret_ls[i] + ' <EOS>'
for i in range(10):print(ret_ls[i])

进行 tokenizer 统计

# 全部合并成一个 string
str_all =  ' '.join(ret_ls)
str_all[:1000]
# 用 keras 的 Tokenizer 进行统计
from keras.preprocessing.text import Tokenizer# 设置最大词汇量为 10000 个词
tokenizer = Tokenizer(num_words=10000,char_level=False,filters='!"#$%&()*+,-./:;=?@[\\]^_`{|}~\t\n')   # 因为添加了空格,所以 char_level=False
# 在 str_all 上进行训练
tokenizer.fit_on_texts([str_all])
# 设置padding 为 0
tokenizer.word_index['<pad>'] = 0
tokenizer.index_word[0] = '<pad>'
## 使用word_index属性查看每个词对应的编码
## 使用word_counts属性查看每个词对应的频数
for ii,iterm in enumerate(tokenizer.word_index.items()):if ii < 10:print(iterm)else:break
print("===================")
for ii,iterm in enumerate(tokenizer.word_counts.items()):if ii < 10:print(iterm)else:break

制作数据集 v2

# 对 ret_ls 进行分词,按照空格进行分词,得到 word_ls
word_ls = []
for i in range(n_poet):word_ls.append(ret_ls[i].split(' '))# 查看前 1 首诗歌的分词结果
for i in range(1):print(word_ls[i])

# 制作数据集的方法:从 word_ls 中,采样一首诗,从这首诗开头采样长度为 10 的子串,然后预测接下来的10个字
# 数据集大小为 1w 样本对,采样方法是随机采样
import random
from tqdm import tqdm
x_seq_ls = []
y_seq_ls = []
decoder_output_ls = []for i in tqdm(range(n_poet)):if len(word_ls[i])-22<=0:        # 如果这首诗歌的长度小于等于 22,就跳过continue# 随机选一个子串start = random.randint(0, len(word_ls[i])-11)end = start + 10# 保存到 x_seq_ls 和 y_seq_ls 中x_seq_ls.append(word_ls[i][start:end])y_seq_ls.append(word_ls[i][end:end+10])decoder_output_ls.append(word_ls[i][end+1:end+11])
len(x_seq_ls),len(y_seq_ls),len(decoder_output_ls)
# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_seq_ls[i],'\n',y_seq_ls[i],'\n',decoder_output_ls[i],'\n\n')

# 把 x_seq_ls 和 y_seq_ls 用 tokenizer 进行编码x_token = tokenizer.texts_to_sequences(x_seq_ls)
y_token = tokenizer.texts_to_sequences(y_seq_ls)
decoder_output_token = tokenizer.texts_to_sequences(decoder_output_ls)
# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_token[i],'\n',y_token[i],'\n',decoder_output_token[i],'\n\n')

# 转化为 numpy (补零)
# x_mat = np.array(x_token)
# y_mat = np.array(y_token)# 导入补零需要的padding_seq
from keras_preprocessing.sequence import pad_sequences
x_mat = pad_sequences(x_token,maxlen=10,padding='post',truncating='post')
y_mat = pad_sequences(y_token,maxlen=10,padding='post',truncating='post')
decoder_output_mat = pad_sequences(decoder_output_token,maxlen=10,padding='post',truncating='post')
# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_mat[i],'\n',y_mat[i],'\n',decoder_output_mat[i],'\n\n')

# 给decoder_output_mat 加上一个维度
decoder_output_mat = decoder_output_mat.reshape(decoder_output_mat.shape[0],decoder_output_mat.shape[1],1)
decoder_output_mat,decoder_output_mat.shape

划分训练集、测试集

# 划分训练集、测试集,把 x_mat,y_mat,decoder_output_mat 划分为训练集和测试集, 比例为 7:3
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test,decoder_output_train,decoder_output_test = train_test_split(x_mat,y_mat,decoder_output_mat,test_size=0.3,random_state=0)
x_train.shape, x_test.shape, y_train.shape, y_test.shape ,decoder_output_train.shape, decoder_output_test.shape

训练模型

搭建网络

import numpy as np
from keras_transformer import get_model
# Build the model
model = get_model(token_num=10000,embed_dim=128,encoder_num=3,decoder_num=2,head_num=4,                    # embed_dim must be divisible by head_numhidden_dim=256,                # hidden_dim 没有要求attention_activation='relu',feed_forward_activation='relu',dropout_rate=0.1,
)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
)
model.summary()
# 开始训练
history = model.fit([x_train,y_train], decoder_output_train, batch_size=32, epochs=5, validation_data=([x_test,y_test], decoder_output_test))

测试模型

test_string = '白日依山盡,黃河入海'# 把 test_string 每个字之间添加空格
test_string = ' '.join(test_string)
# 前后加上开始和结束标志
# test_string = '<SOS> ' + test_string
# 把 test_string 转化为token
test_string_token = tokenizer.texts_to_sequences([test_string])
# 截取前10个字
test_string_token = test_string_token[0][:10]
# 转化为 numpy,补齐
test_string_mat = pad_sequences([test_string_token],maxlen=10,padding='post',truncating='post')
test_string_mat
from keras_transformer import decode
decoded = decode(model,test_string_mat.tolist(),start_token=tokenizer.word_index['<sos>'],end_token=tokenizer.word_index['<eos>'],pad_token=tokenizer.word_index['<pad>'],max_len=100,top_k=4,                                # 添加 top_k 和 temperature 参数,增加随机性temperature=1.0,
)
decoded
token_dict_rev = {v: k for k, v in tokenizer.word_index.items()}
for i in range(len(decoded)):print(''.join(map(lambda x: token_dict_rev[x], decoded[i][1:-1])))

【NLP】keras Transformer 唐诗生成器相关推荐

  1. NLP——基于transformer 的翻译系统

    文章目录 基于transformer 的翻译系统 1. 数据处理 1.1 英文分词 1.2 中文分词 1.3 生成字典 1.4 数据生成器 2. 构建模型 2.1 构造建模组件 layer norm层 ...

  2. 【NLP】Transformer详解

    [NLP]Transformer详解   Transformer在Google的一篇论文Attention is All You Need被提出,为了方便实现调用Transformer Google还 ...

  3. NLP:Transformer的架构详解之详细攻略(持续更新)

    NLP:Transformer的架构详解之详细攻略(持续更新) 目录 Transformer的架构详解 1. Encoder 1.1.Positional Encoding-数据预处理的部分 1.2. ...

  4. NLP:Transformer的简介(优缺点)、架构详解之详细攻略

    NLP:Transformer的简介(优缺点).架构详解之详细攻略 目录 Transformer的简介(优缺点).架构详解之详细攻略 1.Transformer的简介 (1).Transforme的四 ...

  5. Datawhale组队学习NLP之transformer Task 01

    Datawhale组队学习NLP之transformer Task 01 Transformers在NLP中的兴起 一.自然语言处理(Natural Language Processing, NLP) ...

  6. Datawhale组队学习NLP之transformer Task03 BERT

    Datawhale组队学习NLP之transformer Task03 BERT 前言 一.句子分类 二.模型架构 1.模型输入 2.模型输出 三.词嵌入(扩展) 1.词嵌入 2.语境问题 三.BER ...

  7. Hugging Face实战(NLP实战/Transformer实战/预训练模型/分词器/模型微调/模型自动选择/PyTorch版本/代码逐行解析)下篇之模型训练

    模型训练的流程代码是不是特别特别多啊?有的童鞋看过Bert那个源码写的特别特别详细,参数贼多,运行一个模型百八十个参数的. Transformer对NLP的理解是一个大道至简的感觉,Hugging F ...

  8. 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq

    文章目录 第十一章:Deep learning for text 11.1 Natural language processing: The bird's eye view 11.2 Preparin ...

  9. 自然语言处理(NLP)——Transformer

    目录 一.Transformer背景介绍 1.Transformer的诞生 2.Transformer的优势 3.Transformer的市场 二.Transformer架构解析 1.认识Transf ...

最新文章

  1. 【运筹学】表上作业法 ( 示例 | 使用 “ 最小元素法 “ 找初始基可行解 )
  2. ruby hash方法_Ruby中带有示例的Hash.length方法
  3. 如何成为一名优秀的C程序员
  4. 计算机三级数据库上机怎么考,最新计算机三级数据库上机考试试题
  5. SpringCloud 微服务 (十五) 服务容错 Hystrix
  6. Java面试题-泛型篇十四
  7. 蚂蚁区块链第1课 蚂蚁10大区块链解决方案及应用场景
  8. mapgis转arcgis
  9. 摘录自《蔡康永的说话之道》-笔记
  10. 深入理解Kafka cruise control
  11. 线性时变系统状态方程的解
  12. 《那些年啊,那些事——一个程序员的奋斗史》——18
  13. 互融云小额贷款系统开发:全流程管理的软件开发解决方案
  14. 复制出来的虚拟机加入域提示试图加入域的SID与本计算机的SID相同解决方法
  15. vue鼠标经过效果实现
  16. ndows 内存诊断工具,Windows10自带内存检测工具的使用方法
  17. Vue项目-前端实现导出功能
  18. 学习笔记-《python程序员面试宝典》-基础知识-数据结构-编程思维(一)
  19. Oracle管理的文件(OMF)的具体含义
  20. C语言直接输出一句话(或英文字符)

热门文章

  1. Storm(三):Storm入门Demo
  2. Jupiter notebook如何改变绘图大小
  3. MD5工具类,提供字符串MD5加密(校验)、文件MD5值获取(校验)功能
  4. Windows10下安装VS2015和Caffe
  5. Matlab 实现 数值计算方法 二分法
  6. 高精地图语义分割标注
  7. 『递推』[AGC043D] Merge Triplets
  8. 【计算机毕业设计】201论坛系统设计与实现
  9. 蚁群算法解决多峰函数优化问题
  10. Debian10更换软件源