年过完了,快回来把诗写完(三)
在前面的训练中,如果你仔细寻找,会发现测试代码隐藏在回调函数中,但是生成的诗句是随机生成的,下面我们就一起来完成随机生成诗句、藏头诗、以及给出首句的方式来测试生成诗句的效果。
首先导入依赖库,然后加载模型:
import tensorflow.keras as k
# import keras as k
import json
from load_data import words_dic
import random
import numpy as np
from LoadData import get_data,gen_data,one_host
model=k.models.load_model('www.h5')
预测函数
SPRING
接着,我们定义一个peridct()函数,由于后面需要频繁地使用到,所以我们把它封装起来:
# 预测函数
def peridct(char):
# 数据处理
xdata = one_host(char, 5552, 1)
xdata = xdata.reshape(-1, 6, 5552)
p = model.predict(xdata)
# 返回预测的中文
return wordlist[p.argmax()]
藏头诗
SPRING
然后,我们定义一个acrostic()函数,用来生成藏头诗:
# 藏头诗
def acrostic(random_char,char):
'''
:param random_char: 随机生成的首句 如:由来称独立
:param char: 藏头的部分
:return: 去掉首句后生成的诗。
'''
random_char+='。' #使首句长度为6
# 循环藏头的部分
for i in char:
random_char += i
# 依次迭代,每次将一个藏头放到句首
for j in range(5):
x_data=random_char[-6:]
cont_index = [wordlist.index(i)
if i in wordlist else wordlist.index('z')
for i in x_data]
next_=peridct([cont_index])
random_char+=next_
return random_char[6:]
随机生成诗句
SPRING
# 随机生成
def random_gan(random_char,model,key):
random_char+=','
for i in range(18):
x_data=random_char[-6:]
next_=peridct(model,x_data,key)
random_char+=next_
return random_char
给出首句生成诗句
SPRING
# 给第一句
def give_first(first_char):
first_char+=','
for i in range(18):
x_data = first_char[-6:]
cont_index = [wordlist.index(i) if i in wordlist else wordlist.index('z') for i in x_data]
# print(x_data)
next_ = peridct([cont_index])
first_char += next_
return first_char
最后,在main函数中写入如下代码,就可以生成三种不同的诗句了:
if __name__ == '__main__':
cont,wordlist=get_data()
ranint=random.randint(1,20000)
words=cont[ranint].split(',')[0]
char=acrostic(words,'你好再见')
print(char)
print('\n-----------------------------')
char = random_gan(words)
print(char)
print('\n-----------------------------')
char = give_first('由来称独立')
print(char)
生成的结果如下:
本章中,我们使用了RNN进行诗词的生成,涉及的技术包括:文本处理,字典生成,词向量生成等。当然,同学们有兴趣的话,可以将我们的RNN换成LSTM或者GRU等算法,看看最终生成的结果是否更加有意境。
评论