基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统

在大数据时代,数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取,Hive进行数据分析,ECharts进行数据可视化,以及基于协同过滤算法进行电影推荐。

目录
1、豆瓣电影数据爬取
2、hive数据分析
3、echarts数据可视化
4、基于系统过滤进行电影推荐

1. 豆瓣电影数据爬取

首先,我们使用Python爬取豆瓣电影的相关数据。爬取的数据包括电影名称、评分、评价人数、电影详情链接、图片链接、摘要和相关信息,然后将mysql数据存到mysql中。

import pymysql
from bs4 import BeautifulSoup
import re  # 正则表达式,进行文字匹配
import urllib.request, urllib.error  # 指定URL,获取网页数据
import xlwt  # 进行excel操作from data.mapper import savedata2mysqldef main():baseurl = "https://movie.douban.com/top250?start="datalist = getdata(baseurl)savedata2mysql(datalist)findLink = re.compile(r'<a href="(.*?)">')  # 正则表达式模式的匹配,影片详情
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让换行符包含在字符中,图片信息
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 影片片名
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 找到评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 找到评价人数 #\d表示数字
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 找到概况
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 找到影片的相关内容,如导演,演员等##获取网页数据
def getdata(baseurl):datalist = []for i in range(0, 10):url = baseurl + str(i * 25)  ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页html = geturl(url)soup = BeautifulSoup(html, "html.parser")  # 构建了一个BeautifulSoup类型的对象soup,是解析html的for item in soup.find_all("div", class_='item'):  ##find_all返回的是一个列表data = []  # 保存HTML中一部电影的所有信息item = str(item)  ##需要先转换为字符串findall才能进行搜索link = re.findall(findLink, item)[0]  ##findall返回的是列表,索引只将值赋值data.append(link)imgSrc = re.findall(findImgSrc, item)[0]data.append(imgSrc)titles = re.findall(findTitle, item)  ##有的影片只有一个中文名,有的有中文和英文if (len(titles) == 2):onetitle = titles[0]data.append(onetitle)twotitle = titles[1].replace("/", "")  # 去掉无关的符号data.append(twotitle)else:data.append(titles)data.append(" ")  ##将下一个值空出来rating = re.findall(findRating, item)[0]  # 添加评分data.append(rating)judgeNum = re.findall(findJudge, item)[0]  # 添加评价人数data.append(judgeNum)inq = re.findall(findInq, item)  # 添加概述if len(inq) != 0:inq = inq[0].replace("。", "")data.append(inq)else:data.append(" ")bd = re.findall(findBd, item)[0]bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)bd = re.sub('/', " ", bd)data.append(bd.strip())  # 去掉前后的空格datalist.append(data)return datalistdef geturl(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}req = urllib.request.Request(url, headers=head)try:  ##异常检测response = urllib.request.urlopen(req)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):  ##如果错误中有这个属性的话print(e.code)if hasattr(e, "reason"):print(e.reason)return html

在这里插入图片描述

2. 数据分析

接下来,我们将爬取的数据导入Hive进行分析。Hive是一个基于Hadoop的数据仓库工具,提供了类SQL的查询功能。

导入数据到Hive
首先,将数据上传到HDFS(Hadoop分布式文件系统):

hdfs dfs -put douban_movies.csv /user/hive/warehouse/douban_movies.csv

在Hive中创建一个表并导入数据:

CREATE TABLE douban_movies (title STRING,rating FLOAT,review_count INT,link STRING,image STRING,summary STRING,info STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
LOAD DATA INPATH '/user/hive/warehouse/douban_movies.csv' INTO TABLE douban_movies;

数据分析

SELECT rating, COUNT(*) AS movie_count
FROM douban_movies
GROUP BY rating
ORDER BY rating DESC;
select chinese_name,rating 
from douban_movies order 
by rating desc limit 20 
select chinese_name,review_count 
from douban_movies 
order by review_count desc limit 20 
SELECT type,COUNT(*) AS movie_countFROM (SELECT CASEWHEN related_info LIKE '%犯罪%' THEN '犯罪'WHEN related_info LIKE '%剧情%' THEN '剧情'WHEN related_info LIKE '%爱情%' THEN '爱情'WHEN related_info LIKE '%同性%' THEN '同性'WHEN related_info LIKE '%喜剧%' THEN '喜剧'WHEN related_info LIKE '%动画%' THEN '动画'WHEN related_info LIKE '%奇幻%' THEN '奇幻'WHEN related_info LIKE '%冒险%' THEN '冒险'ELSE '其他'END AS typeFROM douban_movies) AS subqueryGROUP BY typeORDER BY movie_count DESC;
SELECT year,COUNT(*) AS movie_countFROM (SELECT REGEXP_SUBSTR(related_info, '[[:digit:]]{4}') AS yearFROM douban_movies) AS subqueryWHERE year IS NOT NULL GROUP BY yearORDER BY year desc limit 20;
SELECT CASE WHEN related_info LIKE '%美国%' THEN '美国'WHEN related_info LIKE '%中国%' THEN '中国'WHEN related_info LIKE '%中国大陆%' THEN '中国'WHEN related_info LIKE '%中国香港%' THEN '中国香港'WHEN related_info LIKE '%法国%' THEN '法国'WHEN related_info LIKE '%日本%' THEN '日本'WHEN related_info LIKE '%英国%' THEN '英国'WHEN related_info LIKE '%德国%' THEN '德国'ELSE '其他'END AS country,COUNT(*) AS movie_countFROM douban_moviesGROUP BY country;

3. 数据可视化

为了更直观地展示数据分析结果,我们使用ECharts进行数据可视化。ECharts是一个基于JavaScript的数据可视化库,同时使用django框架查询mysql数据返回给前端。
前端代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Data Analysis</title><!-- 引入 Pyecharts 的依赖库 -->{{ chart_html | safe }}<style>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {text-align: center;}</style>
</head>
<body><div class="container"><h2>{{ button_name }}</h2><!-- 其他页面内容... -->
</div></body>
</html>

后端代码

def data_analysis(request, button_id):if button_id == 1:x,y = top20_movie_rating()line_chart = (Line().add_xaxis(xaxis_data=x).add_yaxis(series_name="电影评分", y_axis=y).set_global_opts(title_opts=opts.TitleOpts(title="电影评分top20")))chart_html = line_chart.render_embed()button_name = "折线图"elif button_id == 2:x,y = movie_review_count()bar_chart = (Bar().add_xaxis(xaxis_data=x).add_yaxis(series_name="电影评论数",y_axis=y).set_global_opts(title_opts=opts.TitleOpts(title="电影评论数top20")))chart_html = bar_chart.render_embed()button_name = "条形图"elif button_id == 3:chart_html = wordcloud_to_html()button_name = "词云图"elif button_id == 4:x, y = movie_type_count()pie = Pie()pie.add("", list(zip(x, y)))pie.set_global_opts(title_opts={"text": "电影类型统计分析", "subtext": "年份"},legend_opts=opts.LegendOpts(orient="vertical", pos_right="right", pos_top="center"))chart_html = pie.render_embed()button_name = "饼图"elif button_id == 5:x,y=movie_year_count()# 创建饼图pie = (Pie(init_opts=opts.InitOpts(width="800px", height="600px")).add(series_name="不同年份的电影数量分析",data_pair=list(zip(x, y)),radius=["40%", "75%"],  # 设置内外半径,实现空心效果label_opts=opts.LabelOpts(is_show=True, position="inside"),).set_global_opts(title_opts=opts.TitleOpts(title="不同年份的电影数量分析"),legend_opts=opts.LegendOpts(orient="vertical", pos_right="right", pos_top="center"),).set_series_opts(  # 设置系列选项,调整 is_show 阈值label_opts=opts.LabelOpts(is_show=True)))chart_html = pie.render_embed()button_name = "饼图"elif button_id == 6:x, y = movie_count_count()bar_chart = (Bar().add_xaxis(xaxis_data=x).add_yaxis(series_name="电影数量", y_axis=y).set_global_opts(title_opts=opts.TitleOpts(title="不同国家的电影数量分析")))chart_html = bar_chart.render_embed()button_name = "条形图"elif button_id == 0:return redirect('movie_recommendation')return render(request, 'data_analysis.html', {'chart_html': chart_html, 'button_name': button_name})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 电影推荐

最后,我们基于协同过滤算法进行电影推荐。协同过滤是推荐系统中常用的一种算法,通过用户的行为数据(如评分、点击等)来预测用户可能感兴趣的项目。

这里我们使用 sklearn 库来实现协同过滤推荐系统。

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import mysql.connector# 数据库连接参数
db_config = {'user': 'root','password': '12345678','host': '127.0.0.1','database': 'mydb'
}# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()# 读取电影数据
query = "SELECT id, foreign_name, chinese_name, rating, review_count, summary, related_info FROM douban_movies"
movies_df = pd.read_sql(query, conn)# 处理文本特征:电影外文名、简介、相关信息
tfidf_vectorizer = TfidfVectorizer(stop_words='english')# 外文名的TF-IDF向量
foreign_name_tfidf = tfidf_vectorizer.fit_transform(movies_df['foreign_name'].fillna(''))# 简介的TF-IDF向量
summary_tfidf = tfidf_vectorizer.fit_transform(movies_df['summary'].fillna(''))# 相关信息的TF-IDF向量
related_info_tfidf = tfidf_vectorizer.fit_transform(movies_df['related_info'].fillna(''))# 数值特征:评分和评论数
scaler = StandardScaler()rating_scaled = scaler.fit_transform(movies_df[['rating']].fillna(0))
review_count_scaled = scaler.fit_transform(movies_df[['review_count']].fillna(0))# 合并所有特征
features = np.hstack([foreign_name_tfidf.toarray(),summary_tfidf.toarray(),related_info_tfidf.toarray(),rating_scaled,review_count_scaled
])# 计算电影之间的余弦相似度
cosine_sim = cosine_similarity(features)# 将相似度矩阵转换为DataFrame
cosine_sim_df = pd.DataFrame(cosine_sim, index=movies_df['id'], columns=movies_df['id'])# 将相似度结果存储到数据库
similarities = []
for movie_id in cosine_sim_df.index:similar_movies = cosine_sim_df.loc[movie_id].sort_values(ascending=False).index[1:6]  # 取前5个相似的电影for similar_movie_id in similar_movies:similarity = cosine_sim_df.loc[movie_id, similar_movie_id]similarities.append((int(movie_id), int(similar_movie_id), float(similarity)))print(similarities)
# 插入相似度数据到数据库
insert_query = """
INSERT INTO movie_similarities (movie_id, similar_movie_id, similarity)
VALUES (%s, %s, %s)
"""
cursor.executemany(insert_query, similarities)
conn.commit()# 关闭连接
cursor.close()
conn.close()

在这里插入图片描述

总结

通过本文,我们展示了如何使用Python进行数据爬取,如何将数据导入Hive进行分析,如何使用ECharts进行数据可视化,以及如何使用协同过滤算法进行电影推荐。这个流程展示了从数据采集、数据分析到数据可视化和推荐系统的完整数据处理流程。

如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于MapReduce, MySQL, python,java,大数据,模型训练等。 hadoop hdfs yarn spark Django flask flink kafka flume datax sqoop seatunnel echart可视化 机器学习等
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SuperMap GIS基础产品FAQ集锦(20240701)

一、SuperMap iDesktopX 问题1&#xff1a;对于数据提供方提供的osgb格式的数据&#xff0c;如何只让他生成一个s3mb文件呢&#xff1f;我用倾斜入库的方式会生成好多个s3mb缓存文件 11.1.1 【解决办法】不能控制入库后只生成一个s3mb文件&#xff1b;可以在倾斜入库的时候设…

2024第17届中国西部(重庆)留学移民海外置业展览会

2024第17届中国西部&#xff08;重庆&#xff09;留学移民海外置业展览会 邀请函 主办单位&#xff1a; 中国西部教体医融合博览会组委会 承办单位&#xff1a;重庆中博展览有限公司 展会背景&#xff1a; 成都和重庆是中国新一线城市&#xff0c;是西部经济的核心增长极&a…

代码随想录算法训练营第59天:动态[1]

代码随想录算法训练营第59天&#xff1a;动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: …

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

Java案例抢红包

目录 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#xff08;遇见问题先想出完整的思路逻辑再去动手事半功倍&#xff09; 三&#xff1a;具体代码&#xff1a; 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#x…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了&#xff0c;这里不在熬述&#xff0c;它在LLM分析中&#xff0c;尤其是在语义相似度的计算中至关重要&#xff0c;在dot attention机制中&#xff0c;也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

JS(JavaScript)的BOM操作

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

一文汇总VSCode多光标用法

光标的创建 按住alt&#xff0c;鼠标左键单击&#xff0c;在单击位置生成光标/删除光标 按住ctrlalt&#xff0c;单击↑/↓&#xff0c;在每行同一个位置&#xff08;若某一行较短&#xff0c;则在行尾&#xff09;生成光标&#xff0c;这个不会删除光标&#xff0c;只会在光标…

Day61 代码随想录打卡|回溯算法篇---组合优化

本篇是针对上一题的优化&#xff0c;因为在计算所有可能的组合结果时&#xff0c;不是每一条路径都是我们需要遍历的&#xff0c;如图&#xff0c;当n和k都为4的时候&#xff0c;其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边&#xf…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程)&#xff0c;也与go函数相对应。作为编程人员&#xff0c;我们只是使用go语句向Go的运行时系统提交一个并发任务&#xff0c;而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

美德政府转移比特币、以太坊引发市场下跌

小编通过链上地址监控&#xff0c;令人意外的发现德国和美国政府都进行了大规模的数字货币转移&#xff0c;转移了价值 1.5 亿美元的比特币和以太坊。这些大额转移势必引起了数字货币市场分析师和投资者的关注。 BTC价格 从今年起德国政府已转移了其持有的相当一部分比特币&…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

玩Stable Diffusion不可不知的5款真人模型!大佬都在用!(附模型包)

模型对于AI绘画起决定性作用&#xff0c;今天推荐5款超好用的Stable Diffusion模型。 这些模型都在市面上收获了各种好评&#xff0c;而且各具特色&#xff0c;能满足你对写实人像的各种要求。 1、MajicMIX realisric 麦橘写实 写实系的人像大模型&#xff0c;具有非常好的质…

数据结构笔记第3篇:双向链表

1、双向链表的结构 注意&#xff1a;这里的 "带头" 跟前面我们说的 "头结点" 是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头结点。 带头链表里的头结点&#xff0c;实际为 "哨兵…

勒索病毒--认知与防范

免责声明:本文仅做技术交流与学习... 目录 应急响应-勒索病毒 1、什么是勒索病毒&#xff1f; 勒索病毒是一种新型电脑病毒&#xff0c;主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大&#xff0c;一旦感染将给用户带来无法估量的损失。…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这篇文章带大家…

C++编程(七)继承

文章目录 一、继承&#xff08;一&#xff09;概念&#xff08;二&#xff09;语法格式&#xff08;三&#xff09;通过子类访问父类中的成员1. 类内2. 类外 &#xff08;四&#xff09;继承中的特殊成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值函数 二、多重继承…

怎样把热门抖音短视频下载保存到手机相册?

怎样把热门抖音短视频下载保存到手机相册? 1、在手机上打开抖音短视频APP&#xff1b; 2、打开后搜索或找到要下载保存的抖音短视频&#xff1b; 3、打开短视频后&#xff0c;点击右则的分享&#xff0c;并滑动找到保存到相册&#xff1b; 4、点击后等待完成下载&#xff0c;…

Python实现接糖果小游戏

介绍: 基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果&#xff0c;接住糖果会增加得分。 代码: import pygame import random import os# 初始化pygame和设置屏幕大小 pygame.init() screen_width, screen_height 800, 6…

海康视频播放,包含h5和web插件

自行下载 海康开放平台 demo 都写得很清楚&#xff0c;不多描述 1.视频web插件 vue2写法&#xff0c;公共vue文件写法&#xff0c;调用文件即可 开始时需要以下配置&#xff0c;不知道的找对接平台数据的人&#xff0c;必须要&#xff0c;否则播不了 getParameterData: {po…