Python电影推荐系统

Python实现基于皮尔森系数的协同过滤电影推荐。

  1. 爬虫获取用户数据
# -*- coding: utf-8 -*-
"""
爬取豆瓣某影视的评分前100个用户,将他们的影评信息抓取下来作为movie.json
为了保证数据的可靠性,选择豆瓣电影top250 No.1的【肖申克的救赎】,热门影评的前100人作为数据
"""from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import json
import urllib
import requestspeople_names = []
people_urls = []
# 创建一个正则表达式匹配对象
r = re.compile(r'e/(.+)/')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/74.0.3724.8 Safari/537.36','Referer': 'https://movie.douban.com/subject/26100958/comments','Connection': 'keep-alive'}print("爬取用户中 ...")# 5*20 = 100个用户,若需要修改用户数量,更改外层循环。
for i in range(0, 10):url = ("https://movie.douban.com/subject/27010768/comments?""start=" + str(i * 20) + "&limit=20&sort=new_score&status=P&percent_type=")req = urllib.request.Request(url=url, headers=headers)data = urllib.request.urlopen(req).read().decode('utf-8')# data = requests.get(url,headers=headers)bs = BeautifulSoup(data, 'html.parser')comments = bs.findAll("div", {"class": "comment"})# 将用户主页存储在people_url中for comment in comments:people_url = comment.findAll("a")[1].attrs["href"].replace("www", "movie")name = re.findall(r, people_url)[0]people_names.append(name)people_urls.append(people_url)print("爬取用户完成")final_data = {}
for i in range(0, len(people_names)):final_data.setdefault(people_names[i], {})final_data[people_names[i]]["people_url"] = people_urls[i]print("爬取用户影评中...")user_count = 1
for people_name in final_data:print("正在爬取第" + str(user_count) + "位用户" + people_name + "的影评信息")user_count += 1# 爬取该用户前90条影评for i in range(0, 6):# 获取影评后缀comment_url_suffix = ("collect?start=" + str(i * 15) + "&sort=time&rating=all""&filter=all&mode=grid")comment_url = final_data[people_name]["people_url"] + comment_url_suffixreq = urllib.request.Request(url=comment_url, headers=headers)comment_data = urllib.request.urlopen(req).read().decode('utf-8')bs = BeautifulSoup(comment_data, 'html.parser')infos = bs.find("div", {"class": "grid-view"}).findAll("div", {"class": "info"})for info in infos:movie_name = info.em.get_text()  # 从em标签提取try:movie_rate = re.search("[0-9]", info.findAll("li")[2].span.attrs["class"][0]).group()except:continuetry:movie_comment = info.find("span", {"class": "comment"}).get_text()except:movie_comment = ""final_data[people_name].setdefault("movies", {})final_data[people_name]["movies"].setdefault(movie_name, {})final_data[people_name]["movies"][movie_name]["movie_rate"] = movie_ratefinal_data[people_name]["movies"][movie_name]["movie_comment"] = movie_commentprint("爬取用户影评完成")file = open('movie_data.json', 'w', encoding='utf-8')
json.dump(final_data, file, ensure_ascii=False)
file.close()
file = open('movie_data.json', 'r', encoding='utf-8')
s = json.load(file)
file.close()
  1. 爬虫获取待推荐用户数据(默认自己):
# -*- coding: utf-8 -*-
"""
获取本人豆瓣影评信息,通过此信息分析个人喜好,寻找与我品味相似的用户
最后将本人的喜好也放入json文件中
"""import json
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import urllibheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/74.0.3724.8 Safari/537.36','Referer': 'https://movie.douban.com/subject/26100958/comments','Connection': 'keep-alive'}
file = open('movie_data.json', 'r', encoding='utf-8')
movie_data = json.load(file)  
file.close()# 这里填你的豆瓣上面的id
people_name = "204331023"
url = "https://movie.douban.com/people/"+people_name+"/"
movie_data.setdefault(people_name, {})
movie_data[people_name]["people_url"] = urlfor i in range(0, 6):comment_url_suffix = ("collect?start="+str(i*15)+"&sort=time&rating=all""&filter=all&mode=grid")comment_url = movie_data[people_name]["people_url"]+comment_url_suffixreq = urllib.request.Request(url=comment_url, headers=headers)comment_data = urllib.request.urlopen(req).read().decode('utf-8')bs = BeautifulSoup(comment_data, 'html.parser')infos = bs.find("div", {"class": "grid-view"}).findAll("div", {"class": "info"})for info in infos:movie_name = info.em.get_text()try:movie_rate = re.search("[0-9]", info.findAll("li")[2].span.attrs["class"][0]).group()except:continuetry:movie_comment = info.find("span", {"class": "comment"}).get_text()except:movie_comment = ""movie_data[people_name].setdefault("movies", {})movie_data[people_name]["movies"].setdefault(movie_name, {})movie_data[people_name]["movies"][movie_name]["movie_rate"] = movie_ratemovie_data[people_name]["movies"][movie_name]["movie_comment"] = movie_commentfile = open('movie_data.json', 'w', encoding='utf-8')
json.dump(movie_data, file, ensure_ascii=False)
file.close() 
  1. 实现电影推荐
# -*- coding: utf-8 -*-
"""
根据皮尔森系数,找出与我相似的用户,再找这些用户最喜欢的电影
推荐20部我可能喜欢的电影
"""import json
from math import sqrtfile = open('movie_data1.json', 'r', encoding='utf-8')
movie_data = json.load(file)
file.close()
# 这里填豆瓣id
my_name = "204331023"# 返回p1和p2的皮尔逊相关系数,即两个人品味的相似度
def sim_pearson(data, p1, p2):"""计算皮尔森相似度:param data: 爬取的用户影评数据:param p1: 用户1:param p2: 用户2:return: 返回相似度"""si = {}for item in data[p1]["movies"]:if item in data[p2]["movies"]:si[item] = 1# 没有共同影评,返回0if len(si) == 0:return 0# 根据公式计算皮尔森系数n = len(si)sum1 = sum([int(data[p1]["movies"][it]["movie_rate"]) for it in si])sum2 = sum([int(data[p2]["movies"][it]["movie_rate"]) for it in si])sim1_sq = sum([pow(int(data[p1]["movies"][it]["movie_rate"]), 2) for it in si])sim2_sq = sum([pow(int(data[p2]["movies"][it]["movie_rate"]), 2) for it in si])p_sum = sum([int(data[p1]["movies"][it]["movie_rate"]) * int(data[p2]["movies"][it]["movie_rate"]) for it in si])# 计算皮尔森系数 Rnum = p_sum - (sum1 * sum2 / n)den = sqrt((sim1_sq - pow(sum1, 2) / n) * (sim2_sq - pow(sum2, 2) / n))if den == 0:return 0r = num / denreturn rdef top_matches(data, person, similarity=sim_pearson):"""找到5个相似度最高的用户:param data: 爬取的数据:param person: 用户本人:param n: 前n个最相似的用户:param similarity: 皮尔森相关系数:return: """sorted_data = {person: data[person]}min_sim = 0.5for other in data:if other == person:continueif similarity(data, person, other) >= min_sim:sorted_data[other] = data[other]print(other, sorted_data[other])return sorted_datadef get_recommendations(data1, person, n=5, similarity=sim_pearson):"""获取推荐结果:param data: 电影评分数据:param person: 待推荐用户名称:param n: 推荐条目:param similarity: 皮尔森相似度:return: 返回电影数据"""totals = {}sim_sum = {}data = top_matches(data1, person)# data = data1for other in data:if other == person:  # 计算除自己以外的相似度continuesim = similarity(data, person, other)print(sim)# 将等于0或更小的项目去掉if sim <= 0:continuefor item in data[other]["movies"]:# 仅找出我未看过的电影if item not in data[person]["movies"] or data[person]["movies"][item] == 0:# Similarity * Score 相似度乘评分totals.setdefault(item, 0)totals[item] += int(data[other]["movies"][item]["movie_rate"]) * sim# Sum of similarities 总相似度sim_sum.setdefault(item, 0)sim_sum[item] += sim# print(totals)# print(sim_sum)# 创建评分列表rankings = [(total / sim_sum[item], item) for item, total in totals.items()]# 将rating排序并返回rankings.sort()rankings.reverse()# print(rankings)return rankings[0:n]if __name__ == '__main__':# 打印推荐结果for res in get_recommendations(movie_data, my_name, n=5):print(res)

使用过程中,逐一运行三个文件即可。

运行结果:

在这里插入图片描述

参考: https://blog.csdn.net/XYYxyy55/article/details/80487007

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

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

相关文章

基于python的电影推荐系统

摘 要 本论文主要论述了如何使用Django框架开发一个电影推荐系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述电影推荐系统的当前背景以及系统开发的目的&a…

chatgpt赋能python:让Python帮你推荐电影:使用Python电影推荐算法

让Python帮你推荐电影&#xff1a;使用Python电影推荐算法 在当今互联网日益发展的世界里&#xff0c;我们的生活变得越来越数字化&#xff0c;并且受到大数据的驱动。而在这样的时代&#xff0c;我们每天都被不同数量和类型的内容包围着&#xff0c;包括电影和电视节目等。如…

生活小剧场30天吸粉44w,小红书最受欢迎的笔记长这样

前有劳动节等宣传节点&#xff0c;后有618大促&#xff0c;承上启下的5月里&#xff0c;小红书上的达人和品牌都是如何实现内容种草的呢&#xff1f; 为洞察平台的品牌营销策略及内容趋势&#xff0c;新红推出5月月度榜单&#xff0c;从品牌投放、内容创作等方面入手&#xff0…

pgAdmin怎么转换成中文界面

点击File下拉选项&#xff0c;点击Preferences选项&#xff0c;打开Preferences对话框。点击对话框中Miscellaneous下拉选项&#xff0c;点击User language。在右侧的User language下拉选择框中选择Chinese(Simplicied)中文简体&#xff0c;点击Save即可。若没有变换成中文建议…

只需几步打造属于自己的私有聊天系统

为什么选择私有化产品 在微信、QQ等聊天工具统治的时代&#xff0c;即时通讯工具早已成为人们沟通的一大重要途径&#xff0c;每个人对自己的隐私问题越来越关注&#xff0c;不只是个人&#xff0c;企业也不例外。 聊天过程中产生的聊天记录、传送的文件存在一定的泄露风险。 …

私聊模式的设计与实现

文章目录 1 私聊模式的设计与实现1.1 设计分析1.2 代码实现 1 私聊模式的设计与实现 1.1 设计分析 私聊模式&#xff1a; 用户在聊天时能够指定消息的接收者。 对聊天界面进行如下改动&#xff1a; 简单的看一下Qt中的列表类QListWidget&#xff1a; 我们需要增加USER消息…

web聊天室实现

后端&#xff1a; package com.jsx.chat;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose; imp…

网上聊天室开发思路

网上聊天室设计思路 平时经常性的使用聊天软件如QQ&#xff0c;微信&#xff0c;或是游戏里各个区的公共频道&#xff0c;于是突发奇想&#xff0c;想要自己搞一个简易版聊天项目&#xff0c;所以现在开搞起来。 需求分析 1.想要进行聊天&#xff0c;势必需要有人才能聊起来&…

教你从零开始用WebSocket打造一个IM聊天室

之前我们在 IM即时聊天室&#xff08;一&#xff09;&#xff1a;WebSocket 和 IM即时聊天室&#xff08;二&#xff09;: Socket.io Node.js 两篇文章中介绍了搭建一个IM的所需的技术栈和通信原理。那在这篇文章里我们就来详细说一下具体的应用并提供完整源码。 个人Blog地址…

Thinkphp 使用Workerman 聊天室

1、下载Workerman插件 composer require topthink/think-worker 2、示例代码 后端 2.1 下载之后会得到这俩个文件 2.2 这个文件对应上面的worker_class 的地址 2.3.worker.php示例代码 <?php namespace app\http; use think\facade\Db; use think\worker\Server; use Wo…

仿微信的网络聊天室项目开发【完整源码讲解】

目录 总体开发思路 服务器端 服务器界面设计 建立TCP服务器端通信 建立服务器消息发送输出流 建立服务器消息接收输入流 建立服务器实时消息通信线程 设置服务器通信自由断开 客户端 客户端界面设计 建立TCP客户端通信 建立客户端消息发出输出流 建立客户端消息接…

手把手教你React Native接入聊天IM即时通讯功能-源码分享

本文介绍如何基于React Native使用 IM即时通讯SDK- ZIM SDK 快速实现同腾讯微信消息收发聊天交友功能。实现React Native混合移动框架开发多端应用&#xff0c;节省开发成本。 1 IM即时通讯SDK接入方案介绍 ZIM SDK IM即时通讯SDK提供了如下接入方案&#xff1a; 在此方案中…

(附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR)

参考文章 搭建文章 gitte源码 在线体验 可以注册两个号来测试 演示图&#xff1a; 一. 整体介绍 介绍SignalR一种通讯模型Hub(中心模型&#xff0c;或者叫集线器模型)&#xff0c;调用这个模型写好的方法&#xff0c;去发送消息。 内容有&#xff1a; ①&#xff1a;Hub模型…

A股全市场股票历史行情Level2快照高频数据

A股全市场股票Level2快照高频数据(2010年开始) 快照行情又称切片(snapshot)行情&#xff0c;如其名&#xff0c;是对tick行情数据的某一个时刻的切片数据。例如现在常见的期货500ms一笔的行情&#xff0c;就是每500ms&#xff0c;在这时间段内的最高价、最低价、成交量等汇总成…

数据分析之数据可视化

数据可视化主要借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。通过图表使冗长的数据表达更加形象化&#xff0c;可以把问题的重点有效传递给观者。 一 看懂不同类型的图表 在实现数据可视化之前&#xff0c;我们首先要了解有哪些图表类型&#xff0c;常见的图表可参…

高大上的数据可视化图表,只需6步就能完成

一份高质量的数据可视化图表&#xff0c;能够让你清晰、全面地传达出数据信息&#xff0c;成为你工作、学习、竞赛的助推器&#xff01; 因此&#xff0c;一款功能强大的可视化软件显得尤为重要&#xff01; 最近博主在用的百度 Sugar BI&#xff0c;里面的海量图表模板可以帮…

超级干货:手把手教你如何实现数据可视化

目录&#xff1a; 一、引言二、数据可视化1、数据可视化是什么&#xff1f;2、数据可视化的目的3、使用场景4、数据可视化工具5、ECharts 可视化工具1、什么是ECharts2、如何使用&#xff08;1&#xff09;下载&#xff08;2&#xff09;引入ECharts&#xff08;3&#xff09;使…

数据可视化就应该这么做!

整理&#xff1a;微信公众号5WPuss 今天分享一篇关于数据可视化设计的好文 前排提示&#xff0c;文末送2本Pandas相关的好书~ 在如今的工作中&#xff08;尤其是 B 端&#xff09;越来越多的会开始出现数据可视化的身影&#xff0c;对于一部分小伙伴来说这个概念是较为陌生的&a…

超级干货 :手把手教数据可视化工具Tableau

前言 数据的世界正在发生急剧变化&#xff0c;任何人都应该访问自己需要的数据&#xff0c;并具备获取任何数据的洞察力&#xff0c;而tableau正是帮我们洞察数据的好帮手。 Tableau作为BI tool leader ( 2016 Gartner BI chart), 它不仅是一款可视化软件&#xff0c;还具备不可…

阿里巴巴开源的免费数据库工具Chat2DB

Chat2DB 是一款由阿里巴巴开源的免费数据库工具&#xff0c;它为开发人员提供了一个强大且易于使用的平台&#xff0c;用于存储和查询数据。与传统的数据库工具相比&#xff0c;Chat2DB 具有以下特点和优势&#xff1a; 多数据库支持&#xff1a;Chat2DB 可以与多种类型的数据库…