在线古诗自动生成器的设计与实现

2023-05-16

在线古诗自动生成器的设计与实现

  • 前言
  • 一、算法模型介绍
    • LSTM简介
    • 模型框架
    • 实验环境
    • 实验与分析
      • 实验数据集
      • 数据集预处理
      • 训练过程
      • 模型训练结果
      • 模型的评估
  • 二.在线古诗生成器的设计与实现
      • 系统结构
      • 远程服务器的项目部署
      • 系统测试
  • 三.成品展示


前言

  古诗,作为中华文化的凝结,诠释了古人至上无比的智慧,是千千万万文人墨客的思想结晶。古诗不论是句式的结构,文字的结合,亦或是对文字音调的搭配都达到了一个相当高的水准。同时,古诗是一种不朽的文化精髓,更是中华名族的文化瑰宝。近年来,随着人们生活水平的提高,传统的诗词文化再一次掀起了人们对于传统文化的学习浪潮。越来越多的人希望创作出符合自己意愿的诗句,但是却因为诗歌创作的难度便望而却步。
近年来,随着计算机人工智能技术的不断发展,循环神经网络在自然语言处理方面得到了广泛的应用,在技术的支持下,开发出一款在线古诗自动生成的软件具有充分的现实意义,该软件集结了海量的诗词库,支持古诗的检索,可以按照智能的方法生成特定的诗句,解决了人们在诗歌创作方面的部分难题。
本论文在对比了不同神经网络模型在古诗自动生成的基础上,结合在线古诗自动生成软件的具体需求,采用了基于长短期记忆网络模型(LSTM)的神经网络结构,进行古诗自动生成算法模型的构建,并对模型的诗歌生成效果给出了评估结果,最终结合软件开发的流程完成了在线古诗自动生成系统的设计。


一、算法模型介绍

LSTM简介

  LSTM作为深度学习的模型之一,是一种RNN的改进版,解决了普通RNN神经网络训练过程中出现的梯度消失和梯度爆炸的问题,能够学习长期的依赖关系。通过门控状态来控制传输,记住需要记忆的信息,忘记不重要的信息。
  下图是LSTM神经网络结构图。对于此结构图,每一行都表示一个完整的向量,代表从一个节点的输入到另外一个节点的输入。粉圈表示点化操作,黄框表示学习神经网络网络层,行合并表示连接,分叉表示复制的内容到对应位置。
lstm网络结构

  LSTM改善了RNN中的长期依赖问题,作为非线性模型可以用于构造更大深度的神经网络。但是,RNN的梯度问题虽然在LSTM的一个变种中得到解决,但是还是不彻底,更长序列依然存在问题,以及受时间跨度和网络深度的影响。由于LSTM模型可以实现长期记忆,可以保存上下文的关联性,因此在自然语言处理方面得到了广泛的应用。

模型框架

  古诗自动生成模型,基于python中第三方库Keras以及Tensorflow2.0,采用Keras中的LSTM模型进行实验。模型主要构造了两层LSTM layer和两层dropout layer以及一个全连接层和softmax作为输出层,利用自定义构造器进行数据输入,使得数据批量载入内存,使用Adam优化器以及交叉熵损失的模型损失函数。
模型框架

实验环境

硬件实验环境参数
硬件类型硬件型号
CPU英特尔 Core i7 主频 2.00GHz
显卡NVIDIA GeForce GTX 1050 Ti
内存8G
软件实验环境参数
硬件类型硬件型号
操作系统Windows10
GPU 运算平台CUDA Toolkit 8.0
Anaconda机器学习平台
深度学习框架Keras开源框架
Python开发环境Python 3.8
JupyterLab训练平台

实验与分析

实验数据集

  数据集来源于Github社区作者Sheng You开源的古诗文本文件poetry.txt。如下图2.3所示。数据集包含了唐宋时期常见的40030首古诗,涵盖了古诗生成机器学习的常见诗歌,同时,数据集按照一定的规则进行排列,题目和作者通过特定字符去分割,以及每一首古诗占据一行,方便机器学习中文本的处理和向量转化.

数据集预处理

 数据集预处理算法:

输入:古诗数据集poetry.txt
输出:word与id映射的字典
1.按行读取预料文本内容
2.for t = 1 : max
2.根据五言律诗诗句的长度筛选训练集
3.对选取好的训练集合中诗句字频进行统计排序
4.对频率较低的字进行删除
5.打包成元组列表,生成word到id的映射和id到word的映射关系
返回经过筛选的古诗文本以及word与id映射的字典|

训练过程

  模型有两层LSTM层和两层Dropout层以及最后一个全连接层组成,可以将输入的待训练的五言律诗诗句,即包含6个向量,通过不断训练转换成对应的输出向量。
实验训练过程中,由于传统的梯度下降法和反向传播方法优化造成影响较大,可能导致模型很难学习到相关的参数,本实验采用了Adam算法来实现优化,Adam算法作为一个一阶的优化算法,不仅可以像其他算法一样通过基于一阶的矩阵的均值来计算适应性参数的学习率,同时还能够使用二阶的矩阵均值。因此,Adam 算法可以根据用户的训练数据,迭代的更新神经网络的权重。
训练流程示意图

  模型训练的过程,由于划分的训练任务较大,没有采用fit方法去输入向量,而是采用fit_generator的方法实现自定义的生成器,让数据批量生成加载进入内存,减小内存的压力。在回调函数中使用tensorboard库查看对应的模型学习曲线,在每一次Epoch后,打印损失率和准确率,同时调用模型模拟古诗的生成,将训练结果保存在out.txt文件中。

模型训练结果

初始训练效果

初始训练效果accuracy曲线

在这里插入图片描述

初始训练效果loss曲线

改进版loss

改进版loss曲线

模型的评估

 古诗生成评估方案采用人工评估、BLEU机器评估和模型生成时间效率

 针对于以上的评估标准,人工评估方案选取采用的方法为选取对诗歌有研究的20位学者对生成的十组诗歌进行打分(满分为10分,最低分为1分),然后去除最低分和最高分最后取平均分。其公式如下所示:

 其中,n表示评委总人数,Si表示第i个评委的分数,Smax、Smin分别表示最高分和最低分。
在这里插入图片描述

 BLEU(双语评估标准),其计算速度快、不区分语言具有较好的适用性。可以用于文本生成质量的评价,BLEU输出一个0到1之间的数字,来评估生成文本和真实文本两者之间的相似度。BLEU是准确率为基础,然后对机器翻译以及文本生成的结果做出评价,因此相对于其他方法而言是一种更加主流的方法。作为机器评价两个方案的指标,利用BLEU的重叠计算公式计算待评估文本中的词组在实际的参考文本中出现的频率。也就是,计算古诗自动生成的诗句结果和原本实际的诗句之间的差异度,由于其结果已经标签化为向量的形式,因此可以针对于向量的结果进行计算,其计算公式如下:
bleu公式
 公式中,一组待评估的文本表示为Ci,对应的参考文本为si={si1,si2,…,sim},n是语法词组长度,hk(ci)表示wk在待评估文本ci中出现的次数,hk(sij)表示wk在参考文本中sij出现的次数。
 古诗生成时间作为两个方案的另一个评价指标,通过比较两个方案在十组不同的古诗自动生成的过程中需要花费的平均时间,以此来衡量不同模型的调度效率。
古诗生成时间效率计算公式如下:
时间计算公式

二.在线古诗生成器的设计与实现

系统结构

 根据系统开发的简易需求,本系统采用B/S架构的模式实现设计,分为表现层、逻辑层和数据层。表现层负责用户的交互以及最终运行结果的输出,逻辑层使用服务器完成客户端请求的相关处理,数据层针对不同的请求从后台数据库进行操作和数据的返回。
 系统总体结构如下图所示:
系统结构图

远程服务器的项目部署

 首选申请一台服务器,此为阿里云服务器实例,获取ip,也可以设置域名绑定到对应的公有ip地址上,同时在阿里云控制台添加访问的安全组。使用xshell连接远程服务器,使用FileZilla Client实现文件远程传输,将项目拉取到服务器相应位置。
 其次,在服务器上可以按照界面文件实现可视化操作,安装python的虚拟环境virtualenv 安装对应3.8版本的python,激活虚拟环境,设置虚拟环境的环境变量,同时在虚拟环境中安装所需要的机器学习库(tensorflow,django,keras等),运行本地服务器命令便可以实现项目在远程服务器本地拉取,可在浏览器查看对应的界面。
 在实现远程本地拉取成功之后,下载安装nginx,配置nginx相关的conf文件,实现项目部署中的反向代理,同时收集静态的文件资源。除此之外,下载安装uwsgi包,配置相关的配置文件,实现python项目的服务器运行,最后通过命令调用配置文件可以实现项目成功部署,可以设置日志保存位置,方便应用调试和对出错信息的查看。
部署原理

系统测试

1.编写测试样例进行功能测试
2.jmeter进行压力测试








三.成品展示

在这里插入图片描述

注:(源码:古诗生成器源码)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在线古诗自动生成器的设计与实现 的相关文章

  • Vscode配置git

    1 Git介绍和安装 Git是什么 Git是目前世界上最先进的分布式版本控制系统 xff08 没有之一 xff09 简单来说 它是控制项目版本的一个工具 我们可以利用Git进行多人协作和代码备份等工作 下载git xff08 64bit w
  • Xshell连接虚拟机Ubantu失败解决办法(主机和虚拟机能够互ping的前提)

    主机和虚拟机互ping 在主机命令行里输入ipconfig指令 xff0c 查询主机ip地址 xff0c 在虚拟机Ubantu终端里输入ping 主机ip地址 xff0c ping通后 xff0c 按ctrl 43 c停止 在虚拟机Uban
  • windows 11系统安装

    安装前注意事项 1 准备8G或8G以上U盘 xff08 32G以内 xff09 2 安装系统前备份好个人需要数据 xff08 制作U盘会格式化U盘 xff0c U盘内的重要文件也要事先备份好 xff09 3 预装office的务必记住自己激
  • docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at

    一 前言 docker安装完成 xff0c 一般用户没有权限启动docker服务 xff0c 只能通过sudo来通过root用户权限来启动docker xff0c 此时对于一般用户而言 xff0c 需要执行docker ps或者docker
  • Neo4j(七)——创建新数据库(如何在Neo4j中创建新数据库)

    方法一 xff1a 找到neo4j安装目录 xff0c 编辑conf文件夹中的neo4j conf 找到dbms active database 61 xff0c 将下图中的graph db用其他名称替换 xff0c 并解除注释 xff08
  • python VScode使用gitlab简单使用流程

    一 下载安装软件 1 安装好vscode xff0c 如未安装 xff0c 下载并且安装 https code visualstudio com Download 2 安装git windows客户端 https git scm com d
  • keil5工程函数无法跳转到函数定义解决方法

    问题描述 在使用keil查看工程代码时 xff0c 进行函数的跳转 xff0c 跳转不成功并提示以下错误 这是因为在编译工程的时候少勾选了一个选项 xff0c 按下以下方式勾选上然后重新Rebuild一下工程就好了
  • Codeforces D. Prefix-Suffix Palindrome

    Codeforces D Prefix Suffix Palindrome 题解 xff1a 和D1相同 xff0c 区别是找中间的回文串要压缩时间 xff0c 用到了马拉车算法 xff08 算法介绍在下面 xff1a span class
  • codeforces 1326 E.Bombs

    codeforces 1326 E Bombs 题意 xff1a 给定 1 n 1 n 1 n 的排列p q xff0c 将
  • Educational Codeforces Round 84 题解

    Educational Codeforces Round 84 题解 A Sum of Odd Integers 题意 xff1a n n n 是否能表示为 k k k 个不同的正奇
  • codeforces 1332 E - Height All the Same(组合数学、奇偶性)

    codeforces 1332 E Height All the Same 组合数学 奇偶性 题意 xff1a 现在有一个 n m n m n m 的方格 xff0c 第 i
  • codeforces 1330 C.D.题解

    codeforces 1330 C D 题解 Dreamoon Likes Coloring 题意 xff1a 给 n lt 61 100000 n lt 61 100000 n lt 61
  • LeetCode数独问题中Bitset的巧妙用处

    LeetCode数独问题中Bitset的巧妙用处 36 有效的数独 判断一个 9x9 的数独是否有效 只需要根据以下规则 xff0c 验证已经填入的数字是否有效即可 数字 1 9 在每一行只能出现一次 数字 1 9 在每一列只能出现一次 数
  • Morris 遍历

    Morris 遍历 中序遍历 前言 我们在中序遍历的时候 一定先遍历左子树 然后遍历当前节点 最后遍历右子树 在常规方法中 我们用递归回溯或者是栈来保证遍历完左子树可以再回到当前节点 但这需要我们付出额外的空间代价 我们需要用一种巧妙地方法
  • 第九届蓝桥杯c/c++A组省赛题解

    分数 题目 1 1 43 1 2 43 1 4 43 1 8 43 1 16 43 每项是前一项的一半 xff0c 如果一共有20项 求这个和是多少 xff0c 结果用分数表示出来 类似 xff1a 3 2 当然 xff0c 这只是加了前2
  • Ltp介绍及实践(20200925)

    Ltp中源代码和模型包括 xff1a 中文分词 词性标注 未登录词识别 依存句法 语义角色标注几个模块 目录 1 标注集合 分词标注集 词性标注集 命名实体识别标注集 依存句法关系 语义角色类型 2 快速使用 载入模型 分句 用户自定义词典
  • 第十一届蓝桥杯省赛C/C++B组题解

    试题 A 跑步训练 本题总分 xff1a 5 分 题目 问题描述 小明要做一个跑步训练 初始时 xff0c 小明充满体力 xff0c 体力值计为 10000 如果小明跑步 xff0c 每分钟损耗 600 的体力 如果小明休息 xff0c 每
  • codeforces Round680 C. Division 题解

    codeforces Round680 C Division 题解 题目 Oleg s favorite subjects are History and Math and his favorite branch of mathematic
  • Codeforces Round #677 (Div. 3) 题解

    Codeforces Round 677 Div 3 题解 A Boring Apartments 题目 题解 简单签到题 xff0c 直接数 xff0c 小于这个数的 43 10 43 10 43 1 0 代码 span class to
  • Leetcode 327. 区间和的个数 (前缀和 + 离散化 + 树状数组)

    Leetcode 327 区间和的个数 前缀和 43 离散化 43 树状数组 题目 题意 有多少个连续的子数组 xff0c 其和在 l o w e r

随机推荐

  • 01 Trie 专题

    01 Trie 专题 异或最大值 The xor largest pair 题意 xff1a 异或最大值的模板 一个数和一个序列中一个数的异或最大值是多少 xff1f 要支持询问 思路 考虑把序列插入 xff0c 构建一个 Trie tex
  • DFS序专题

    牛客专题之DFS序 简介 dfs序 每个节点在dfs深度优先遍历中的进出栈的时间序列 xff0c 也就是tarjan算法中的dfn数组 画个图理解一下 xff1a 这棵树的dfs序 xff1a 1 3 2 4 2 5 6 7 6 5 1 那
  • 牛客编程巅峰赛S2第4场题解

    牛客编程巅峰赛S2第4场 牛牛摆玩偶 题目描述 牛牛有 n 2 n 1 0
  • Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接 xff1a 点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的 1673 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一个正整数 k xff0c 返回长
  • 牛客巅峰赛S2第6场题解

    牛客编程巅峰赛S2第6场 A String 题目 题目描述 给出一个仅包含小写字母的字符串s xff0c 你最多可以操作k次 xff0c 使得任意一个小写字母变为与其相邻的小写字母 xff08 ASCII码差值的绝对值为1 xff09 xf
  • 2021牛客寒假算法基础集训营1 题解

    2021牛客寒假算法基础集训营1 题解 比赛地址 xff1a https ac nowcoder com acm contest 9981 官方题解 xff1a https ac nowcoder com discuss 593200 A
  • 自监督学习(self-supervised learning)(20201124)

    看论文总是会看出来一堆堆奇奇怪怪的名词 从远程监督 有监督 半监督 无监督开始 xff0c 最近又看到了一个自监督 首先先对上面的概念进行简述 xff1a 半监督 xff08 semi supervised learning xff09 x
  • mynteye_sdk SDK ubuntu20 编译问题

    1 pcl问题 xff1a usr include pcl 1 10 pcl point types h 508 1 error plus is not a member of pcl traits 508 POINT CLOUD REGI
  • 异常抛出**异常捕获**with用法

    1 对于异常处理 xff0c javascript支持异常处理 xff0c 支持手动抛出异常 需要抛出的时候 xff0c 总是通过throw语句抛出Error对象 语法如下 xff1a throw new Error errorString
  • Java IO流 使用流技术将一张图片从一个目录复制到另一个目录

    题目 xff1a 使用流技术将一张图片从F images目录下 xff0c 复制到D images目录下 复制图片需要使用字节流 xff0c 使用字符流复制会将图片字节码格式进行编码 xff0c 可能会导致图片数据丢失 span class
  • 卡尔曼滤波KF

    KF 根据贝叶斯估计的原理 xff0c 卡尔曼滤波是利用已知系统模型的确定性特性和统计特性等先验知识与观测量获得最有估计 xff0c 在有初始值的情况下 xff0c 从先验值和最新观测数据中得到的新值的加权平均来更新状态估计 1 卡尔曼滤波
  • 解决VS2019提示未能加载项目文件。缺少根元素的错误

    解决VS2019提示未能加载项目文件 缺少根元素的错误 上次win10自动更新关掉了打开的vs xff0c 导致开机后再打开解决方案 xff0c 某个项目一直无法加载 xff0c 提示未能加载项目文件 缺少根元素的错误 迁移报告上显示这个项
  • 实验二 串口通信及中断实验

    一 xff0e 实验目的 xff08 1 xff09 熟悉 MCU 的异步串行通信 Uart 的工作原理 xff08 2 xff09 掌握 Uart 的通信编程方法 xff08 3 xff09 掌握中断的编程方法 xff08 4 xff09
  • 多线程编程入门——C++ 「semaphore.h」

    回顾OS xff0c 发现自己基本没有实际操作过多线程编程 xff0c 所以想从今天开始学习 从Leedcode的 1114 按序打印开始 xff1a 信号量类型 sem t 原型 xff1a extern int sem init P s
  • 使用网络调试助手连接EMQ服务器

    一 使用MQTT协议与服务器建立连接 1 在图纸中的位置输入EMQ服务器地址与EMQ服务器的端口 2 接下来我们来看一下MQTT协议中的CONNECT报文 1 固定报头 byte1为0x10 xff0c 表示向服务器端发送的为CONNECT
  • npm下载以来版本问题 npm ERR! code ERESOLVE

    这里就是提示npm的版本太高 xff0c 这个时候 xff0c 需要我们问一下原来开发人员的npm的版本号 xff0c 在进行npm insdtall g npm 64 版本号 安装vue element admin项目问题补充 xff1a
  • 在机器人中执行完的仿真怎么移植到真实机器人上?

    最近在鱼香ROS上看了一篇文章 xff0c 在自己的号上记录一下用以保存 一 搞清楚数据流图 1 1建图 以常见的功能包来说 xff0c 一般都可以在运行的时候生成对应的话题输入与输出 xff0c cmd vel用于控制gazebo中的小车
  • 算法——最长公共子序列(动态规划)

    给定两个字符串 text1 和 text2 xff0c 返回这两个字符串的最长 公共子序列 的长度 如果不存在 公共子序列 xff0c 返回 0 一个字符串的 子序列 是指这样一个新的字符串 xff1a 它是由原字符串在不改变字符的相对顺序
  • VINF_FUSION编译出现大量的error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope错误

    错误 span class token operator span home span class token operator span lee span class token operator span catkin ws span
  • 在线古诗自动生成器的设计与实现

    在线古诗自动生成器的设计与实现 前言一 算法模型介绍LSTM简介模型框架实验环境实验与分析实验数据集数据集预处理训练过程模型训练结果模型的评估 二 在线古诗生成器的设计与实现系统结构远程服务器的项目部署系统测试 三 成品展示 前言 古诗 x