基于RNN-LSTM模型的诗词生成/TensorFlow

1 研究任务一介绍

1.1 研究任务

给定诗词数据集poems,采用基于循环神经网络(RNN)的LSTM模型实现古诗词自动生成,调整参数实现五言诗、七言诗、五言藏头诗、七言藏头诗和词的自动生成。

1.2 研究内容的具体描述

自然语言处理(NLP)是使机器处理或读懂人类语言系统,是目前比较热门的方向,Long Short Term Memory (LSTM)是循环神经网络的改进,在NLP方面有明显优势。实验采用两层的LSTM网络,训练数据集为34646首唐诗,数据格式为诗词名加上诗词内容,所有诗词存放在一个txt文档中,每一行存储一首诗。

代码:链接:https://pan.baidu.com/s/1squ22Hxtx-QWeR8q4TTqtg?pwd=k5cf 
提取码:k5cf

2 研究方法原理与步骤

2.1 数据预处理

数据预处理的过程,实际上是文本处理的过程,先对诗歌进行拆分,提取诗歌内容。步骤包括获取字典和编码字典。

1、获取字典

  1. 读取诗集,使用open函数。把每首诗分离出来存入列表,根据列表长度得出共有多少首古诗。
  2. 分割题目和内容,使用strip函数去掉空格,只需保存诗的内容。
  3. 标记诗词的开始和结尾,开头加上字符“[”,末尾加上字符“]”,在训练的时候程序也会根据该符号来作为训练的始末状态。
  4. 把所有唐诗内容加入列表,列表长度即为唐诗的总数。

    2、编码字典

  1. 统计词频:统计每个字出现次数。
  2. 按词频排序:使用sorted函数,key表示排序方法。
  3. 生成字库:每个字映射一个数字ID,使用dict(d)创建编码字典。
  4. 诗句转换为向量:根据字库把每一首诗转化为一个向量

2.2 LSTM网络结构

2.2.1 研究方法选择原因

LSTM(Long-Short Term Memory,长短时记忆网络)模型是文本处理中最为常用的RNN循环神经网络。RNN模型是基于当前的状态和当前的输入来对下一时刻做出预判。而LSTM模型则可以记忆距离当前位置较远的上下文信息。

2.2.2 方法原理与步骤

图1 LSTM模型逻辑图

图中LSTM有四个输入,分别是input(模型输入),forget gate(遗忘门),input gate(输入门),以及output gate(输出门)。相比,LSTM参数量是普通神经网络的4倍。遗忘门决定前一刻memory是否会被记住,遗忘门打开时,前一刻记忆会被保留,关闭时,前一刻记忆会被清空。输入门决定当前输入有多少保留下来,因为在序列输入中,并不是每个时刻的输入信息都同等重要,当输入完全没有用时,输入门关闭,此刻输入信息被丢弃。输出门决定当前memroy的信息有多少被立即输出,输出门打开时,会被全部输出,关闭时,当前memory中的信息不会被输出。

 图2 LSTM模型结构图

2.2.3 模型训练超参设置

1、超参数设置:

表1 超参数设置

网络层数

num_layers

2

隐藏层节点

rnn_size

128

训练次数

epoch

10

每次训练诗词数目

batch_size

64

2、使用RNN进行训练的过程:

1)定义模型和结构。

2)初始化当前状态。

3)输入数据进行ID到单词向量的转化。

4)输入数据和初始化状态代入模型进行训练,得到训练结果。

5)对训练结果加入一个全连接层得到最终输出。

6)训练结束后得到储存神经网络模型。

2.2.4 诗词生成

1、古诗词生成步骤:

1)读取模板文件,对每个字的出现个数都进行统计。

2)得到编码字典,根据统计结果取出数据来进行编码。

3)生成RNN模型网络,应用于根据输入信息得到相应的输出信息。与训练模型的编写方法相同。

4)读取已保存的网络模型,根据已经训练好的模型来进行新的数据预测。使用循环语句进行编码和字之间的转化,直到一首诗做完后退出。

2、生成古诗

已知一首诗的开始标志字为"[",设其初始状态为0,由此开始载入模型,迭代可以求得整首古诗,古诗的结束标志为"]",出现了此输出结果表示古诗生成完毕,退出循环,打印结果。

3、生成藏头诗

藏头诗与自由作诗的区别在于,需指定每句话的头一个字,所以初始状态需要重新设定为给定的字,设置for循环取出藏头句子的每一个单字,对该单字进行训练。把第一个字设置为"[",求出状态state_,然后将该状态代入该单字中求下一个字的解。即,已知当前输入为"word",当前状态是“[”的状态state_,求输出和下一步状态。输出作为当前输入,下一步状态作为当前状态,再求下一个字。直到诗句满足字数状态或结束,则退出循环,处理下一个单字。

3 实验结果及分析

3.1 实验结果

3.1.1 开发环境介绍

系统:Win7 

处理器:Intel(R) Core(TM)i5-5200U CPU

内存:4G

软件:TensorFlow 1.4.0 、Python 3.6.5

3.1.2 实验结果

1、生成古诗

1)五言诗

近云此蝶欲,色苔借念走。漂本片过索,侍中陌同声。

依右朱元巷,尝漠堪三试。看非背低蒙,津雪袍不从。

紫未疏从星,龙初宛思代。翠谷十绛兮,托望寿金长。

2)七言诗

盈巷仁术无凝斋,事泉非须音正栖。盈名教将贞滴文,浮舍树空安照池。

卧起收防鸣不饮,人尧仰松张谷尚。就敛兵天洒哭莫,单家貂渡未光私。

荒民杉乱浪迢辈,此怜堂精忧艳拂。亦序多将调并新,壁木鹊古胜以迟。

2、生成藏头诗

1)五言藏头诗

藏头为“上善若水”:

上禄摇户迎,善颜引绕籁。若雅露近马,水暂曲骑欲。

上起白初所,善来固好引。若应乱青庐,水威度乖如。

上柔余弹飘,善取分峡昼。若住艰时类,水乖逸满寒。

2)七言藏头诗:

藏头为“巾帼英雄”:

巾天雪惨带独生,帼溅邻禾鸦芦上。英宵阳家台开立,雄借断夜影处月。

巾纱逸众起及尽,帼碑是留忠音斗。英绿冲降开餐生,雄西残炎安河蛮。

巾花影蛾饮水三,帼皆主十久巾魂。英春直轻寒滴岂,雄经中江动紫秘。

3、生成词

昨出流偃败气予余宽离,祥明。雪家虚达衰带杨,万入野挂暂栖。因,修永人偏尘语儒云云中霖出啭谒浮寒。律清,委类凉石死世红。

山可二阙翼尘,离疑窥由采妾招。兵勒识上正比,无枝龙四化。山子主拾漠,好为洲天微无草爱圣卿喜承映泪明。菲雨谁山能云仙功,闻镜瑞鲤。

两密成流应飘,欹。三子来摇妆将月在可彩从度,离子。露细如昼终,田步中浮。岂蛮佛,休稍山斯冲此玉园人田暂闲职断练高画洞力新。

3.2 实验结果分析

从最后的生成结果看,生成的古诗和藏头诗基本符合唐诗的形式,词的形式还有待改善,在诗词意境方面还有很大的提升空间。

4 结论

实验设计了基于LSTM模型的古诗词自动生成框架,报告详细介绍LSTM网络的结构以及原理,对数据预处理过程分为获取字典和编码字典。从最后的生成结果看,生成的古诗和藏头诗基本符合唐诗的形式,词的形式还有待改善,在诗词意境方面还有很大的提升空间。

  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
RNN-LSTM是一种基于循环神经网络(RNN)的深度学习模型,用于序列数据的预测和分类。LSTM(长短时记忆网络)是RNN的一种特殊形式,它可以解决传统RNN中的梯度消失问题,使得模型可以更好地捕捉长期依赖关系。RNN-LSTM模型在时间序列预测中表现出色,尤其是在短期负荷预测和金融时间序列预测中。 在RNN-LSTM模型中,输入数据被分成时间步长,每个时间步长都有一个输入和一个输出。LSTM单元在每个时间步长中接收输入和前一个时间步长的隐藏状态,并输出当前时间步长的隐藏状态和预测结果。在训练过程中,模型通过反向传播算法来更新权重和偏置,以最小化预测结果与真实结果之间的误差。 下面是一个简单的RNN-LSTM模型的代码示例: ```python from keras.models import Sequential from keras.layers import LSTM, Dense # 定义模型 model = Sequential() model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features))) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(X_train, y_train, epochs=100, verbose=0) # 预测结果 y_pred = model.predict(X_test) ``` 其中,LSTM层定义了50个神经元,使用ReLU激活函数。输入数据的形状为(n_steps, n_features),其中n_steps表示时间步长,n_features表示每个时间步长的特征数。模型使用均方误差(MSE)作为损失函数,Adam优化器进行权重更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cucjing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值