基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(二)

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据爬取及处理
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

前段时间,博主分享过关于一篇使用协同过滤算法进行智能电影推荐系统的博文《基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集》,有读者反映该项目有点复杂,于是我决定再给大家分享个使用html" title=机器学习>机器学习算法简单实现电影推荐的项目。

本项目基于Movielens数据集,采用协同过滤、矩阵分解以及建立LDA主题模型等html" title=机器学习>机器学习算法,旨在设计和训练一个合适的智能电影推荐模型。最终的目标是根据电影的相似性以及用户的历史行为,生成一个个性化的电影推荐列表,从而实现网站为用户提供精准电影推荐的功能。

首先,项目收集了Movielens数据集,其中包含了大量用户对电影的评分和评论。这个数据集提供了有关用户和电影之间互动的信息,是推荐系统的核心数据。

然后,项目使用协同过滤算法,这可以是基于用户的协同过滤(User-Based Collaborative Filtering)或基于item的协同过滤(Item-Based Collaborative Filtering)。这些算法分析用户之间的相似性或电影之间的相似性,以提供个性化推荐。

此外,矩阵分解技术也被应用,用于分解用户-电影交互矩阵,以发现潜在的用户和电影特征。这些特征可以用于更准确地进行推荐。

另外,项目还使用了LDA主题模型,以理解电影的主题和用户的兴趣。这有助于更深入地理解电影和用户之间的关联。

最终,根据电影的相似性和用户的历史行为,系统生成了一个个性化的电影推荐列表。这个列表可以根据用户的兴趣和偏好提供电影推荐,从而提高用户体验。

总结来说,这个项目结合了协同过滤、矩阵分解和主题建模等技术,以实现一个个性化电影推荐系统。这种系统有助于提高用户在网站上的互动和满意度,同时也有助于电影网站提供更精准的内容推荐。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 环境、Pycharm 环境及数据库环境。

详见博客。

模块实现

本项目包括5个模块:数据爬取及处理、模型训练及保存、接口实现、收集数据、界面设计。下面分别介绍各模块的功能及相关代码。

1. 数据爬取及处理

在Python环境下执行命令,生成数据库表。

html" title=python>python">html" title=python>python  manage.py makemigrations
html" title=python>python  manage.py migrate --run-syncdb

安装所需第三方库。

html" title=python>python">html" title=python>python -m pip install -r requirement.txt

数据来源:爬取Movielens上相关电影数据、简介及评分。也可以直接从下面网址进行下载:数据集网站地址为http://files.grouplens.org/datasets/movielens/ml-1m-README.txt

html" title=python>python">html" title=python>python populate_ratings.py
html" title=python>python populate_movie.py
html" title=python>python populate_movie_description.py
html" title=python>python populate_ratings.py

相关代码如下:

html" title=python>python">#导入需要的库
import os
import urllib.request
import html" title=django>django
import datetime
import decimal
from tqdm import tqdm
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Recs.settings')
html" title=django>django.setup()
from Analytics.models import Rating
#插入评分记录
defcreate_rating(user_id,content_id,rating,timestamp):ating=Rating(user_id=user_id,movie_id=content_id,rating=decimal.Decimal(rating),        rating_timestamp=datetime.datetime.fromtimestamp(float(timestamp)))
    rating.save()
    return rating
#爬取评分记录
def download_ratings():
    URL= 'https://raw.githubusercontent.com/sidooms/MovieTweetings/master/latest/ratings.dat'
    response = urllib.request.urlopen(URL)
    data = response.read()
    print('download finished')
    return data.decode('utf-8')
#删除已有的评分数据
def delete_db():
    print('truncate db')
    Rating.objects.all().delete()
    print('finished truncate db')
def populate():
    delete_db()
    ratings = download_ratings()
    for rating in tqdm(ratings.split(sep="\n")):
        r = rating.split(sep="::")
        if len(r) == 4:
            create_rating(r[0], r[1], r[2], r[3])
if __name__ == '__main__':
    print("Starting MovieRecs Population script...")
    populate()
#html" title=python>python populate_movie.py相关代码
#导入需要的库
import os
import urllib.request
from tqdm import tqdm
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Recs.settings')
import html" title=django>django
html" title=django>django.setup()
from Movies.models import Movie, Genre
#创建每一条电影数据并保存
def create_movie(movie_id, title, genres):
    movie = Movie.objects.get_or_create(movie_id=movie_id)[0]
    title_and_year = title.split(sep="(")
    movie.title = title_and_year[0]
    movie.year = title_and_year[1][:-1]
    if genres:
        for genre in genres.split(sep="|"):
            g = Genre.objects.get_or_create(name=genre)[0]
            movie.genres.add(g)
            g.save()
    movie.save()
    return movie
#爬取电影数据
def download_movies(URL='https://raw.githubusercontent.com/sidooms/MovieTweetings/master/latest/movies.dat'):  #下载电影数据
    response = urllib.request.urlopen(URL)
    data = response.read()
    return data.decode('utf-8')
#如果之前存在数据则先删除
def delete_db():
    print('truncate db')
    movie_count = Movie.objects.all().count()
    if movie_count > 1:
        Movie.objects.all().delete()
        Genre.objects.all().delete()
    print('finished truncate db')
def populate():  
    movies = download_movies()
    if len(movies) == 0:
        print('The latest dataset seems to be empty. Older movie list downloaded.')
        print('Please have a look at https://github.com/sidooms/MovieTweetings/issues and see if there is an issue')
        movies = download_movies(
'https://raw.githubusercontent.com/sidooms/MovieTweetings/master/snapshots/100K/movies.dat')
    print('movie data downloaded')
    for movie in tqdm(movies.split(sep='\n')):
        m = movie.split(sep="::")
        if len(m) == 3:
            create_movie(m[0], m[1], m[2])
if __name__ == '__main__':
    print("Starting MovieGeeks Population script...")
    delete_db()
    populate()
#html" title=python>python populate_movie_description.py相关代码
#导入需要的库
import os
import html" title=django>django
import json
import pandas as pd
import requests
from tqdm import tqdm
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Recs.settings')
html" title=django>django.setup()
from Recommender.models import MovieDecriptions
#获取电影数据并保存
from Analytics.models import Rating
def get_descriptions_with_movieid(movie_id):
    url = "https://api.themoviedb.org/3/find/tt{}?external_source=imdb_id&api_key={}"
    api_key = get_api_key()
    format_url = url.format(movie_id, api_key)
    r = requests.get(format_url)
    for film in r.json()['movie_results']:
        md = MovieDecriptions.objects.get_or_create(movie_id=movie_id)[0]
#保存电影名
        md.imdb_id = movie_id
        if 'title' in film:
            md.title = film['title']
#保存电影简介
        if 'overview' in film:
            md.description = film['overview']
#保存电影类型
        if 'genre_ids' in film:
            md.genres = film['genre_ids']
        if len(md.description) > 0:
            md.save()
            # print("{}: {}".format(movie_id, r.json()))
#如果之前存在数据则先删除
def delete_db():
    print('truncate db')
    MovieDecriptions.objects.all().delete()
    print('finished truncate db')
def get_api_key():  #获取API的KEY
    cred = json.loads(open(".prs").read())
    return cred['themoviedb_apikey']
#加载评分数据
def load_all_ratings():
    #提取相关列的数据
    columns = ['movie_id']
    ratings_data = Rating.objects.all().values(*columns)
    movie_ids = pd.DataFrame.from_records(ratings_data, columns=columns)
    movie_ids = movie_ids.drop_duplicates(subset=None, keep='first', inplace=False)
    movie_ids = movie_ids.reset_index()
    return movie_ids
if __name__ == '__main__':  #主函数
    print("Starting MovieRecs Population script...")
    delete_db()
    movie_ids = load_all_ratings()
    movie_ids = movie_ids.iloc[:, 1]
    for movie_id in tqdm(movie_ids.values):
        get_descriptions_with_movieid(movie_id)

爬取的数据保存在pgAdmin4中,如图所示。
在这里插入图片描述

Python命令行爬取数据成功,如图所示。

在这里插入图片描述

相关其它博客

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——html" title=机器学习>机器学习算法应用(含html" title=python>python、JavaScript工程源码)+MovieLens数据集(一)

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——html" title=机器学习>机器学习算法应用(含html" title=python>python、JavaScript工程源码)+MovieLens数据集(三)

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——html" title=机器学习>机器学习算法应用(含html" title=python>python、JavaScript工程源码)+MovieLens数据集(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。


http://www.niftyadmin.cn/n/5148153.html

相关文章

ts笔记ts笔记

Partial 可以快速把某个接口类型中定义的所有属性变成可选的。 Omit Omit是TypeScript3.5新增的一个辅助类型,它的作用主要是:以一个类型为基础支持剔除某些属性,然后返回一个新类型。 type Person {name: string;age: string;location:…

2023NOIP A层联测23-涂鸦

有一面由 n m n\times m nm 个格子组成的墙,每个格子要么是黑色,要么是白色。你每次将会进行这样的操作:等概率随机选择一个位置 ( x , y ) (x,y) (x,y),和一个颜色 c c c(黑色或者白色)( 1…

服装手机壳抱枕diy来图定制小程序开发

服装手机壳抱枕diy来图定制小程序开发 一、我们的定位与特色 首先,我们是一个多元化商品定制商城。与其他商城不同的是,我们致力于提供全方位的定制服务,包括手机壳、抱枕、服装、水杯贴图等各类商品。 此外,我们还提供冲洗照片…

[PyTorch][chapter 60][强化学习-2-有模型学习2]

前言: 前面我们讲了一下策略评估的原理,以及例子. 强化学习核心是找到最优的策略,这里 重点讲解两个知识点: 策略改进 策略迭代与值迭代 最后以下面环境E 为例,给出Python 代码 。 目录: 1: 策略改进 2&…

物联网AI MicroPython传感器学习 之 MLX90614红外测温传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 MLX90614是一款由迈来芯公司提供的低成本红外温度计,用于非接触式温度测量,红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有不…

0-1矩阵列互斥问题——回溯法 Python实现

三、 0-1 矩阵的列集互斥问题。给定一个 m n m \times n mn 的 0-1 矩阵 A \mathrm{A} A 。定义列互斥为: 对于矩阵 A A A 中的任意两列 i i i 和 j j j, 如果在对应的每一行上, i i i 和 j j j 不存在同时为 1 的情况, 则称列 i \mathrm{i} i 和 j \mathrm{j} j 互斥…

【C++学习笔记】C++20的jthread

jthread基于std::thread主要增加了以下两个功能: jthread 对象被析构时,会自动调用join,等待其所表示的执行流结束。jthread支持外部请求中止(通过 get_stop_source、get_stop_token 和 request_stop )。 std::jthrea…

解决mysql数据库root用户看不到库

第一种方式: 1.首先停止MySQL服务:service mysqld stop 2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables & 然后就可以无任何限制的访问mysql了 3.root用户登陆系统:mysql -u root -p mysql 4.切换数据库&#…