基于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/1sb_Mwx5pghmTgeRxvIrO-A?pwd=l8te
提取码:l8te
2 研究方法原理与步骤
2.1 数据预处理
数据预处理的过程,实际上是文本处理的过程,先对诗歌进行拆分,提取诗歌内容。步骤包括获取字典和编码字典。
1、获取字典
- 读取诗集,使用open函数。把每首诗分离出来存入列表,根据列表长度得出共有多少首古诗。
- 分割题目和内容,使用strip函数去掉空格,只需保存诗的内容。
- 标记诗词的开始和结尾,开头加上字符“[”,末尾加上字符“]”,在训练的时候程序也会根据该符号来作为训练的始末状态。
- 把所有唐诗内容加入列表,列表长度即为唐诗的总数。
2、编码字典
- 统计词频:统计每个字出现次数。
- 按词频排序:使用sorted函数,key表示排序方法。
- 生成字库:每个字映射一个数字ID,使用dict(d)创建编码字典。
- 诗句转换为向量:根据字库把每一首诗转化为一个向量
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网络的结构以及原理,对数据预处理过程分为获取字典和编码字典。从最后的生成结果看,生成的古诗和藏头诗基本符合唐诗的形式,词的形式还有待改善,在诗词意境方面还有很大的提升空间。
基于RNN-LSTM模型的诗词生成/TensorFlow相关推荐
- 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务
大家好,我是猿童学,本期猿创征文的第三期,也是最后一期,给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含 ...
- 深度学习基于双向 LSTM 模型完成文本分类任务
大家好,本期给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含丰富的情感:比如喜欢.讨厌.等等.情感分析( ...
- tensorflow2.0 基于LSTM模型的文本生成
春水碧于天,画船听雨眠 基于LSTM模型的唐诗文本生成 实验基本要求 实验背景 实验数据下载 LSTM模型分析 实验过程 文本预处理 编解码模型 LSTM模型设置 实验代码 实验结果 总结 致谢 实验 ...
- [深度学习] Pytorch中RNN/LSTM 模型小结
目录 一 Liner 二 RNN 三 LSTM 四 LSTM 代码例子 概念介绍可以参考:[深度学习]理解RNN, GRU, LSTM 网络 Pytorch中所有模型分为构造参数和输入和输出构造参数两 ...
- 【Github上有趣的项目】基于RNN文本生成器,自动生成莎士比亚的剧本或者shell代码(不是python的是lua的)
文章目录 下了之后才发现不是python的尴尬得一匹,,ԾㅂԾ,, GitHub 上有哪些有趣的关于 NLP 或者 DL 的项目? - Xiaoran的回答 - 知乎 char-rnn 下了之后才发现 ...
- LSTM模型实战案例:TensorFlow实现预测3位彩票号码
向AI转型的程序员都关注了这个号
- 基于双向LSTM模型进行电力需求预测(Matlab代码实现)
- Tensorflow使用CNN卷积神经网络以及RNN(Lstm、Gru)循环神经网络进行中文文本分类
Tensorflow使用CNN卷积神经网络以及RNN(Lstm.Gru)循环神经网络进行中文文本分类 本案例采用清华大学NLP组提供的THUCNews新闻文本分类数据集的一个子集进行训练和测试http ...
- IJCAI 2018 基于主题信息的神经网络作文生成模型
本文介绍哈尔滨工业大学社会计算与信息检索研究中心(SCIR)录用于IJCAI 2018的论文<Topic-to-Essay Generation with Neural Networks> ...
最新文章
- 【笔记】 感受野与权值共享 摄像头标定 相机坐标与世界坐标
- 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度
- 七款最常用的PHP本地服务器
- 什么是异构数据库?它和分布式数据库的联系是什么?
- c语言贪吃蛇积分用什么函数,C语言之贪吃蛇(curses库函数)
- 【TA-霜狼_may-《百人计划》】图形3.2 混合模式及剔除
- (附源码)springboot校园购物网站 毕业设计 041037
- Python网络爬虫数据采集实战:基础知识
- mp4+html+ipad无法播放,mp4文件不能在IPAD上播放
- 7.Android常用第三方支付
- c语言小数如何转换成百分数,小数怎么转换成百分数
- JavaScript 银行登录存取钱【案例】
- Qt Quick实现的涂鸦程序
- Android JNI开发入门与实战
- POJ3255(次最短路)
- 【纪中受难记】——Day17:本来能AK
- Python 、Sqlite3数据库、单片机 、RC522 -公交卡管理系统(含部分源码)#可刷卡登陆
- 360和QQ,拿什么来拯救你?
- android手机做路由器,手机充当无线路由 给电脑无线信号的方法
- 台式计算机蓝屏代码08e,Win8.1电脑开机出现蓝屏代码0x000008e如何解决
热门文章
- Windows7/10耳机插入前面板没反应的解决方案
- 从多臂老虎机开始学习强化学习中的探索与利用
- linux uts 全称
- redis cluster 集群 HA 原理和实操(史上最全、面试必备)
- 全球营商环境报告及数据(2004-2020年)
- 没有windows安装光盘怎么修复计算机,教你用Windows XP的安装盘修复系统
- python 换页符_python分页字符串
- linux下查看系统配置参数
- openwrt路由器php-cli,【在openwrt无线路由器上部署freeswitch+fusionpbx (原帖恩山论坛)】-网关论坛-ZOL中关村在线...
- 十位数连加 c语言,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....