基于协同过滤的图书推荐系统设计与实现(LW+源码+讲解+部署)
摘要
随着数字化技术的迅速发展,图书馆作为知识传承与文献收藏的重要存储库,正迎来了空前未有的变革契机。相比于传统的图书馆服务模式,基于协同过滤的图书推荐系统能够缓解海量信息过载问题,满足用户个性化的需求,提供更高效、更便捷的阅读体验。
为了更好地服务高校师生,满足的个性化阅读需求,从而快速准确地筛选出自己感兴趣的内容。主要研究内容如下:
- 利用协同过滤算法挖掘用户的兴趣偏好,为用户生成个性化的图书推荐列表,减轻信息过载问题。
- 建立图书-用户评分倒排表,计算相似用户间的余弦相似度,找出相似用户感兴趣的图书,完成个性化图书推荐。
- 将协同过滤推荐技术应用于图书场景中,分析图书推荐平台和用户的需求,对系统进行整体设计、功能规划和数据库构建,最终实现一个图书推荐系统。
该图书推荐系统主要分为用户、管理员和个性化图书推荐三个模块,实现了个人管理、图书借阅、个性化图书推荐等功能,并且达到了预期的功能和性能测试要求。系统的实现旨在减少检索时间成本,提高图书检索效率和阅读体验,帮助图书馆员优化资源配置和服务模式,促进图书推荐领域的智能化发展。
关键词:余弦相似度;图书推荐;协同过滤
目录
1 绪论
1.1 研究背景与意义
在数字化时代,信息技术的迅猛发展极大地丰富了图书资源的获取渠道,同时也带来了用户在海量信息面前的选择困境。传统的图书检索方式往往依赖于用户的明确查询,忽视了用户潜在的阅读兴趣和个性化需求。因此,如何有效地利用信息技术提升图书推荐服务质量和效率,成为当前图书领域研究的重要课题。
近年来,以信息过滤和个性化服务为核心的推荐系统,已经逐步渗透到图书馆服务、社交媒体等领域。基于协同过滤的推荐算法因其简单易实现、推荐效果好等特点,受到了广大学者的关注。在图书推荐领域,推荐系统能够根据用户的借阅习惯、浏览记录等信息,分析用户之间的相似性,为用户推荐与其偏好相似的图书,从而更好地提高图书利用率和用户满意度。
现如今图书推荐系统致力于通过深入分析用户的历史行为和偏好,实现个性化图书推荐,引导用户探索新颖的阅读领域。这些系统不仅能依据用户的阅读轨迹和评分反馈生成推荐,还能利用图书的详细信息,包括作者信息、主题分类、文学流派等元数据,进一步提升推荐的精确度与多样性[1]。此外,图书推荐系统在优化图书资源配置方面发挥着重要作用。它们帮助出版商和书店深入洞察读者的阅读倾向,从而更有效地管理库存并制定营销策略[2],进而推动整个图书行业的健康发展。
随着人工智能技术的不断进步,国内对基于协同过滤的图书推荐系统的研究正逐步深入。学者们正尝试通过引入新的算法和技术,如内容推荐、混合推荐策略等,来解决传统协同过滤方法面临的数据稀疏性、冷启动问题等挑战[3-4]。随着智能设备和移动互联网的普及,用户对于随时随地获取个性化推荐的需求日益增长,这为图书推荐系统的发展提供了新的机遇和挑战[5]。
综上所述,基于协同过滤的图书推荐系统[6]在满足用户个性化阅读需求、提升阅读体验、优化图书资源配置等方面展现出巨大的潜力和价值,已成为当前信息检索和个性化推荐领域的研究热点之一,具有广阔的应用前景和发展空间。
1.2 国内外研究现状
1.2.1 国内研究现状
在国内,图书推荐系统研究相对较晚开始。基于协同过滤的推荐算法最早由亚马逊提出并应用,目前已成为主流推荐系统的核心技术,在我国得到了深入研究和普遍应用。该技术的发展可追溯到上世纪90年代,当时主要应用于电子邮件和新闻推荐,为用户提供个性化的内容服务。得益于大数据和人工智能技术的进步,图书推荐系统现已成为图书销售和图书馆服务中不可或缺的一环。面对“信息过载”和“需求多样性”这一问题,国内各地图书馆和中科院等机构,集中研发力量推出了个性化图书管理系统,在高校图书馆管理中的应用已经取得了显著的成效。以北京大学图书馆、南京大学图书馆和中国科学技术大学图书馆等高校为例,它们的图书馆已经成功实施了推荐服务,不仅提供了智能检索功能,还能根据读者的个性化偏好,为读者提供更加精准和便捷的图书推荐服务[7]。
近年来,国内学者还尝试将其他算法和技术引入图书推荐系统中。例如,张捷[8]利用极限学习机算法对图书馆读者借阅行为进行分析,为推荐系统的精准性提供了数据支持。同时,葛欣然[9]等人探讨了基于协同过滤的智能推荐方法在电子商务中的应用,为图书推荐系统的推广和应用提供了有益的借鉴。然而,国内研究在图书推荐系统方面仍存在一些挑战和不足。例如,对于大规模图书数据的处理和分析能力还有待提升。同时,推荐系统的个性化和精准性也需要进一步优化。未来,国内学者可以进一步深入研究图书推荐系统的算法和技术,以提高推荐系统的性能和用户体验。
1.2.2 国外研究现状
在国外,基于协同过滤的图书推荐系统的研究起步较早。协同过滤技术在电商推荐系中的应用已经得到了广泛的认可。2020年Shen等人基于大量用户历史行为数据,设计出高度准确且可靠的电影推荐算法,并在Ubuntu系统中取得了显著的成效[10]。通过对用户的行为数据进行深入分析,他们能够向用户提供定制化的商品推荐。此外,一些科技巨头如微软和谷歌,也在大数据分析和推荐算法方面取得了重要的突破。在2010年,一家美国Google公司旗下的视频网站YouTube发表将使用ItemCF算法做视频推荐,这也表明推荐系统逐渐广泛地应用在各个领域。类似的,美国著名视频网站Netflix(网飞)也在广泛使用推荐系统,该网站80%的播放量是通过Netflix的推荐系统实现的[11]。
随着大数据技术和推荐算法的不断发展,个性化推荐的理念渐渐地融入到图书管理系统中,如今绝大部分的图书馆已经将协同过滤推荐方法与图书馆的日常工作相融合。在欧美地区,美国国会图书馆、法国国家图书馆和纽约公共图书馆等多个地方已经向公众敞开了他们的数字图书馆的大门。数字图书馆管理系统不仅已经得到了广泛的应用,同时也开始采用智能图书推荐系统,以提供更加贴合个人需求的服务体验。通过分析用户的借阅数据、浏览轨迹、学术兴趣等信息,为他们推荐与其偏好相似的图书和学术资源,从而提升了服务品质和用户体验。
总的来说,图书推荐系统已经成为国内外图书推荐领域的重要研究方向和实践应用。这一研究不仅为图书推荐领域的学术研究提供了宝贵的参考和借鉴,而且推动了图书推荐系统的智能化发展和应用进程。
1.3 研究内容
课题是利用协同过滤推荐算法,挖掘相似用户群体的偏好,探究用户以及图书间的相似性寻找潜在的相似对象,并提供定制化的图书推荐,完成一个依托于协同过滤的图书推荐系统。主要研究内容如下:
- 对用户行为、协同过滤推荐算法以及图书推荐系统展开全面的深入探讨。
- 总结图书推荐系统的优缺点,选择合适的算法与框架实现图书推荐系统的功能特点。
- 针对系统的具体业务需求进行详尽的需求分析,并据此进行系统总体设计,主要包括用户管理、个性化图书推荐模块、管理员管理等。
- 分析阐述图书推荐系统的推荐算法,包括推荐算法的基本原理、相似度计算以及算法实现流程。
合理使用系统的开发框架。系统采用SpringBoot和Vue框架进行搭建。在前端方面,采用了vue.js构建直观易用的前端用户交互界面。在后端方面,使用SpringBoot框架对业务逻辑进行处理,并通过API接口确保前后端数据的顺畅对接。
2 系统相关技术介绍
2.1 开发技术
2.1.1 JAVA 简介
JAVA是一种由Sun Microsystems(现为Oracle Corporation旗下)于1995年发布的面向对象、跨平台的高级编程语言[12]。JAVA的面向对象特性,包括封装、继承和多态,使得代码更加模块化和可重用,从而提高了开发效率和程序的可维护性[13]。它以“一次编写,到处运行”的理念,通过JAVA虚拟机(JVM)完成了代码在不同操作系统上的无缝兼容。JAVA的设计注重简洁性、健壮性、安全性,支持自动化内存管理和多线程处理,易于学习和使用。此外,JAVA在性能上不断优化,已适用于企业级应用、移动应用、桌面应用、游戏开发、数据库连接和计算机网络等多种场景。拥有一个成熟的生态系统,JAVA为开发者提供了丰富的工具、框架和社区支持,是软件开发领域的主流选择之一。JAVA技术体系如图2-1所示:

图2-1 JAVA技术体系图
2.2.2 B/S结构
在互联网尚未普及的早期,网站程序多采用客户端/服务器(C/S)架构进行开发。C/S架构的应用程序需要在本地计算机上安装,这限制了数据共享,占用了宝贵的本地资源,且维护起来较为复杂。随着互联网技术的发展和普及,C/S架构逐渐被新的浏览器/服务器(B/S)架构所取代。
B/S架构利用了互联网的优势,允许用户通过网络浏览器访问服务器上的应用程序,无需在本地安装任何软件。这种模式极大地增强了程序的共享性和可访问性,简化了程序的推广和使用过程。用户只需记住网站的URL,即可在全球任何地点通过互联网连接的设备上访问应用程序,实现了真正的随时随地的便利性。B/S架构减少了对本地资源的依赖,降低了维护成本,提高了应用程序的可扩展性和可维护性。因此,B/S架构已经占据现代网络应用程序开发的主流地位,成为众多开发者首选。B/S结构示意图如图2-2所示:

图2-2 B/S结构示意图
2.2.3 MySQL
MySQL作为普遍应用的关系型数据库,因其开源、免费和稳定性而受欢迎。数据库充当数据存储的容器,允许用户以结构化的方式输入、检索、更新和管理数据。它通过TCP/IP和JDBC等多种协议提供数据访问接口,允许客户端应用程序通过网络与数据库进行交互。数据在MySQL中以表格形式存储,用户可以利用可视化工具直观地查看、导入导出和管理数据。确保用户名、密码和数据库名称与应用程序配置一致,是获取数据信息的前提。一旦数据库密码丢失,可能需重新安装以恢复访问。数据库的安全性和数据完整性对于系统至关重要,因此,其管理和维护需格外谨慎。
Spring Boot是Spring框架的扩展,旨在优化新Spring应用的开发和创建流程[14]。相较于传统的Spring应用开发,它提供了一系列的“起步依赖”和自动配置,极大地减少了应用开发中原本的复杂配置工作。通过其“约定优于配置”的原则,Spring Boot在其设计中广泛使用了多种starter,从而显著降低了配置的难度与工作量[15]。在传统的SSM框架中,开发者需要手动编写和维护大量的XML配置文件,这不仅工作量大而且容易出错。它使用合理的默认设置,使得开发者能够快速启动和运行应用程序,而无需深陷繁琐的配置细节。众多基于JavaWeb的程序开发项目倾向于选用Spring Boot框架进行构建。它不仅简化了开发流程,还便于项目的部署和维护。因此,Spring Boot的这些优势,使其成为构建现代Java Web应用程序的首选技术之一。
2.2 协同过滤推荐算法
协同过滤推荐算法具有个性化、效率高、可操作等优点,是当下应用较多的一种推荐技术[16]。它基于一个核心假设:如果用户A和用户B在过去对一系列项目有类似的喜好或评分模式,那么用户A可能会对用户B喜欢的、但自己还未接触过的项目感兴趣。协同过滤主要分为两类:
- 基于用户的协同过滤主要是挖掘出与目标用户兴趣相似匹配度较高的邻居用户,然后根据邻居用户的倾向来预测目标用户的兴趣偏好,最终生成目标用户的个性化推荐列表[17]。
- 基于物品的协同过滤则是通过衡量物品之间的相似性,找到每个物品的近似物品集合。然后依据目标用户对近似物品的评分数据,来预测其物品的评分,最后根据物品的评分高低,为该用户推荐物品[18]。
与传统的推荐技术相比,协同过滤推荐算法无需深度解析物品内容,便能根据用户的独特偏好定制推荐内容,更好地迎合用户的兴趣偏好。这种方法通常对推荐结果的新颖性和多样性有更好的成效。
3 系统需求分析
3.1 需求分析概述
图书推荐系统是一种基于人工智能技术的图书推荐系统,能够根据用户的阅读历史评分数据,为其推荐合适的图书,增强阅读体验。该系统旨在帮助用户发现感兴趣的图书,同时辅助优化图书资源的管理和推荐策略,提升服务效果。发展图书推荐系统可以有效地提升图书发现的效率和阅读的个性化水平,为用户和图书管理员带来诸多便利和益处。因此,图书推荐系统应该满足以下需求:
- 支持个性化推荐:根据用户的历史评分记录,帮助用户更好地发现感兴趣的图书作品,提供个性化推荐服务。
- 提高系统易用性和用户满意度:了解用户需求和期望,设计友好的界面和交互体验,使用户能够轻松浏览和管理推荐图书。
- 集成大量的图书资源并支持灵活扩展:整合大量图书资源,提供多样的阅读选择,同时系统具备灵活扩展和升级能力,以适应不断变化的用户需求和技术发展。
3.2 功能需求分析
图书推荐系统作为连接读者与书籍的重要桥梁,通过智能分析用户的阅读历史和偏好,搭建起个性化的阅读体验,并增强了图书馆的服务功能。该图书推荐系统具有以下功能:
- 图书管理:管理员可以进行图书的上架、下架、信息修改和查阅图书信息。
- 评价与收藏:支持用户对已经借阅的图书进行星级评分和文字评价;同时收藏感兴趣的图书,便于日后查阅和参考。
- 图书浏览与借阅:系统用户能够方便地浏览图书详情,如图书名称、作者、出版社和关键字等,并利用搜索功能快速定位所需图书。此外,用户可查看图书评价信息,并管理自己的借阅记录。
- 线上交流:支持用户之间线上留言或交流,以书会友,交流读书心得。
- 个性化推荐图书:系统智能推荐满足用户兴趣的图书到图书推荐排行榜。同时支持用户对推荐的图书进行点评,如感兴趣、不感兴趣等。
- 数据统计:支持系统管理员对用户、图书类型、图书借阅量、评分等数据进行统计。
- 管理员权限管理:支持管理员能够根据用户需求为用户设定特定的访问级别和功能权限,确保只能执行其被明确赋予的操作。每个级别都有对应的数据库操作权限。
3.3 性能需求分析
在开发基于协同过滤的图书推荐系统时,除了满足用户的核心功能需求外,还需确保系统具备以下性能要求,以支持项目的长期稳定发展:
- 安全性:系统必须确保所有数据的安全,特别是用户个人信息的保护。图书借阅平台涉及敏感数据,因此必须采取有效的安全措施来保护用户隐私,建立用户对系统的信任。
- 稳定性:鉴于图书推荐系统可能面向广泛的用户群体,系统需要具备高稳定性,即使在用户量激增或出现操作失误的情况下,也能保证正常运行,避免系统崩溃。
- 兼容性:系统应具备良好的跨浏览器兼容性,确保不同用户无论使用何种浏览器都能获得一致的访问体验,无需担心因技术差异导致的使用障碍。
- 响应速度:图书推荐系统应提供快速响应,用户在进行功能切换或数据加载时,系统应在3秒内完成响应,以维持用户的耐心和满意度,避免过长的等待时间影响用户体验。
4 系统总体分析
4.1 系统结构设计
图书推荐系统的总体结构由数据访问层、业务逻辑层和表示层组成。系统结构图如图4-1所示:

图4-1系统结构图
- 表示层:用于显示和接收数据,调用下一层提供的接口实现功能。
- 业务逻辑层:接收用户界面传递的请求,根据预定义的业务规程进行相应的处理,并调用下一层进行数据操作。
- 数据访问层:主要用于存取和管理系统中的所有数据,包括用户信息、图书信息、评分信息等。
4.2 系统功能设计
通过结合用户需求和各功能特点,本系统分为用户和管理员两种用户角色,其系统功能模块如图4-2所示:

图4-2 系统功能模块图
用户登录用例图,用户的用例有个人信息管理、图书信息、评分信息、收藏管理等,具体用例图如图4-3所示:

图4-3 用户登录用例图
管理员登录用例图,管理员的用例有用户管理、图书管理、评分管理、系统管理等,具体用例图如图4-4所示:

图4-4 管理员登录用例图
4.3 系统流程设计
4.3.1 开发流程
图书推荐系统设计过程中,需求分析是首要且关键的步骤,它为系统的构建提供了指引和基础。本系统的开发流程如图4-5所示。

图4-5系统开发流程图
4.3.2 登录流程
登录模块是任何系统的关键组成部分,它通过严谨的步骤来保障系统的安全性,并确保只有经过验证的用户才能访问系统资源。用户登录流程图如图4-6所示。

图4-6登录流程图
4.3.3 借阅流程
用户登录是进行图书借阅操作的前提,确保了操作的安全性和个性化服务。用户借阅流程如图4-7所示。

图4-7借阅流程图
4.3.4 评分评论流程
图书推荐系统的评分评论流程是用户参与和反馈的重要组成部分,它不仅可以帮助其他用户做出阅读选择,还能为图书推荐算法提供改进的依据。用户评分评论流程如图4-8所示。

图4-8评分评论流程图
4.3.5 个性化图书推荐流程
个性化图书推荐流程旨在以用户的评分记录为依据,综合生成图书推荐列表,作为系统的核心功能。个性化图书推荐流程如图4-9所示。

图4-9个性化图书推荐流程图
4.4 数据库设计
4.4.1 概念结构设计
系统采用MySQL对数据进行存储管理,各模块的数据表包括用户信息表(yonghu)、图书信息表(tushuxinxi)、图书借阅信息表(tushujieyue)、图书评分信息表(pingfenxinxi)、收藏信息表(storeup)等主要数据表。系统数据库ER模型图如图4-10所示。

图4-10 数据库ER模型图
4.4.2 逻辑结构设计
- 用户信息表(用户ID、创建时间、用户账号、用户姓名、密码、手机号码、性别、年龄、头像)
- 图书信息表(图书ID、创建时间、图书名称、图书类型、图片、作者、出版社、标签、借阅次数、发布时间、图书简介、赞、踩、最近点击时间、点击次数、评论数、收藏数)
- 图书借阅信息表(借阅ID、创建时间、图书名称、图书类型、图片、出版社、借阅次数、借阅时间、用户账号、用户姓名)
- 图书评分信息表(评分ID、创建时间、图书名称、图书类型、图片、作者、出版社、图书评分、评分时间、用户账号、用户姓名)
- 收藏信息表(收藏ID、创建时间、用户ID、图书ID、收藏路径、名称、图片、收藏类型、推荐类型、备注)
- 公告信息表(公告ID、创建时间、标题、简介、分类名称、发布人、头像、点击次数、最近点击时间、赞、踩、收藏数、图片、内容)
- 线上交流信息表(交流ID、创建时间、帖子标题、帖子内容、父节点ID、用户ID、用户名、头像、状态、是否置顶、置顶时间)
-
- 物理结构设计
-
(1)用户信息表主要用于存放用户的个人信息,在表中用户编号作为表的主键,确保每个用户都能被精确且唯一地标识,从而保障了数据的准确性和完整性。用户信息表的设计如表4-1所示。
表4-1用户信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 | |||
| yonghuzhanghao | varchar | 200 | 用户账号 | ||
| yonghuxingming | varchar | 200 | 用户姓名 | ||
| mima | varchar | 200 | 密码 | ||
| shoujihaoma | varchar | 200 | 手机号码 | ||
| xingbie | varchar | 200 | 性别 | ||
| nianling | varchar | 200 | 年龄 | ||
| touxiang | longtext | 头像 |
(2)图书信息表主要用于存放图书的相关信息,在表中图书编号作为表的主键,其值不仅不可为空,而且在整个表中都是独一无二的,以确保每一本图书都能被精确地标识和区分。图书信息表的设计如表4-2所示。
表4-2图书信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 | |||
| tushumingcheng | varchar | 200 | 图书名称 | ||
| tushuleixing | varchar | 200 | 图书类型 | ||
| tupian | longtext | 图片 | |||
| zuozhe | varchar | 200 | 作者 | ||
| chubanshe | varchar | 200 | 出版社 | ||
| biaoqian | varchar | 200 | 标签 | ||
| jieyuecishu | int | 借阅次数 | |||
| fabushijian | datetime | 发布时间 | |||
| tushujianjie | longtext | 图书简介 | |||
| thumbsupnum | int | 赞 | 0 | ||
| crazilynum | int | 踩 | 0 | ||
| clicktime | datetime | 最近点击时间 | |||
| clicknum | int | 点击次数 | 0 | ||
| discussnum | int | 评论数 | 0 | ||
| storeupnum | int | 收藏数 | 0 |
(3)图书借阅信息表主要用于存放图书借阅的相关信息,在表中借阅编号作为表的主标识符,确保每一次图书借阅都能被精确记录并有效区分。图书借阅信息表的设计如表4-3所示。
表4-3图书借阅信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 |
表4-3图书借阅信息表(续)
| tushumingcheng | varchar | 200 | 图书名称 | ||
| tushuleixing | varchar | 200 | 图书类型 | ||
| tupian | longtext | 图片 | |||
| chubanshe | varchar | 200 | 出版社 | ||
| jieyuecishu | int | 借阅次数 | |||
| jieyueshijian | datetime | 借阅时间 | |||
| yonghuzhanghao | varchar | 200 | 用户账号 | ||
| yonghuxingming | varchar | 200 | 用户姓名 |
(4)图书评分信息表是专门用于存放用户对图书评分信息的数据库结构。在图书评分信息表中评分编号设置为主键,是唯一的。图书评分信息表的设计如表4-4所示。
表4-4 图书评分信息表
| 类型 | 长度 | 字段说明 | 主键 | 默认值 | |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
| tushumingcheng | varchar | 200 | 图书名称 | ||
| tushuleixing | varchar | 200 | 图书类型 | ||
| tupian | longtext | 图片 | |||
| zuozhe | varchar | 200 | 作者 | ||
| chubanshe | varchar | 200 | 出版社 | ||
| tushupingfen | int | 图书评分 | |||
| pingfenshijian | datetime | 评分时间 | |||
| yonghuzhanghao | varchar | 200 | 用户账号 | ||
| yonghuxingming | varchar | 200 | 用户姓名 |
(5)收藏信息表存放着用户对图书或公告的收藏记录,在这个表中用户ID和图书ID作为外键。收藏信息表的设计如表4-5所示。
表4-5收藏信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 |
表4-5收藏信息表(续)
| addtime | timestamp | 创建时间 | |||
| userid | bigint | 用户id | |||
| refid | bigint | 图书id | |||
| tablename | varchar | 200 | 收藏路径 | ||
| name | varchar | 200 | 名称 | ||
| picture | longtext | 图片 | |||
| type | varchar | 200 | 收藏类型 | 1 | |
| inteltype | varchar | 200 | 推荐类型 | ||
| remark | varchar | 200 | 备注 |
(6)公告信息表存储着系统的公告信息,在表中公告ID设置为主键,不为空且是唯一的。公告信息表的设计如表4-6所示。
表4-6公告信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 | |||
| title | varchar | 200 | 标题 | ||
| introduction | longtext | 简介 | |||
| typename | varchar | 200 | 分类名称 | ||
| name | varchar | 200 | 发布人 | ||
| headportrait | longtext | 头像 | |||
| clicknum | int | 点击次数 | 0 | ||
| clicktime | datetime | 最近点击时间 | |||
| thumbsupnum | int | 赞 | 0 | ||
| crazilynum | int | 踩 | 0 | ||
| storeupnum | int | 收藏数 | 0 | ||
| picture | longtext | 图片 | |||
| content | longtext | 内容 |
(7)线上交流信息表用于存储用户在线发布的帖子内容和评论数据,以书会友,交流心得。线上交流信息表的设计如表4-7所示。
表4-7线上交流信息表
| 字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
| id | bigint | 主键 | 主键 | ||
| addtime | timestamp | 创建时间 | |||
| title | varchar | 200 | 帖子标题 | ||
| content | longtext | 帖子内容 | |||
| parentid | bigint | 父节点id | |||
| userid | bigint | 用户id | |||
| username | varchar | 200 | 用户名 | ||
| avatarurl | longtext | 头像 | |||
| isdone | varchar | 200 | 状态 | ||
| istop | int | 是否置顶 | 0 | ||
| toptime | datetime | 置顶时间 |
5 系统实现
5.1 用户模块
用户模块是图书推荐系统的核心构成,直接关系到用户的交互体验和满意度。包括系统首页、用户注册登录、线上交流、图书详情、我的借阅、个人中心的实现。
5.1.1 系统首页
系统首页主要向用户展示系统的基本信息和功能导航。包括首页、图书信息、评分排行榜、线上交流、公告信息等界面。未登录用户可以在首页浏览系统简介、图书信息推荐列表、评分排行榜、关于我们、公告信息等,便于提升用户体验。实现如图5-1所示。

图5-1系统首页实现图
5.1.2 用户注册登录
用户进行账号的注册,登入系统后才可获得更多的功能服务。注册时,用户按照界面要求填写账号、姓名、密码等进行注册。系统在数据库中查询是否存在该用户,不存在则直接提示“注册成功”。用户实现如图5-2所示。

图5-2用户注册实现图
在图5-3的用户登录页面中,若用户名或密码输入不正确,将登录不进系统并会给出对应的错误信息提示。若正确则登录成功,登录成功后便可进入系统。

图5-3用户登录实现图
5.1.3 图书检索
当用户进入图书信息界面时,可以根据所了解到的图书名称等关键信息搜索图书,帮助快速地筛选出符合自身需求的图书。实现如图5-4所示。

图5-4图书检索实现图
5.1.4 图书详情
当用户有兴趣阅读某本书并想要获取更多信息时,可以点击该图书的封面,进入该书的详情页面。此外,当用户遇到喜欢的图书方便以后浏览,可以进行收藏和点赞,可以借阅该图书。实现如图5-5所示。同时,还可以对图书进行评分、评论,发表阅读心得。实现如图5-6所示。

图5-5图书详情实现图

图5-6用户评分、评论实现图
5.1.5 图书借阅
用户可以在图书详情页面中,点击“借阅”按钮,进入图书借阅界面,选择借阅次数和借阅时间,提交表单即可借阅该图书。实现如图5-7所示。

图5-8线上交流实现图
5.1.7公告信息
管理员通过公告信息管理可以高效地管理系统的最新动态和重要通知。允许管理员发布、编辑和删除公告,同时支持公告的分类管理和搜索功能。实现如图5-9和图5-10所示。

图5-9公告信息实现图

图5-10公告信息管理实现图
5.1.8 个人中心
在个人中心模块中,功能主要包个人信息、修改密码、图书信息、图书借阅、我的发布、我的收藏。用户可在修改密码中设置新密码;在个人信息进行信息更新;在图书信息中浏览图书;在图书借阅中查看此前个人在平台的借阅记录;在我的发布中查看个人发帖记录;在我的收藏中查看图书、公告的收藏记录。实现如图5-11所示。

图5-11个人中心实现图
5.2 管理员模块
管理员模块包括用户管理、图书类型管理、图书信息管理、图书借阅管理、评分信息管理、评分排行榜管理、线上交流、我的收藏管理、系统管理、我的信息。
5.2.1 管理员登录
管理员进入登录页面,输入用户名和密码,点击登录按钮进行登录。若正确则进入到系统的管理端页面,实现如图5-12所示。

图5-12登录页面实现图
5.2.2 管理员首页
首页主要对用户、图书类型、图书借阅量、评分等数据进行统计,利用可视化技术,展现了图书受欢迎的热度和读者的偏好,同时促进了图书的发现与借阅。实现如图5-13所示。

图5-13首页数据统计实现图
5.2.3 用户管理
管理员可以管理系统注册的用户信息,确保用户数据的准确性和完整性。主要包括查询、添加、修改、删除操作。实现如图5-14所示。

图5-14用户管理实现图
5.2.4 图书信息管理
管理员可以进行浏览图书的详细信息和相关评论、查询特定图书,也可以对图书进行管理。实现如图5-15所示。

图5-15图书信息管理实现图
5.2.5 图书借阅管理
在图书借阅管理界面,管理员能够有效地操控用户提交的借阅详情。这包括了对图书的检索、借阅记录的详细查看、必要时的信息更新以及无效借阅数据的清理。管理员可以确保借阅信息的准确性和实时性,为用户提供高效且精准的借阅服务。实现如图5-16所示。

图5-16图书借阅管理实现图
5.2.6评分排行榜管理
在评分排行榜管理界面,管理员作为主要的操作者,能够高效地管理图书的评分数据。不仅可以详细查看每本图书的具体详情以及对应的评分统计图,还具备修改或删除不准确评分记录的权限,确保数据的准确性和完整性。实现如图5-17所示。

图5-17图书借阅管理实现图
5.2.7线上交流管理
在线上交流管理界面中,帖子的审核和编辑工作由管理员负责,他们严格把控内容质量,确保帖子符合规定,并详细查看具体内容以及用户评论,以维护交流环境的秩序和质量。实现如图5-18所示。

图5-18线上交流管理实现图
5.2.8我的收藏管理
管理员在我的收藏管理页面,可以详细查看并管理用户对图书的收藏情况。此功能不仅使管理员能够深入了解用户的阅读偏好和行为模式,而且有助于优化图书资源的配置和分发。实现如图5-19所示。

图5-19我的收藏管理实现图
5.3 个性化图书推荐模块
5.3.1 算法简介
基于用户的协同过滤推荐算法,需要从用户历史行为活动中获取评分和评论数据。这包括建立用户与项目的评分矩阵,其中每一行代表一个用户,每一列代表一个项目,矩阵中的值则是用户对项目的评分,并对用户进行相似度分析。并对用户进行相似度分析。通过寻找与目标用户的偏好相匹配的最近的用户群体,并在该群体中排除那些目标用户已有偏好的项目,然后对余下的项目进行评估和排序,以满足他们的需求。如果目标用户与其邻居之间的相似度较高,那么推荐的产品更有可能吸引用户的注意。相似度常见的计算指标包括欧式距离、余弦相似度、皮尔森相关系数和杰卡德相似度[19]。
5.3.2 算法实现流程
表5-1图书-用户倒排表
| 图书ID | 用户ID列表 |
| B001 | [u1,u2,u3] |
| B002 | [u1,u4] |
| B003 | [u2,u5] |
| B004 | [u3,u5] |
| B005 | [u1,u3,u7] |
每本图书都有一个与之关联的用户ID列表,列表中的用户都对该书进行了评分。帮助算法快速找到与目标用户兴趣相似的其他用户,从而生成个性化的图书推荐。
伪代码如下:
//构建物品-用户倒排表
int keyIndex = 0;
for (String user : userRatings.keySet()) {
Map<String, Double> ratings = userRatings.get(user);
for (String item : ratings.keySet()) {
if (!itemUsers.containsKey(item)) {
itemUsers.put(item, new ArrayList<>());
}
itemUsers.get(item).add(user);
}
//用户ID与稀疏矩阵建立对应关系
this.userIndex.put(user,keyIndex);
this.indexUser.put(keyIndex,user);
keyIndex++;
}
int N = userRatings.size();
this.sparseMatrix=new Long[N][N];
//建立用户稀疏矩阵,用于用户相似度计算相似度矩阵
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
this.sparseMatrix[i][j]=(long)0;
}
for(String item : itemUsers.keySet()) {
List<String> userList = itemUsers.get(item);
for(String u1 : userList) {
for(String u2 : userList) {
if(u1.equals(u2)){
continue;
}
this.sparseMatrix[this.userIndex.get(u1)][this.userIndex.get(u2)]+=1;
}
}
}
- 计算两个用户之间的相似度。
在计算用户间相似度时,我们优先选择余弦相似度作为评估指标。余弦相似度基于向量空间模型,根据计算向量之间的相似度来评估用户或者物品之间的相似性。余弦相似度的取值范围为[-1, 1],其中1表示完全相似,0表示完全不相似,值越大表示两个用户越相似[20]。计算公式如下:
![]()
其中,U(I):表示图书I的邻域,通常是用户I已经评分的图书集合。
U(K):表示图书K的邻域,通常是指用户K已经评分的图书集合。
∣U(I)∣:表示用户I已经评分的图书数量。
∣U(K)∣:表示用户K已经评分的图书数量。
∣U(I)∩U(K)∣:表示I和K两用户都已评分的图书数量。
通过计算用户I和用户K都评分的图书数量与各自评分的图书数量乘积的平方根之比,反映了用户I和用户K在图书偏好上的相似程度。如果 sim(I,K) 的值较高,这意味着用户I和用户k有较多的共同喜好,他们对图书的评分模式更为相似。计算的伪代码如下:
public double calculateSimilarity(String user1, String user2) {
//计算用户之间的相似度余弦相似性
Integer id1 = this.userIndex.get(user1);
Integer id2 = this.userIndex.get(user2);
if(id1==null || id2==null) return 0.0;
return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings
.get(indexUser.get(id1)).size()*userRatings
.get(indexUser.get(id2)).size());
}
- 综合相似度并选出与当前用户最为相似的K个用户。计算的核心伪代码如下:
public List<String> recommendItems(String targetUser, int numRecommendations) {
//计算目标用户与其他用户的相似度
Map<String, Double> userSimilarities = new HashMap<>();
for (String user : userRatings.keySet()) {
if (!user.equals(targetUser)) {
double similarity = calculateSimilarity(targetUser, user);
userSimilarities.put(user, similarity);
}
}
//根据相似度进行排序
List<Map.Entry<String,Double>>sortedSimilarities=new
ArrayList<>(userSimilarities.entrySet()); sortedSimilarities.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
//选择相似度最高的K个用户
List<String> similarUsers = new ArrayList<>();
for (int i = 0; i < numRecommendations; i++) {
if (i < sortedSimilarities.size()) {
similarUsers.add(sortedSimilarities.get(i).getKey());
} else {
break;
}
}
- 综合这K个用户对图书的评分,为当前用户生成推荐列表。图书推荐列表实现的关键伪代码如下:
//选择相似度最高的K个用户
List<String> similarUsers = new ArrayList<>();
for (int i = 0; i < numRecommendations; i++) {
if (i < sortedSimilarities.size()) {
similarUsers.add(sortedSimilarities.get(i).getKey());
} else {
break;
}
}
//获取相似用户喜欢的物品,并进行推荐
Map<String, Double> recommendations = new HashMap<>();
for (String user : similarUsers) {
Map<String, Double> ratings = userRatings.get(user);
for (String item : ratings.keySet()) {
if(userRatings.get(targetUser)!=null && !userRatings.get(targetUser).containsKey(item)) {
recommendations.put(item, ratings.get(item));
}
}
}
//排序推荐物品
LinkedHashMap<String,Double>sortedRecommendations=new LinkedHashMap<>(recommendations);
//取前N个推荐物品
int numItems = Math.min(numRecommendations, sortedRecommendations.size());
sortedRecommendations = sortedRecommendations.entrySet()
.stream().sorted((Map.Entry.<String, Double>comparingByValue().reversed())).limit(numItems)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
List<String> result = new ArrayList<String>();
result.addAll(sortedRecommendations.keySet());
System.out.println(result+"============================推荐集合");
return result;
}
根据用户评分数据推荐图书结果如图5-20所示。

图5-20图书推荐运行结果图
个性化图书推荐实现效果图如图5-21所示。

图5-21图书推荐实现图
6 系统测试
6.1 功能测试
本系统通过黑盒测试方法对图书推荐系统的稳定性、可靠性和安全性以及用户交互体验进行系统检验,确保系统是否达到开发预期标准。
(1)用户功能测试。用户功能测试如表6-1所示。
表6-1用户功能测试表
| 测试功能 | 测试描述 | 测试预期 | 测试结果 |
| 用户注册 | 输入正确的用户信息,并点击注册。 | 提示“注册成功”,并前往用户登录界面。 | 测试通过 |
| 用户信息未填完。 | 提示“xx不能为空”,注册不成功。 | ||
| 用户账号已有注册信息。 | 提示“注册用户已存在”,注册不成功。 | ||
| 用户登录 | 正确输入账号、密码。 | 登录成功,并正常跳转至首页。 | 测试通过 |
| 输入错误的账号、密码。 | 提示“账号或密码错误”。 | ||
| 更新个人信息 | 输入新的个人信息。 | 提示“更新成功”。 | 测试通过 |
| 修改密码 | 输入新的密码。 | 提示“修改密码成功”。 | 测试通过 |
| 个人中心 | 点击个人中心功能。 | 成功显示个人信息。 | 测试通过 |
| 收藏图书 | 点击“点我收藏”按钮。 | 提示“收藏成功”。 | 测试通过 |
| 我的收藏 | 点击我的收藏功能。 | 成功显示收藏记录。 | 测试通过 |
| 评分评论图书 | 选择星级并发表评论。 | 提示“评论成功”。 | 测试通过 |
| 赞踩图书 | 点击“赞一下”“踩一下”按钮。 | 提示“操作成功”。 | 测试通过 |
(2)图书借阅功能测试。图书借阅功能测试表如表6-2所示。
表6-2图书借阅功能测试表
| 测试功能 | 测试描述 | 测试预期 | 测试结果 |
| 图书借阅 | 在图书详情页面,点击“借阅”按钮,选择借阅次数并提交。 | 提示“操作成功”,并跳转至图书详情页面。 | 测试通过 |
| 在图书详情页面,点击“借阅”按钮,未选择借阅次数直接提交。 | 提示“借阅次数不能为空”,操作不成功。 |
(3)管理员功能测试。管理员功能测试如表6-3所示。
表6-3管理员功能测试表
| 测试功能 | 测试描述 | 测试预期 | 测试结果 |
| 管理员登录 | 输入准确的管理员信息,并点击登录。 | 成功跳转至管理员页面。 | 测试通过 |
| 用户管理 | 查看/修改/添加/删除/搜索用户。 | 成功查看/修改/添加/删除/搜索用户。 | 测试通过 |
| 图书信息管理 | 查看/修改/添加/删除/搜索图书。 | 成功查看/修改/添加/删除/搜索图书。 | 测试通过 |
| 图书借阅管理 | 查看/修改 /删除/搜索图书。 | 成功查看/修改 /删除/搜索图书。 | 测试通过 |
| 评分信息管理 | 查看/修改/删除/搜索评分记录。 | 成功查看/修改/删除/搜索评分记录。 | 测试通过 |
| 线上交流管理 | 查看/添加/修改 /删除/搜索帖子或评论。 | 成功查看/添加/修改 /删除/搜索帖子或评论。 | 测试通过 |
| 我的收藏管理 | 查看/搜索/删除收藏记录。 | 成功查看/搜索/删除收藏记录。 | 测试通过 |
(4)个性化图书推荐功能测试。个性化图书推荐功能测试如表6-4所示。
表6-4个性化图书推荐功能测试表
| 测试功能 | 测试描述 | 测试预期 | 测试结果 |
| 系统能够根据用户的评分记录生成推荐列表 | 1.选取一个已经注册并有历史评分记录的用户。 2.登录该用户的账户并进入推荐页面。 3.观察系统是否展示了图书推荐列表。 | 系统应该展示出图书推荐列表。 | 测试通过 |
| 系统能否准确推荐与用户过去评分高的图书相似的书 | 1.选取一个有特定阅读偏好且对某些书籍给出高评分的用户。 2.通过推荐系统获取该用户的推荐图书列表。 3.检查推荐列表中的图书是否与用户过去喜欢的书籍类似。 | 大部分推荐的书应与用户的历史喜好相匹配。 | 测试通过 |
| 系统是否为几乎没有或没有历史评分的新用户提供推荐 | 1. 使用新创建的用户账号登录系统。 2. 记录系统提供的初始推荐列表。 3. 让新用户对一些图书进行评分。 4.记录更新后的推荐列表并检查是否有更新。 | 新用户评分之后,推荐列表有更新。 | 测试通过 |
7 结论
7.1 总结
该论文首先详细探讨了研究课题的背景和意义,全面综述了图书推荐系统领域在国内外的研究进展,并清晰地明确了本研究的核心内容。通过研发基于协同过滤算法的图书推荐系统,该系统的核心功能较为全面,包括个性化图书推荐、用户反馈机制、图书借阅功能以及管理员后台管理。在技术上,该系统采用了先进的SpringBoot和Vue.js进行构建,实现了前后端分离的设计,显著提升了系统的可维护性和功能扩展性。在研究和实现过程中,通过深入探讨了协同过滤算法的应用,系统能够智能地根据用户的评分历史提供精准推荐。同时,用户反馈机制的引入,使得推荐结果能够持续优化,最终为每位用户生成高度个性化的图书推荐列表。
该图书推荐系统对于图书馆和广大读者而言,具有不可忽视的重要价值。它的引入不仅大幅度提高了图书的流通率和资源配置效率,还极大地丰富了读者的阅读选择,有效促进了读者与图书馆之间的交流与互动。更为长远的是,随着系统运行时间的增长,积累的数据将为文化研究和市场分析提供宝贵的参考,对文化传播和知识普及起到重要的推动作用。展望未来,随着技术的不断进步和数据的持续累积,该系统有望在未来发挥更为广泛和深远的影响,为图书馆服务的创新和提升贡献重要力量。
7.2 未来展望
随着人工智能和机器学习技术的不断发展,未来的图书推荐系统将更加注重个性化推荐,通过深度学习、自然语言处理和图像识别等技术实现更精准的个性化推荐。
(1)优化个性化推荐的实时性:由于推荐算法在计算速度和效率方面的限制,个性化推荐结果的更新尚未达到实时性。计划在未来的工作中,根据用户的最新行为和偏好对推荐系统进行优化,以确保推荐内容的时效性。
(2)优化个性化推荐精准度:当前系统的推荐方法仅考虑了用户的历史行为和图书的属性,推荐的精准度有待提高。考虑在未来的工作中引用混合推荐系统,结合基于用户和基于内容两种推荐方法。
(3)改善用户交互体验:当前的系统界面设计和交互方式欠佳尚需改进,考虑在未来的工作中优化用户界面设计和交互方式,以提供更流畅、美观的交互体验。
更多推荐



所有评论(0)