年过完了,快回来把诗写完(三)
在前面的训练中,如果你仔细寻找,会发现测试代码隐藏在回调函数中,但是生成的诗句是随机生成的,下面我们就一起来完成随机生成诗句、藏头诗、以及给出首句的方式来测试生成诗句的效果。
首先导入依赖库,然后加载模型:
import tensorflow.keras as k# import keras as kimport jsonfrom load_data import words_dicimport randomimport numpy as npfrom LoadData import get_data,gen_data,one_hostmodel=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等算法,看看最终生成的结果是否更加有意境。
评论
