基于LSTM算法智能写诗系统的研究与实现

摘要: 目前,我国现有的发布诗词的网站或APP较多,而且现有的诗词网站发布的信息良莠不齐,夹杂着大量无用的诗词,这会让热爱诗歌者在使用这些诗词软件获取诗词时难以分辨有效的信息,写诗的效率会很低。如果开发一套Web系统将市面上的诗词通过大数据技术进行存储、计算与智能化分析,将会给写诗人员提供巨大的好处。

本文设计了基于大数据的诗词网站后台分析系统,本系统的核心功能是通过爬取实海量诗词的原始数据,并通过LSTM算法技术将原始数据存储、计算,并将分析的结果以可视化列表形式展示。

本论文的主要研究工作及取得的成果如下:

  1. 使用Django等软件开发技术,设计并成功开发出了一套基于LSTM算法的诗词数据分析后台软件系统,本后台系统的诗词数据源于诗词网站上爬取的诗词。
  2. 使用基于Python语言的网络爬虫,爬取了诗词网站上的诗词。对爬取到的原始数据进行数据清洗后存储到计算机上,然后使用分布式运算编程模型和LSTM算法对数据计算,最后将结果保存至MySQL中存储分析。

关键词:大数据;诗词; django;LSTM

1 绪论

1.1研究背景与现状

在如今的互联网时代下,企业诗词和个人写诗也由传统的线下诗词会和校园

诗词会转变为互联网诗词,目前市场上流行的诗词软件和网站种类繁多,诗词质量也参差不齐,相对比较知名且应用广泛的诗词发布平台有中华诗词、瓜子诗词、华夏文明诗词等。在上述平台中每天都会发布海量的诗词和写诗信息,然而由于网络信息存在一定的虛假性,这会给热爱诗歌者带来一定的误导效果,导致网上写诗过程的体验不佳。并且由于各平台之间的用户数据不互通,用户需要来回反复的进行注册登录操作,这一过程也会浪费大量时间和精力。

总而言之,从上述问题可以看出目前互联网诗词平台信息缺乏整合,用户在冗杂的诗词中难以筛选出有效的信息。本论文拟初步研究开发出一套完整的基于大数据平台的诗词平台信息分析系统,本系统主要用于对诗词和公司信息进行采集,通过大数据平台对数据进行存储和计算,将大数据分析结果以可视化形式给用户查询。这样,用户在使用本平台时只需一次注册操作,即可浏览各平台发布的诗词,并且可以根据用户的条件进行筛选,可极大的提高写诗效率,给企业和热爱诗歌者都带来一定的便利。

1.2论文主要研究工作

为了实时了解各行业最新最热的技术、最火热的岗位、薪资最高的岗位光靠人工收集并采用普通的方式进行分析十分浪费人力物力,并且效率和体验都不好,因此开发一套基于大数据的诗词数据分析系统显得尤为重要。本论文所设计的基于大数据平台的诗词分析系统的最核心功能是对海量诗词的列表展示,并将大数据计算分析的结果以科技大屏可视化形式展出,使得用户能够非常直观的获取到当下的行业诗词。

本系统首先需要提供给客户管理和使用的数据。本文使用基于Python语言的Scrapy框架的网络爬虫技术爬取用户使用率较高的诗词网站上实时的诗词以及公司信息作为数据来源,以此作为大数据分析的关键数据支撑。然后使用LSTM算法,生态圈中分布式运算模型LSTM算法框架对海量的诗词数据进行数据清洗,数据融合,计算,分析等流程,数据通过处理后持久化到MySQL数据库中存储。在计算出分析结果数据后,使用Django等软件开发技术等框架完成基于大数据分析平台系统的后台的开发。

本文开发一套Web系统将市面上的诗词通过大数据技术进行存储、计算与智能化分析,将会给应聘人员提供巨大的好处。在提供诗词列表展示以及筛选功能的同时,还为用户提供个人信息管理,注册修改等功能,这样做便使得该系统成为功能相对完整,业务逻辑清晰,可大幅度提高写诗和诗词的效率。

2 技术总述

2.1 基于Scrapy的网络爬虫技术

Scrapy是目前较为成熟的爬虫技术框架,一般采用Python语言开发程序,Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试  

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

在本设计中,由于需要使用到诗词网站的原始数据,因此需要开发相应的网络爬虫程序完成对诗词原始数据的采集,图2-1为爬取中华诗词网站的诗词

数据的原理流程图。

ScrapyEngine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个(批)要爬取的url(s);

ScrapyEngine向调度器请求第一个要爬取的url,并加入到Schedule作为请求以备调度;

ScrapyEngine向调度器请求下一个要爬取的url;

Schedule返回下一个要爬取的url给ScrapyEngine,ScrapyEngine通过DownloaderMiddlewares将url转发给Downloader;

页面下载完毕,Downloader生成一个页面的Response,通过DownloaderMiddlewares发送给ScrapyEngine;

ScrapyEngine从Downloader中接收到Response,通过SpiderMiddlewares发送给Spider处理;

Spider处理Response并返回提取到的Item以及新的Request给ScrapyEngine;

ScrapyEngine将Spider返回的Item交给ItemPipeline,将Spider返回的Request交给Schedule进行从第二步开始的重复操作,直到调度器中没有待处理的Request,ScrapyEngine关闭。

图2-1诗词网站爬虫原理流程图

2.2 LSTM生态圈技术

LSTM简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。LSTM推荐是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,LSTM分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。

与传统文本过滤相比,LSTM有下列优点:

(1)能够过滤难以进行机器自动基于内容分析的信息。如艺术品、音乐;

(2)能够基于一些复杂的,难以表达的概念(信息质量、品位)进行过滤;

(3)推荐的新颖性。

正因为如此,LSTM在商业应用上也取得了不错的成绩。Amazon,CDNow,MovieFinder,都采用了LSTM的技术来提高服务质量。

长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。

LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。

图1底下是四个S函数单元,最左边函数依情况可能成为区块的input,右边三个会经过gate决定input是否能传入区块,左边第二个为input gate,如果这里产出近似于零,将把这里的值挡住,不会进到下一层。左边第三个是forget gate,当这产生值近似于零,将把区块里记住的值忘掉。第四个也就是最右边的input为output gate,他可以决定在区块记忆中的input是否能输出 。

图1 LSTM模型

LSTM有很多个版本,其中一个重要的版本是GRU(Gated Recurrent Unit),根据谷歌的测试表明,LSTM中最重要的是Forget gate,其次是Input gate,最次是Output gate。为了最小化训练误差,梯度下降法(Gradient descent)如:应用时序性倒传递算法,可用来依据错误修改每次的权重。梯度下降法在递回神经网络(RNN)中主要的问题初次在1991年发现,就是误差梯度随着事件间的时间长度成指数般的消失。当设置了LSTM 区块时,误差也随着倒回计算,从output影响回input阶段的每一个gate,直到这个数值被过滤掉。因此正常的倒传递类神经是一个有效训练LSTM区块记住长时间数值的方法。

2.3 Django技术

Django是一个开放源代码Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。2019年12月2日,Django 3. 0发布 。

Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2]  。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。其工作流程主要可划分为以下几步:

1.用manage .py runserver 启动Django服务器时就载入了在同一目录下的settings .py。该文件包含了项目中的配置信息,如前面讲的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告诉Django哪个Python模块应该用作本站的URLConf,默认的是urls .py

2.当访问url的时候,Django会根据ROOT_URLCONF的设置来装载URLConf。

3.然后按顺序逐个匹配URLConf里的URLpatterns。如果找到则会调用相关联的视图函数,并把HttpRequest对象作为第一个参数(通常是request)

4.最后该view函数负责返回一个HttpResponse对象

2.4 HTML前端可视化技术

HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字图形动画声音表格链接等。 [1]  

超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。

Apache ECharts 是一款基 于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts 开源来自百度商业前端数据可视化团队,基于htm15 Canvas, 它是一个纯Javascrint,图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

2.5 Pycharm

PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮项目管理、代码跳转、智能提示、自动完成单元测试版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

Python由荷兰数学计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。 [1]  Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, [2]  随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。 [3]  

Python解释器易于扩展,可以使用C语言C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。 [4]  Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码机器码

由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。

2.6本章小结

本章主要分析了系统开发过程中使用到的技术点和框架,通过研究这些技术的原理后,在本设计中加以应用,包括诗词采集的爬虫技术,数据持久化存储技术,以及基于Django框架的系统后台技术,通过预研上述技术点并加以应用从而开发出基于大数据分析平台的诗词数据分析系统。

3 诗词大数据分析系统实现

3.1系统功能

通过前面的功能分析可以将基于大数据诗词分析平台的研究与实现的功能主要包括用户登录诗词管理数据分析等内容。后台管理是针对已登录的用户看到满意的诗词数据分析而设计的。

3.2可行性研究

通过对系统研究目标及内容的分析审察后,提出可行性方案,并对其进行论述。主要从技术可行性出发,再进一步分析经济可行性和操作可行性等方面。

3.2.1 经济可行性

开发系统所涉及到的资料,一般是在图书馆查阅,或是在网上进行查找收集。所需要的一些应用软件也都是在网上可以免费下载的,因此,开发成本是几乎为零。但是开发出来的系统,还是具有高效率,低成本,较高质量的。所以,从经济可行性的角度,该系统符合标准。

3.2.2 技术可行性

技术可行性是考虑在现有的技术条件下,能否顺利完成开发任务。以及判断现有的软硬件配置是否能满足开发的需求。而本系统采用的是LSTM算法开发框架,并非十分困难,所以在技术上是绝对可行的。此外,计算机硬件配置是完全符合发展的需要。

3.2.3 运行可行性

当前计算机信息化的知识已经十分普及了,现在的操作人员也都是对系统环境有很强的适应性,各类操作人员大都是有过培训补充的,因此完全不影响组织结构,所以在运行上也是可行的。

3.2.4 时间可行性

从时间上看,在大四的最后一个学期,在实习工作与完成毕设两件大事相交叉的时间里,结合之前学习的相关知识,并开发系统,时间上是有点紧,但是也不是完全没可能实现,通过这段时间的努力功能基本实现。

3.3 系统实现流程

(1)明确目的

在设计诗词大数据分析平台初期需要了解如何获取诗词原始数据

是非常基础也是关键的一步。要了解大数据分析平台期望达到什么样的运营效

果,从而在标签体系构建时对数据深度、广度及时效性方面作出规划,确保底层

设计科学合理。

(2)数据采集

只有建立在客观真实的数据基础上,大数据计算分析的结果才有效。在采集

数据时,需要考虑多种维度,比如不同行业诗词数据、各行业薪资水平数据、行

业就业情况数据、行业诗词岗位等等,还可以通过行业调研、用户访谈、用户信

息填写及问卷、平台前台后台数据收集等方式获得。

(3)数据清洗

就对于各大诗词网站或者APP平台采集到的数据而言,可能存在非目标数据、

无效数据及虛假数据,因而需要过滤原始数据,去除一些无用的信息以及脏数据,

便于后续的处理。

(4)特征工程

特征工程能够将原始数据转化为特征,是--些转化与结构化的工作。在这个

步骤中,需要剔除数据中的异常值并将数据标准化。

(5)数据计算

在这一步我们将得到的数据存储到大数据分析平台,通过开发LSTM算法,

程序对原始数据进行计算,将不同维度的结果存储到Mysql中。

(6)数据展示

分析结果可以通过大数据后台展示到前端界面,对于普通用户而言,只需.

要登录到该后台系统,就可以获取到诗词数据分析后的计算结果,从而了解行业

的诗词情况,对于热爱诗歌者而言可以极大地提高效率。

3.4系统平台架构

在任何信息系统当中有价值的数据都是必不可少的重要部分,如何通过手上

的资源获取得到有价值的数据便是开发系统。首先需要考虑的问题根据系统的功

能设计数据获取和处理的流程以及其实现方法都已经基本上确定获取和处理流

程。

3.5 诗词数据爬虫设计

这个项目我们的主要目的是爬取瓜子直聘网的诗词数据信息,包括诗词

位、企业名称和企业描述和规模等具体详情信息,下面描述本文爬虫工程主要设

计步骤。

(1)创建项目

打开一个终端输入:scrapy startproiect python_ city _data,Scrapy框架将会在指定目录下生成整个工程框架。系统生成的目录如下图3-2所示:

图3-2爬虫框架目录结构

(2)修改setting文件

如图3-1所示为修改后的setting文件主要内容,本设计主要修改三项内容,

第一个是不遵循机器人协议,第二个是下载间隙,由于下面的程序要下载多个页

面,所以需要给一个间隙(不给也可以,只是很容易被侦测到),第三个是请求

头,添加一个User-Agent。

表3-1 爬虫setting文件主要配置

BOT_NAME = 'python_city_data'

SPIDER_MODULES = ['python_city_data.spiders']
NEWSPIDER_MODULE = 'python_city_data.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'python_city_data (+http://www.yourdomain.com)'
#换伪造请求头
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
# Obey robots.txt rules
ROBOTSTXT_OBEY = False

(3)确认要提取的数据,item 项

item定义你要提取的内容(定义数据结构),比如我提取的内容为诗词的所在城市和企业诗词详情,于是需要在items类中新建对应的实体类,并需要设置相应的字段取出对应的数据。Field 方法实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。

(4)开发爬虫程序,访问下载网页,使用Xpath语法提取内容

3.6 LSTM算法程序设计

原始的诗词数据一般信息较为冗杂,且很难看出规律,因此我们需要将

数据存储在HDFS上,数据在多台机器上保存了n份,保证了原始数据的高可用。

然后通过LSTM算法框架开发程序,将海量的原始数据计算过程分成一个个的

car提交到yarn上管理执行。

LSTM算法确保每个reducer的输入都是按键排序的。系统执行排序的过程

(即将map输出作为输入传给reducer)称为shuffle。下面是LSTM算法计算

最重要的shuffle原理,可以看出具有同key的Mapper端输出将会汇向同一

Reducer端,从而达到分布式计算的效果。如图3-3所示

图3-3 LSTM算法的shuffle原理

本文中如需分析目前诗词网站上的各行各业的诗词岗位总量情况,首先需要定义一个任务中的核心逻辑,需要在代码中对每条诗词数据的里程字段过滤,下面为分析任务的主要逻辑代码。

表3-2  LSTM任务的主要逻辑

def rnn_model(num_of_word,input_data,output_data=None,rnn_size=128,num_layers=2,batch_size=128):

    end_points = {}

    """

    :param num_of_word: 词的个数

    :param input_data: 输入向量

    :param output_data: 标签

    :param rnn_size: 隐藏层的向量尺寸

    :param num_layers: 隐藏层的层数

    :param batch_size:

    :return:

    """

    

    '''构建RNN核心'''

    # cell_fun = tf.contrib.rnn.BasicRNNCell

    # cell_fun = tf.contrib.rnn.GRUCell

    cell_fun = tf.contrib.rnn.BasicLSTMCell

    cell = cell_fun(rnn_size,state_is_tuple=True)

    cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers,state_is_tuple=True)

    # 如果有标签(output_data)则初始化一个batch的cell状态,否则初始化一个

    if output_data is not None:

        initial_state = cell.zero_state(batch_size,tf.float32)

    else:

        initial_state = cell.zero_state(1,tf.float32)

    # 词向量嵌入

    embedding = tf.get_variable('embedding',initializer=tf.random_uniform(

        [num_of_word + 1,rnn_size],-1.0,1.0))

    inputs = tf.nn.embedding_lookup(embedding,input_data)

    outputs,last_state = tf.nn.dynamic_rnn(cell,inputs,initial_state=initial_state)

    output = tf.reshape(outputs,[-1,rnn_size])

    weights = tf.Variable(tf.truncated_normal([rnn_size,num_of_word + 1]))

    bias = tf.Variable(tf.zeros(shape=[num_of_word + 1]))

    logits = tf.nn.bias_add(tf.matmul(output,weights),bias=bias)

    if output_data is not None:

        labels = tf.one_hot(tf.reshape(output_data,[-1]),depth=num_of_word + 1)

        loss = tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits=logits)

        total_loss = tf.reduce_mean(loss)

        train_op = tf.train.AdamOptimizer(0.01).minimize(total_loss)

        tf.summary.scalar('loss',total_loss)

        end_points['initial_state'] = initial_state

        end_points['output'] = output

        end_points['train_op'] = train_op

        end_points['total_loss'] = total_loss

        end_points['loss'] = loss

        end_points['last_state'] = last_state

    else:

        prediction = tf.nn.softmax(logits)

        end_points['initial_state'] = initial_state

        end_points['last_state'] = last_state

        end_points['prediction'] = prediction

    return end_points

再编写完Mapper任务和reducer任务的业务代码后,还需要定义一个主类用于管理上述的作业,LSTM算法框架会将上述的Mapper和Reducer任务拆分为一个个的car,并提交到yarn上管理执行。下表3-4为诗词所属行业LSTM算法作业管理类的主要逻辑。

3-4 LSTM算法模型

class User(db.Model):

    __tablename__ = 'User'

    name_id = db.Column(db.Integer, unique=True, primary_key=True)

    name = db.Column(db.String(32))

    email = db.Column(db.String(32))

    password = db.Column(db.String(32))

    user_datetime = db.Column(db.DateTime, nullable=True, default=datetime.datetime.now)

    info = db.relationship("Info", backref="user")

    def __repr__(self):

        return "<{} 账号>".format(self.name)

class Info(db.Model):

    __tablename__ = 'Info'

    id = db.Column(db.Integer, unique=True, primary_key=True)

    title = db.Column(db.String(240), name='关键词')

    content = db.Column(db.TEXT, name='内容')

    user_id = db.Column(db.Integer, db.ForeignKey('User.name_id'))

    datetime = db.Column(db.DateTime, nullable=True, default=datetime.datetime.now)

    def __repr__(self):

        return "<{} 生成诗词>".format(self.title)

if __name__ == '__main__':

    db.drop_all()

    db.create_all()

任务主类编写成功后并提交到LSTM算法环境上,通过LSTM算法命令执行该LSTM算法作业。双向循环神经网络的主体结构是由两个单向循环神经网络组成的。在每一个时刻t,输入会同时提供给这两个方向相反的循环神经网络,而输出则是由这两个单向循环神经网络共同决定。其结构如下图一所示:

图3-4 LSTM算法结构

六个权值分别对应:输入到向前和向后隐含层(w1, w3),隐含层到隐含层自己(w2, w5),向前和向后隐含层到输出层(w4, w6)。值得注意的是:向前和向后隐含层之间没有信息流,这保证了展开图是非循环的。

深层循环神经网络:为了增强模型的表达能力,该网络在每一个时刻上将循环体结构复制多次,每一层的循环体中参数是一致的,而不同层中的参数可以不同。其结构如下图二所示:

图3-5 LSTM算法原理

tensorflow中提供了MultiRNNCell类来实现深层循环神经网络的前向传播过程。长短期记忆网络 LSTM(long short-term memory)是 RNN 的一种变体,其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。当人类接触新事物时,他们不会从头开始思考。就像你在阅读这篇文章时,你会根据以前的知识理解每个单词,而不是舍弃一切,从字母开始重新学习。换句话说,你的思维有延续性。

神经网络的出现旨在赋予计算机人脑的机能,但在很长一段时间内,传统的神经网络并不能模仿到这一点。而这似乎是个很严峻的缺点,因为它意味着神经网络无法从当前发生的事推断之后将要发生的事,也就是无法分类电影中流畅发生的各个事件。

后来,递归神经网络(RNN)的出现解决了这个问题,通过在网络中添加循环,它能让信息被“记忆”地更长久。

代码如下:

def to_word(predict, vocabs):

    t = np.cumsum(predict)

    s = np.sum(predict)

    sample = int(np.searchsorted(t, np.random.rand(1) * s))

    if sample > len(vocabs):

        sample = len(vocabs) - 1

    return vocabs[sample]  # [np.argmax(predict)]

def gen_poetry(words, to_num):

    batch_size = 1

    print('模型保存目录为: {}'.format('./model'))

    input_data = tf.placeholder(tf.int32, [batch_size, None])

    end_points = rnn_model(len(words), input_data=input_data, batch_size=batch_size)

    saver = tf.train.Saver(tf.global_variables())

    init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())

    with tf.Session(config=config) as sess:

        sess.run(init_op)

        checkpoint = tf.train.latest_checkpoint('./model')

        saver.restore(sess, checkpoint)

        x = np.array(to_num('B')).reshape(1, 1)

        _, last_state = sess.run([end_points['prediction'], end_points['last_state']], feed_dict={input_data: x})

        word = input('请输入起始字符:')

        poem_ = ''

        while word != 'E':

            poem_ += word

            x = np.array(to_num(word)).reshape(1, 1)

            predict, last_state = sess.run([end_points['prediction'], end_points['last_state']],

                                           feed_dict={input_data: x, end_points['initial_state']: last_state})

            word = to_word(predict, words)

        print(poem_)

        return poem_

def generate(words, to_num, style_words="狂沙将军战燕然,大漠孤烟黄河骑。", row1='山雨欲来风满楼'):

    batch_size = 1

    input_data = tf.placeholder(tf.int32, [batch_size, None])

    end_points = rnn_model(len(words), input_data=input_data, batch_size=batch_size)

    saver = tf.train.Saver(tf.global_variables())

    init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())

    with tf.Session(config=config) as sess:

        sess.run(init_op)

        checkpoint = tf.train.latest_checkpoint('./model')

        saver.restore(sess, checkpoint)

        x = np.array(to_num('B')).reshape(1, 1)

        _, last_state = sess.run([end_points['prediction'], end_points['last_state']], feed_dict={input_data: x})

        if style_words:

            for word in style_words:

                x = np.array(to_num(word)).reshape(1, 1)

                last_state = sess.run(end_points['last_state'],

                                      feed_dict={input_data: x, end_points['initial_state']: last_state})

        start_words = list(row1)

        start_word_len = len(start_words)

        result = start_words.copy()

        max_len = 200

        for i in range(max_len):

            if i < start_word_len:

                w = start_words[i]

                x = np.array(to_num(w)).reshape(1, 1)

                predict, last_state = sess.run([end_points['prediction'], end_points['last_state']],

                                               feed_dict={input_data: x, end_points['initial_state']: last_state})

            else:

                predict, last_state = sess.run([end_points['prediction'], end_points['last_state']],

                                               feed_dict={input_data: x, end_points['initial_state']: last_state})

                w = to_word(predict, words)

                # w = words[np.argmax(predict)]

                x = np.array(to_num(w)).reshape(1, 1)

                if w == 'E':

                    break

                result.append(w)

        print(result)

        print(''.join(result))

        return ''.join(result)

def poetry_process(batch_size=64,

                   poetry_file='./data/poems.txt'):

    poetrys = []

    with open(poetry_file,'r',encoding='utf-8') as f:

        for line in f:

            try:

                title,content = line.strip().split(':')

                content = content.replace(' ','')  # 去空格,实际上没用到

                if '_' in content or '(' in content or '(' in content or '《' in content or '[' in content:

                    continue

                if len(content) < 5 or len(content) > 79:

                    continue

                content = 'B' + content + 'E'

                poetrys.append(content)

            except Exception as e:

                pass

    # 依照每首诗的长度排序

    # poetrys = sorted(poetrys, key=lambda poetry: len(poetry))

    print('唐诗数量:',len(poetrys))

    # 统计字出现次数

    all_words = []

    for poetry in poetrys:

        all_words += [word for word in poetry]

    counter = Counter(all_words)

    # print(counter.items())

    # item会把字典中的每一项变成一个2元素元组,字典变成大list

    count_pairs = sorted(counter.items(),key=lambda x: -x[1])

    # 利用zip提取,因为是原生数据结构,在切片上远不如numpy的结构灵活

    words,_ = zip(*count_pairs)

    # print(words)

    words = words[:len(words)] + (' ',)  # 后面要用' '来补齐诗句长度

    # print(words)

    # 字典:word->int

    word_num_map = dict(zip(words,range(len(words))))

    # 把诗词转换为向量

    to_num = lambda word: word_num_map.get(word,len(words))

    poetry_vector = [list(map(to_num,poetry)) for poetry in poetrys]

    n_chunk = len(poetry_vector) // batch_size

    x_batches = []

    y_batches = []

    for i in range(n_chunk):

        start_index = i * batch_size

        end_index = start_index + batch_size

        batches = poetry_vector[start_index:end_index]

        length = max(map(len,batches))  # 记录下最长的诗句的长度

        xdata = np.full((batch_size,length),word_num_map[' '],np.int32)

        for row in range(batch_size):

            xdata[row,:len(batches[row])] = batches[row]

        # print(len(xdata[0])) 每个batch中数据长度不相等

        ydata = np.copy(xdata)

        ydata[:,:-1] = xdata[:,1:]

        """

            xdata             ydata

            [6,2,4,6,9]       [2,4,6,9,9]

            [1,4,2,8,5]       [4,2,8,5,5]

            """

        x_batches.append(xdata)  # (n_chunk, batch, length)

        y_batches.append(ydata)

    return words,poetry_vector,to_num,x_batches,y_batches

3.7 本章小结

本章主要分析了基于LSTM智能写诗分析系统的设计与实现系统开发过程中使用到的技术和具体的实现步骤,这其中主要介绍了智能写诗平台的搭建环境和开发步骤,包括程序中的一些数据库配置等

4 后台系统实现

基于大数据的诗词分析平台的基本业务功能是采用Django框架实现的, 在本文的第四章将详细介绍后台系统的实现部分,包括详细阐述了系统功能模块的具体实现,并展示说明了部分模块的功能界面。

4.1 开发环境与配置

4.1.1 开发环境

本系统设计基于B/S架构,其中服务器包括应用服务器和数据库服务器。这种架构模式,使用户只需要在有网络的地方即可通过浏览器访问,而不需要再安装客户端软件,交互性更强。基于大数据的诗词分析平台使用IDEA集成开发工具。而系统运行配置时,选择应用本地来部署Web服务器来保障平台的正常运行,本地 是Apache的核心项目,其技术先进、性能稳定并且开源免费,因而被普遍应用。本系统的主要开发环境以及开发工具如表4-1所示。

表4-1 系统开发环境和工具

项目

系统环境及版本

硬件环境

Windows 64 位操作系统

Python

Python2.6

数据库

MySql

开发工具

Pycharm

项目架构

Django

4.1.2 框架配置介绍 

本系统使用集成开发工具Pycharm进行开发,由于 IDEA 中本地配置详细资料有很多,不做详细赘述, 本文主要介绍 Django框架及Shiro 框架的配置。首先需要在项目中中引入各框架以及数据库连接等所需要工具包。

图4-1 后台的配置文件

4.2 数据库的设计

数据库设计是系统设计中特别重要的一部分。数据库的好坏决定着整个系统的好坏,并且,在之后对数据库的系统维护、更新等功能中,数据库的设计对整个程序有着很大的影响。

根据功能模块的划分结果可知,本系统的用户由于使用账号和密码进行登录,因此在本系统中需要分别进行数据记录。首先根据如下6个数据实体:用户、诗词等数据库表。

用户的属性包括用户编号、用户名、密码和性别、注册账号的时间。用户实体属性图如图4-2所示:

图4-2 用户实体属性图

根据以上分析,各个实体之间有一定的关系,使实体与实体可以联系起来,建立成整个系统的逻辑结构,本系统中,普通用户通过对诗词的管理,使诗词与用户实体存在对应关系。

4.3 系统功能模块实现

4.3.1登录认证

用户登录时需要在登录界面输入用户名、密码进行身份认证,要求必须是表单认证、校验。具体流程如时序图如4-2所示。

图4-2登录认证流程图

诗词大数据分析系统的用户登录界面如下图所4-3所示:

图4-3用户登录界面

登陆成功后,系统会成功跳转至首页,在首页中,位于上方的横栏是对本系统的基本信息的描述和欢迎登录效果,另外登录用户的用户名也会显示在首页中,可直接表明用户己成功登录。左侧则是本系统的导航菜单,可折叠展示,较为方便,右方则为欢迎页效果。诗词大数据分析系统的首页界面如下图所4-4所示:

图4-4诗词大数据系统首页界面

4.3.2诗词管理功能

诗词管理功能是对诗词进行查询,删除等操作的功能集合,诗词信

息管理功能使用到了诗词表t_ car,诗词表t_car的主要数据字段,结构,类型及描述如下表4-2所示。

表4-2 诗词表字段

字段名称

数据类型

是否允许为空

描述

id

int

不允许

自增主键,唯一ID

cityname

String

允许

所在城市名称

company

String

允许

汽车名称

company_size

String

允许

汽车规模

education

String

允许

价格

experience

String

允许

使用年限

industry

String

允许

售卖年份

recruiter

String

允许

诗词者姓名

salary

String

允许

议价范围

诗词大数据分析系统的诗词管理功能界面如下图所4-5所示:

图4-5诗词管理菜单界面

诗词管理

功能流程功能图如图3-6所示:

图4-6 诗词管理功能流程图

 通过“诗词管理”按钮,进入诗词管理界面,用户可以看到诗词列表,例如:企业名称、所在城市、数量、诗词要求、薪资待遇、诗词时间的详细信息。通过此界面,用户可以对诗词进行删除管理操作。

4.3.3诗词大数据看板功能

数据可视化模块就是对我们采集和计算的分析结果的展示。数据分析模块的

数据进行一个精美而又直接的展示,我们采用大屏的方式进行展示,展示数据结

构分明,背景具有科技感,把相对复杂的、抽象的数据通过可视的、交互的方式

进行展示,从而形象直观地表达数据蕴含的信息和规律。诗词大数据看板界面如图4-7所示。

图4-7诗词大数据看板界面

诗词大数据分析可视化开发的难点并不在于图表类型的多样化,而在于如何能在简单的一页之内让用户读懂诗词数据之间的层次与关联,这就关系到布局、色彩、图表、动效的综合运用。如排版布局应服务于业务,避免为展示而展示;配色一般以深色调为主,注重整体背景和单个视觉元素背景的一致性。本文使用Echarts中地图、线条等组件,将分析结果较为直观的展示给平台用户,使得用户能够简便的获取有效的信息。

4.4 本章小结

本章主要分析了基于大数据的诗词分析系统开发过程中使用到的技术和具体的实现步骤,这其中主要介绍了基于Django框架的诗词大数据分析系统的搭建环境和开发步骤,包括程序中的一些数据库配置等。前端页面采用的是LSTM算法和Django实现。

5 总结与展望

5.1 系统开发遇到的问题 

由于基于大数据诗词分析平台是由本人独立开发,因此在系统设计和业务逻辑方面更多地借鉴了目前市场上较为流行的框架和技术点,包括大数据技术,很多是不熟悉没接触过的,在开发过程中不断学习新知识。另外由于本人的时间和精力的原因,在系统开发过程中有很多地方可能并不能够完全尽如人意,还有许多需要补充的功能与模块。

5.2 总结与展望 

大数据诗词系统是在对相关管理范畴进行详细调研后,确定了系统涉及的领域,包括数据库设计、界面设计等,是一个具有实际应用意义的管理系统。根据本毕业设计要求,经过四个多月的设计与开发,大数据诗词系统基本开发完毕。其功能基本符合用户的需求。
    为保证有足够的技术能力去开发本系统,首先本人对开发过程中所用到的工

具和技术进行了认真地学习和研究,详细地钻研了基于Python的网络爬虫技术

以及Echarts, CSS, HTML等前端开发技术,同时还研究了大数据开发技术LSTM算法, HDFS, LSTM算法等。

从诗词数据大数据分析平台需求分析开始,到整体框架的设计以及各个详细功能的设计具体实现,最后基于大数据平台的诗词分析系统的基础架构和详细功能已经大致开发完毕,并将其部署在本地服务器当中运行,用户可以登录使用该系统进行诗词的筛选,同时查询大数据的分析结果。


6系统测试

系统测试是将经过集成测试的软件,作为计算机系统的一个部分,与系统中其他部分结合起来,在实际运行环境下对计算机系统进行的一系列严格有效地测试,以发现系统潜在的问题,保证系统的正常运行[26]

管理人员财政管理系统已经基本完成,系统已经实现的功能满足了用户和管理员的需求,为了检验系统是否能安全有效运行和查找系统存在的问题,将对系统进行全面的测试[27]。

6.1系统测试方案

测试管理员功能。登录管理员账号,对其用户测试时新用户发出的请求进行查看、审核、删除、认证等请求。并在日志中查看操作记录,成功退出登录。预计管理员测试结果能成功完成用户发送的请求并在操作日记中查看到操作记录。因为本系统需要管理员对用户认证用户才可以进行财政档案上传和加入财政档案,所以用户测试和管理员测试需要同时进行。

6.2系统测试过程

(1)使用用户名为admin密码为123123的账号进行注册,管理员可在用户列表中查看用户admin的个人信息。

预计结果:成功注册,管理员可以看见admin的用户信息。

测试结果:成功注册。管理员可以看见admin的用户信息。

(2)使用户名admin的账号进行登录。管理员使用管理员账号登录。

预计结果:用户和管理员成功登录。

测试结果:用户和管理员成功登录。

(3)用户上传自己的管理人员证照片和管理人员信息提交认证,管理员在管理人员认证页面可以收到认证信息并给予通过认证。

预计结果:成功上传信息,管理员通过认证。

试结果:成功上传信息,管理员通过认证。

(4)用户上传身份证照片和用户本人照片申请财政管理认证,管理员收到财政管理认证申请,可以查看提交的照片并通过认证。

预计结果:成功认证。

测试结果:成功认证。

(5)用户填写财政档案名为456的财政档案信息,上传财政档案文件,提交审核,管理员收到审核请求,查看财政档案信息和财政档案文件,给予审核通过。

预计结果:审核通过。

测试结果:审核通过。

(6)用户浏览其他财政档案并选择一个加入,并查看用户已加入的财政档案列表。

预计结果:加入成功,并显示在加入的财政档案列表中。

测试结果:加入成功,并显示在加入的财政档案列表中。

(7)管理员对其用户名为admin的用户进行停用操作。

预计结果:admin用户显示在停用名单中且不能登录。

测试结果:admin用户显示在停用名单中且不能登录。

(8)财政档案名为456的财政档案进行审核操作。

预计结果:在财政管理列表中财政档案名为456的财政档案状态显示已审核

测试结果:在财政管理列表中财政档案名为456的财政档案状态显示未审核

(9)启用用户admin财政档案456。

预计结果:用户admin显示在用户列表中,财政档案456状态为正常。

测试结果:用户admin显示在用户列表中,财政档案456状态为正常。

(10)统计分析中可以查看以上测试的操作。

预计结果:在统计分析中可以查看到相关的操作。

测试结果:在统计分析中可以查看到相关的操作。

(11)用户admin可以重新登录并退出,管理员退出系统。

预计结果:可以重新登录并退出,管理员成功退出。

测试结果:可以重新登录并退出,管理员成功退出。

6.3本章小结

本章主要对诗词系统的各个功能进行了完整的测试,测试结果和预计结果吻合,该系统可以正常使用。


参考文献:

[1]季杰,陈强仁,朱东.基于互联网大数据的诗词智能分析平台的设计和实现[J].内江科技,2020,41(05):47-48.

[2]朱慧雯,田骏,张涛,蒋卫祥.基于互联网大数据的诗词数据智能分析平台的设计与实现[J].软件,2020,41(03):99-101.

[3]于涛.大尹格庄金矿井下通风环境感知与大数据分析平台研究开发[J].有色金属(矿山部分),2021,73(05):142-146.

[4]汪杰,王春华,李晓华,余克莉莎.煤炭行业大数据分析云平台设计研究[J].煤炭工程,2021,53(09):187-192.

[5]周怡燕.基于大数据的数据分析平台构建研究[J].自动化与仪器仪表,2021(05):123-127.

[6]邱灵峰,黄荣.大数据审计平台体系建设构想[J].中国管理信息化,2021,24(17):97-98.

邓宇杰,郑和震,陈英健.长江大保护时空大数据云平台建设需求分析[J].水利规划与设计,2021(09):12-15.

[7]孙也.生产制造企业大数据分析平台技术[J].电子技术与软件工程,2021(16):178-179.

张晓伟.基于云平台的大数据信息安全保护策略分析[J].信息记录材料,2021,22(08):185-187.

[8]李军,王涛.基于大数据分析技术的网络运维平台应用与开发[J].电脑编程技巧与维护,2021(07):112-114.

[9]Chi Dianwei,Tang Chunhua,Yin Chen. Design and Implementation of Hotel Big Data Analysis Platform Based on LSTM算法 and Spark[J]. Journal of Physics: Conference Series,2021,2010(1):

[10]Costa Rogério Luís de C.,Moreira José,Pintor Paulo,dos Santos Veronica,Lifschitz Sérgio. A Survey on Data-driven Performance Tuning for Big Data Analytics Platforms[J]. Big Data Research,2021,25(prepublish):

[11] 中国电子商务市场数据发布报告2020Q1&2020Q2e[A]. 上海艾瑞市场咨询有限公司.艾瑞咨询系列研究报告(2020 年第6期) [C]: 上海艾瑞市场咨询有限公司,2020:25.

[12] 刘维维,电信行业中基于数据仓库和数据挖掘技术的决策支持系统[D]中国科技信息,2006(07):180-181.

[13] 岳亚娜孟凡胜电商社交营销对策浅析[J]科技经济导刊2021,2901);169-170

[14] 任宏伟基于异常检测技术的数据防爬系统设计与应用.中国科学院大学(工程管理与信息技术学院).2016.

[15] 倪星字,基于Hadoop云计算平台的构建[J],微型电脑应用,2020,36(12);103-105.

[16] 王玻璇MapReduce 下差分隐私保护技术研究与实现[D]南京邮电大学,2020.

[17] 郑楠,我国开放政府数据的价值增值方式解析[J]新西部(理论版)2016(13):68.

[18]叶惠仙,基于HaopHle技术的电商销量网站数据分析研究口,网络安全技术与应用,202012)77-79.

[19] An efficient approach for land record classiffication and information retrieval in data warehouse. International journal of Computers and Applications 2021.(1)

[20]王佳珙Hadoop平台下调度算法及其改进策略研究[D]北京邮电大学,2016.

[21]张兴,基于Hadoop的云存储平台的研究与实现[D]电子科技大学.2013.

[22] 中国电子商务市场数据发布报告2020Q1&2020Q2e[A]. 上海艾瑞市场咨询有限公司.艾瑞咨询系列研究报告(2020 年第6期) [C]: 上海艾瑞市场咨询有限公司,2020:25.

[23] 刘维维,电信行业中基于数据仓库和数据挖掘技术的决策支持系统[D]中国科技信息,2006(07):180-181.

[24] 岳亚娜孟凡胜电商社交营销对策浅析[J]科技经济导刊2021,2901);169-170

[25] 任宏伟基于异常检测技术的数据防爬系统设计与应用.中国科学院大学(工程管理与信息技术学院).2016.

[26] 倪星字,基于Flask云计算平台的构建[J],微型电脑应用,2020,36(12);103-105.

[27] 王玻璇MapReduce 下差分隐私保护技术研究与实现[D]南京邮电大学,2020.

[28] 郑楠,我国开放政府数据的价值增值方式解析[J]新西部(理论版)2016(13):68.

[29]叶惠仙,基于HaopHle技术的京东超市商品网站数据分析研究口,网络安全技术与应用,202012)77-79.

[30] An efficient approach for land record classiffication and information retrieval in data warehouse. International journal of Computers and Applications 2021.(1)

[31]王佳珙Flask平台下调度算法及其改进策略研究[D]北京邮电大学,2016.

[32]张兴,基于Flask的云存储平台的研究与实现[D]电子科技大学.2013.


Research and Implementation of Intelligent Poetry Writing System Based on LSTM Algorithm

Abstract:

Currently, there are many websites or APPs that publish poetry in China, and the information published by existing poetry websites is mixed with a large number of useless poetry, which makes it difficult for poetry lovers to distinguish effective information when using these poetry software to obtain poetry, and the efficiency of writing poetry will be very low. If a Web system is developed to store, compute, and intelligently analyze poetry on the market through big data technology, it will provide great benefits to poetry writers.

This article designs a background analysis system for poetry websites based on big data. The core function of this system is to crawl the raw data of massive poetry websites, store and calculate the raw data through LSTM algorithm technology, and display the analysis results in a visual list.

The main research work and achievements of this paper are as follows:

1. Using software development techniques such as Django, a background software system for poetry data analysis based on LSTM algorithm has been designed and successfully developed. The poetry data in this background system is derived from poetry crawled from poetry websites.

2. Using a Python language based web crawler, I crawled poetry from poetry websites. The raw data crawled is cleaned and stored on a computer. Then, the distributed computing programming model and LSTM algorithm are used to calculate the data. Finally, the results are saved to MySQL for storage and analysis.

Key words: Big Data; LSTM算法; Django; car information


谢  辞

时光飞逝,四年的本科生生涯即将结束。在这四年的时光里,有遇到难题时的手足无措,有获得专业进步时的开心。经历了许多的事情,自己也在不知不觉中成长了很多,心中充盈最多的仍是感激。

首先感谢我的导师,她严谨的治学态度深深地影响每位同学。我要感谢我的父母,他们总是默默的付出,在生活上给与我最大的帮助,在学习上也给我很多建议。在大学的校园里,我度过了难忘的学习生活。在这期间,我从周围的老师和同学身上学到了很多知识,并且建立了深厚的感情。

四年时间过的飞快,已经到了书写自己毕业论文的节点,回想过去的四年,充满了无数的欢乐,也学习了不少专业知识,这也更加丰富了我的大学生活。因此我要我的学院里的每一位教师,是你们教会了我的专业知识,让我具有了一技之长,同时还要感谢指导老师对我毕业设计的指导。

然后,感谢给子我帮助的朋友们,是你们让我的学习生涯更加温暖,让我能更加坚定的追求自己想要的生活。两年来,我们一起相互支持彼此的信念,一起学习新的知识,起解决遇到的各种问题, 不管我们选择的道路最终是否能够达到自己的理想,但愿我们能够友谊长存。

笔落至此,意味着我的大学四年即将落下帷幕。总以为来日方长,却不知韶光易逝,往昔已不可追。四年的大学生涯见证了自己的成长与改变,虽总是在不满自己的缓慢,最后,由衷的感谢各位评审老师在百忙之中抽出时间来参与我的论文评审和答辨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值