毕业设计 博客分享平台的设计与实现(博客推荐系统升级、大数据组件、可视化大屏、文章查重)

系列文章:
第一章 Hadoop集群搭建的准备
第二章 Hadoop集群搭建
第三章 Zookeeper分布式集群部署(2n+1台虚拟机)
第四章 Hadoop高可用集群搭建(HA)
待更新
第九章 spark独立模式部署(Standalone)
第十章 spark配置历史服务
第十一章 搭建Spark高可用(HA)
第十二章 spark配置Yarn模式(混合部署模式)
待更新
博客推荐系统(适合初学者的javaweb+hadoop结课设计)
毕业设计 博客分享平台的设计与实现(博客推荐系统升级版、大数据组件、可视化大屏、文章查重)


界面展示

  • 首页
    在这里插入图片描述
  • 站内检索
    在这里插入图片描述
  • 用户登录
    在这里插入图片描述
  • 个人中心
    在这里插入图片描述
  • 发布博客
    在这里插入图片描述
  • 用户信息修改
    在这里插入图片描述
  • 文章管理可以进行管理当前用户发布的博客,博客有草稿、待审核、发布成功三个状态。
    在这里插入图片描述
  • 收藏管理可以管理当前用户收藏过的博客。
    在这里插入图片描述
  • 数据模块可以查看当前用户的账户数据。
    在这里插入图片描述
  • 登录管理员账号后,第一个模块是平台数据可视化面板。
    在这里插入图片描述
  • 查重管理是博客审核未通过的博客和相似的博客,该模块用于人工审核。
    在这里插入图片描述
  • 平台管理有权限删除平台上的所有博客。
    在这里插入图片描述
  • 用户管理有权限删除平台上的所有用户。
    在这里插入图片描述

摘 要

系统实现大数据分布式存储、分布式计算的博客分享平台。主要快速查找、数据处理统计、个性化博客推荐以及博客查重检测等问题。本文通过搭建Elasticsearch分布式集群,对博客分享平台进行了检索功能的设计,Elasticsearch集群是专门用于海量文本检索的一个大数据分布式搜索组件,因此可以满足快速查找检索内容需求。此外本文还搭建了Spark分布式计算集群,对数据进行处理,并通过Spark ML模块实现个性化推荐服务以及文本数据的TF-IDF的计算。随后根据TF-IDF的计算结果实现SimHash算法完成对博客的查重工作。
该项目的后端开发使用了Spring Boot框架,前端开发使用了LayUI框架,结合Hadoop、Spark、Zookeeper、Flume、Kafka等众多大数据组件以及协同过滤算法和SimHash算法,最终完成了博客分享平台中快速检索、个性化推荐、博客查重、日志数据实时处理统计四大核心功能的构建。

系统功能分析

1 、用户登录注册功能模块

这个模块包含了登录验证、账号注册以及权限验证的功能。
登录验证功能对用户输入的账号密码进行了校验,保证用户账号的安全性;账号注册为新用户提供注册接口,保证新用户可以使用登录后更加丰富的功能;权限验证功能用于判别用户的身份,普通用户登录后进入用户界面,进行博客的浏览,而管理员则在登录后进入后台系统管理界面,查看平台整体的数据,以及平台信息管理。

2、博客推荐功能模块

博客推荐功能模块总体包含四部分:首页推荐、检索推荐、文底推荐以及个性化推荐。
首页推荐又可以分为按热度推荐、按时间推荐以及按照类别推荐。其中,按热度推荐是根据博客的浏览量、点赞量以及收藏量计算博客热度,并降序排序。按时间排序则是发布时间最新的排在推荐列表顶部。而按类别推荐是将博客分成几大类别,每个类别分别按照博客热度降序排序。
检索推荐则是一个站内检索功能,使用了Elasticsearch分布式搜索分析引擎,使用该组件先对博客进行分词,再对分词结果构建倒排索引,从而满足了从海量数据中快速查询出包含查询关键字的数据的需求,并按照匹配度高的倒序排序。
文底推荐是根据当前用户所阅读的博客的标题在全站中进行检索匹配,将匹配度高的博客推荐到当前博客底部。
个性化推荐功能则是根据当前用户在平台中的行为对用户进行个性化推荐,尽可能准确地推断用户可能感兴趣的博客,提高用户的浏览体验。其中,用户行为主要包括浏览、点赞、收藏,然后将这些用户行为转换成分数,并使用基于物品的协同过滤算法对模型进行训练。

3、用户数据统计功能模块

用户数据统计功能模块用于可视化用户账户数据,主要有用户发布博客中各类别的浏览量统计、博客的点赞收藏统计、博客总数据统计、用户流量趋势统计。数据统计功能为用户维护个人账户提供了可视化数据支持,展示了账户基本状态。

4、用户管理功能模块

用户管理功能模块包括个人信息修改、发布博客、收藏管理以及个人博客管理功能。个人信息修改功能用于对用户信息的更新与修正。发布博客功能则用于发表自己的文章,该模块使用了编写MarkDown笔记的开源组件,支持MarkDown的语法和实时预览。收藏管理页面展示收藏过的博客,可以取消关注。个人博客管理页面展示用户所有博客的状态(博客状态有审核中、发布成功、草稿等)。

5、管理员数据统计功能模块

管理员数据统计功能模块包括用户注册趋势统计、发布量topN的用户、平台博客类型占比、检索词词频统计。该模块是主要是通过分析用户在博客平台的行为日志统计相关数据并进行可视化,为管理员展示平台状态。

6、管理员管理功能模块

管理员管理功能模块包括用户管理、博客管理以及查重审核管理。用户管理是管理员对平台全部用户的维护,而博客管理是管理员对平台全部的博客进行删减。其中查重审核是在普通用户发布博客后,平台对该用户发布的博客进行查重,将可能存在抄袭的相似博客拦截,禁止发布到平台上,并将相似的文章展示到管理员界面,使得管理员可以对可能存在抄袭的博客进行人工审核。

系统实现

1、集群环境

在这里插入图片描述

2、日志统计分析流程

在这里插入图片描述
通过在系统埋点,将用户的行为记录到本地日志文件中,并通过Flume监控日志文件,将增量数据采集到Kafka,解决数据生产与数据消费的速度不同步的问题,随后通过Spark Streaming流式处理Kafka中的日志数据,将日志数据按照数据可视化需求聚合统计,最终将结果存储到的Redis数据库中,满足数据快速读取的需求。
此外,还需要将用户行为日志存储到Hadoop分布式文件系统,进行数据备份。防止数据丢失,以及使用Spark SQL对日志行为日志进行分析,为管理员界面的系统数据面板提供数据支持。

3、数据流程设计

在这里插入图片描述

(1)查重算法数据流程

当用户发布博客后,博客存入MySQL中,并处于待审核状态。系统于每天凌晨一点自动执行基于Spark计算框架的SimHash算法,计算已发布博客的Hash码并将结果存入数据库,每五分钟自动将待审核的博客与数据库中的数据进行比对,将相似的文章存入数据库中的审核表,等待管理员人工审核,此状态的博客是无法在博客平台上浏览的,而不存在相似博客的待审核博客则自动通过系统审核,标记为发布成功的状态,并将其展示到前端界面,供用户浏览。

(2)博客推荐数据流程

当用户对博客进行点赞收藏后,其用户行为数据会存储到MySQL数据库中的用户行为表。随后Spark ML中的ALS算法(全称“交替最小二乘法”)会在每天凌晨一点自动运行,从MySQL数据库中读取用户行为数据来训练模型,并将训练好的模型存入Hadoop分布式文件系统中。并定时读取训练好的模型加载进内存,当用户使用个性化推荐功能时,系统会读取当前用户此刻的行为数据,将其输入到训练好的模型中,预测出博客的推荐结果,展示到前端界面。

(3)日志数据处理流程

系统在博客类别接口、站内检索接口、用户博客接口、用户收藏接口、个性化推荐接口、博客浏览接口等位置做了埋点日志,每当用户触发这些接口时,会将日志信息存储到本地日志文件以及Hadoop分布式文件系统中,通过Flume监控日志文件的增量数据,采集数据到Kafka,Kafka能够消除数据生产与数据消费之间的速度差异,防止数据生产速度太快,消费者来不及消费数据。然后使用Spark Streaming数据流式处理模块对日志数据进行消费,从日志数据中提取可视化所需的数据,然后聚合统计存入Redis内存数据库,使用Redis数据库可以提高数据的读取速度。最终将结果展示到数据可视化界面。

(4)数据同步及检索流程

当新发布的博客存入MySQL后,需要将新增的博客存入Elasticsearch,为站内检索提供数据支持。这里的数据同步使用Logstash数据收集引擎,它具备实时管道功能。Logstash将通过追踪MySQL中博客表的最后一条博客的id值的大小来判断是否向Elasticsearch中进行增量同步。将MySQL的博客数据同步到Elasticsearch后,即可满足用户在搜索界面进行站内搜索的需求。

4、数据统计流程图

在这里插入图片描述

5、数据库设计

用户信息表
序号字段名称数据类型约束条件描述
1user_idvarchar(20)不为空主键,用户ID
2user_namevarchar(100)不为空用户名
3user_passwordvarchar(15)不为空用户密码
4user_emailvarchar(30)不为空用户邮箱
5user_registration_timedatetime不为空注册时间
6update_timedatetime不为空更新时间
7user_telephone_numbervarchar(11)不为空用户手机号
8permissionint(2)不为空,默认为0权限,0普通用户,1管理员
博客信息表
序号字段名称数据类型约束条件描述
1text_idbigint(20)不为空,自增博客ID
2text_titletext不为空博客标题
3writer_idvarchar(20)不为空发表用户ID
4text_datedatetime不为空发表时间
5update_timedatetime不为空更新时间
6text_classvarchar(20)不为空博客分类
7text_contentlongtext不为空博客内容
8text_viewsbigint(20)不为空,默认为0浏览量
9text_goodbigint(20)不为空,默认为0点赞量
10text_commentbigint(20)不为空,默认为0评论量
11text_savebigint(20)不为空,默认为0收藏量
12statusbigint(20)不为空,默认为00审核状态,1草稿,2成功发布,3删除
博客类型表
序号字段名称数据类型约束条件描述
1class_idvarchar(20)不为空,自增主键,分类ID
2class_namevarchar(50)不为空分类名称
3parent_idvarchar(20)不为空默认0父级分类ID
博客SimHash表
序号字段名称数据类型约束条件描述
1text_idbigint(20)不为空博客ID
2sim_hashvarchar(16)不为空SimHash值
3statusint不为空博客状态
博客查重表
序号字段名称数据类型约束条件描述
1idbigint(20)不为空,自增主键
2check_text_idbigint(20)不为空博客ID
3text_idsvarchar(50)不为空相似博客ID
4create_timedatetime不为空创建时间

6、个性化推荐

针对用户的博客个性化推荐功能是博客分享平台的核心功能之一,该功能的目的是根据用户在博客分享平台的行为按照设定的规则隐式地为对应的博客评分,然后根据评分数据对用户推荐其可能喜欢的博客内容。
个性化推荐功能首先要满足的是针对用户的喜好尽可能地推荐符合用户口味的博客,即推荐内容的合理性,其次要满足推荐速度以及考虑推荐系统冷启动的问题,所谓推荐系统冷启动即用户第一次登录博客分享平台,系统中没有当前用户的行为数据,无法根据其用户行为推荐用户喜好的博客。
(1)个性化推荐算法合理性
本项目中使用了Spark ML中的交替最小二乘法(简称ALS算法),通过基于物品的协同过滤算法对登录用户进行了个性化推荐。
在这里插入图片描述
该算法主要通过用户对博客的隐性评分来计算推荐系数的,首先根据所有的用户行为数据隐性计算评分,再通过各个用户对各个博客的行为计算博客的同现矩阵,博客的同现矩阵的数值是任意两个博客之间的,因此可以解释为博客与博客之间的关联程度。通过将某个用户对各个博客的评分与博客的同现矩阵相乘,以此计算出该用户对各个博客的喜爱程度。
(2)提高推荐速度的设计思路
模型的训练速度十分耗时,因此不能在使用推荐功能时训练算法模型,通过设置定时执行任务,将模型的训练过程放到每天凌晨一点,此时的用户使用量是较少的,然后将训练好的模型存入Hadoop分布式文件系统中。
考虑到从Hadoop分布式文件系统中获取训练好的模型也会耗费大量时间,因此在每次模型训练完成后,将模型读取到内存中,并保存到网站的全局作用域对象中。这样当用户在使用个性化推荐功能时只需从数据库中读取当前用户的用户行为,将用户行为数据输入到提前加载到内存中模型即可输出推荐结果,节省了连接Hadoop分布式文件系统读取模型的时间。
(3)冷启动问题
当一个新用户登录到博客分享平台后,没有产生任何的用户行为数据,因此协同过滤算法无法针对该用户的喜好进行个性化推荐,影响了用户体验。本项目通过计算平台的博客热度,将热度最高的博客推荐给当前用户以此来解决系统冷启动的问题。

7、博客查重

通过对国内外现有的博客分享平台的现状分析,发现大部分平台普遍存在热门博客抄袭的问题,每当用户检索一个问题时,大量相似的搜索结果严重影响了用户解决问题的速度,以及用户使用体验。本项目通过使用SimHash算法对博客分享平台的全部博客进行了相似性检测,将可能存在抄袭的博客筛选出来。

SimHash算法实现

SimHash算法主要用于海量文本查重,在大数据维度上的文本查重对算法的效率有着很高的要求,因此SimHash算法的核心思想就是文本降维。理论上任何一段信息(包括文字、语音、视频等)都可以被映射为一段编码,这段编码可以区分任意两段信息,因此可以称这段编码为该段信息的指纹。SimHash算法实质是生成信息的指纹,通过指纹对比出相似的信息。
在这里插入图片描述
从图中可以看出算法主要分为以下几步骤。
(1)分词
使用结巴分词器对文本进行分词,只保留体现文本信息的特征词。在长文本处理过程中,通常使用TF-IDF算法(全称term frequency–inverse document frequency,词频-逆向文件频率)对文本的关键词进行抽取。TF-IDF是用来评估一个字词对于一个文件集的重要程度,其思想是:如果某个词语在绝大多数文章中都出现过,则认为该词语的重要性低,如人称代词、语气助词等。而一个词语在一篇文章中多次出现,则认为该词语有很高的重要性,即一个词语的重要性与它在文档中出现的次数成正比,与它在语料库中出现的频率成反比。本项目使用Spark ML中的TF-IDF模型进行关键词抽取。
(2)计算特征值的Hash值
已知大数据维度的文本查重必须要考虑算法效率,而在计算机中存储的都是二进制数据,因此将文本转换成一串串数字后会提高相似度计算性能。
(3)加权
按照上一步骤计算出的Hash数值,并使用每个词语的权重对Hash值进行加权,即Hash二进制串中为1的乘以该特征词的分词权重,二进制串中为0的乘以该特征词的分词权重后取负,继而得到权重向量。每个词语的权重一般可以使用IDF权重来进行计算,即一个词语在文本中的重要程度越大,则权重数值越大。
(4)合并
至此一篇文本的所有关键词语全部转换为了加权数字序列,但是此时的数据量还是很大,对文本查重时的效率有很大的影响。因此,将一篇文本的所有加权数字序列值进行累加,将一篇文本的所有加权数字序列转换成一个能够代表该文本的数字序列。
(5)降维
将上一步计算出来的文本数字序列转换成SimHash值,即按位替换数值,大于0的数字置为1,小于等于0的数字置为0,最终得到二进制字符串的SimHash签名。
(6)计算海明距离
计算两个文本SimHash值的海明距离,即两个SimHash二进制串对位取值不同的数量。例如10101与00110两个二进制串的第一、第四、第五位不同,则两者海明距离为3。

博客查重功能实现过程

本项目使用Spark SQL结合SimHash算法对MySQL数据库中的博客进行了SimHash值计算、博客查重、博客自动审核三个流程的设计实现。
在这里插入图片描述
(1)使用Spark SQL计算博客SimHash值
通过Spark SQL读取博客信息表的博客标题、博客内容以及博客状态三个字段的数据。注册自定义udf函数,该udf函数用于剔除博客内容中的HTML标签,并调用SimHash算法计算出博客的SimHash值。然后使用Spark SQL调用自定义udf函数对Dataset中的所有博客进行SimHash值的计算,并将计算结果存入博客SimHash表。此外,每当一篇博客被发布后,都会被计算出SimHash值存入该表。
(2)博客查重计算
读取博客SimHash表,提取出待审核状态的博客ID和SimHash值,存入HashMap容器中,然后获取已审核的博客ID和SimHash值与待审核的博客进行查重计算,先将计算结果保存为Map<未审核ID,Map<已审核ID,相似度>…>的数据格式,筛选出相似度大于79的博客ID,最终将待审核博客ID与相似博客ID以键值对的形式存入内存中。
(3)博客自动审核
根据上一步骤计算的数据对博客进行自动审核,当待审核博客不存在相似博客时,将该博客的状态设置为已审核,如果存在相似博客则说明该博客内容可能存在抄袭行为,将待审核博客以及其对应的相似博客存入博客查重表,用于管理员进行人工审核的数据支撑。该功能被设置为定时执行任务,每十五分钟执行一次。

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开朗小哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值