數據挖掘實戰-基于內容協同過濾算法的電影推薦系統

?

🤵?♂? 個人主頁:@艾派森的個人主頁

?🏻作者簡介:Python學習者
🐋 希望大家多多支持,我們一起進步!😄
如果文章對你有幫助的話,
歡迎評論 💬點贊👍🏻 收藏 📂加關注+


目錄

1.項目背景

2.數據集介紹

3.技術工具

4.實驗過程

4.1導入數據

4.2詞云圖可視化

4.3基于內容的協同過濾

4.4基于投票的過濾:人口統計學過濾

5.總結

6.源代碼


1.項目背景

????????隨著信息技術的迅猛發展和數字化媒體的普及,人們每天面臨著海量的信息選擇。特別是在線電影平臺,如騰訊視頻、愛奇藝、優酷等,擁有數以萬計的電影資源。用戶在如此龐大的電影庫中尋找感興趣的內容變得愈發困難,因此,一個高效、精準的推薦系統顯得尤為重要。

????????傳統的電影推薦方法,如基于流行度或者最新發布進行推薦,往往不能滿足用戶個性化的需求。為了提供更加個性化的電影推薦,推薦系統需要能夠理解和預測用戶的喜好。基于內容的推薦系統和協同過濾推薦系統是兩種主流的方法。基于內容的推薦主要是通過分析用戶過去的行為和電影的內容(如類型、導演、演員等)來推薦類似的電影。而協同過濾則是通過分析用戶的行為和其他相似用戶的行為來進行推薦。

????????然而,單一的推薦方法往往有其局限性。基于內容的推薦可能過于依賴電影的特征描述,而忽略了用戶的個性化需求;而協同過濾則可能受限于數據的稀疏性和冷啟動問題。為了克服這些問題,可以考慮將基于內容的推薦和協同過濾結合起來,形成一種混合推薦方法,即基于內容協同過濾的推薦系統。

????????本研究旨在構建一個基于內容協同過濾算法的電影推薦系統,通過結合電影的內容特征和用戶的行為數據,為用戶提供更加精準和個性化的電影推薦。通過這種方法,我們期望能夠提高用戶對推薦電影的滿意度,并進一步提升在線電影平臺的用戶體驗。

????????在上述背景下,本研究將深入探索內容協同過濾算法在電影推薦系統中的應用,以期為用戶提供更加精準、個性化的電影推薦服務。

2.數據集介紹

本數據集來源于Kaggle,原始數據集共有2個文件,一個是movies.csv,一個是credits.csv。

movies.csv如下:

credits.csv如下:

3.技術工具

Python版本:3.9

代碼編輯器:jupyter notebook

4.實驗過程

4.1導入數據

導入第三方庫并加載數據集

查看數據前五行

合并數據集

查看數據基本信息

4.2詞云圖可視化

自定義一個畫詞云圖的函數

畫出標題列的詞云圖?

填充overview變量中的缺失值并可視化

4.3基于內容的協同過濾

????????這種類型的過濾器不涉及其他用戶,如果不是我們自己。根據我們的喜好,算法會簡單地挑選內容相似的商品推薦給我們。在這種情況下,推薦的多樣性將會減少,但無論用戶評分與否,這都是有效的。如果我們將其與上面的例子進行比較,也許用戶B可能喜歡黑色喜劇,但他/她永遠不會知道,除非他/她決定自主嘗試,因為這個過濾器只會繼續推薦反烏托邦電影或類似的電影。當然,我們可以計算許多類別的相似性:在電影的情況下,我們可以決定僅基于類型構建我們自己的推薦系統,或者我們想要包括導演,主要演員等。

向量化

我們將使用sklearn的linear_kernel()而不是cosine_similarity(),因為它更快。?

自定義一個推薦函數?

如果你搜索“Spectre”,下面的電影名稱將被推薦?

如果你搜索“John Carter”,下面的電影名稱將被推薦?

?將字符串化后的特征解析為對應的python對象

提取類型和關鍵詞列表?

結合類型和關鍵詞

?向量化

余弦相似度

余弦相似度度量了內積空間中兩個向量之間的相似度。它是由兩個向量之間夾角的余弦來測量的,并確定兩個向量是否大致指向相同的方向。在文本分析中,它常用于度量文檔的相似度。文檔可以由數千個屬性表示,每個屬性記錄文檔中特定單詞(如關鍵字)或短語的頻率。因此,每個文檔都是由術語頻率向量表示的對象。

我們都熟悉向量:它們可以是2D, 3D或任何d。讓我們用2D來思考一下,因為它更容易在我們的腦海中描繪出來,讓我們先復習一下點積的概念。兩個向量的點積等于其中一個向量在另一個向量上的投影。因此,兩個相同向量(即具有相同分量)之間的點積等于它們的平方模,而如果兩個向量垂直(即它們不共享任何方向),則點積為零。通常,對于n維向量,點積的計算方法如下所示。

在定義相似度時,點積很重要,因為它與相似度直接相關。兩個向量u和v之間相似度的定義,實際上是它們的點積和它們的大小之積的比值。

通過應用相似性的定義,如果這兩個向量相同,它等于1,如果這兩個向量正交,它等于0。換句話說,相似度是一個介于0到1之間的數字它告訴我們兩個向量有多相似。

使用余弦相似度

如果你搜索“John Carter”,下面的電影名稱將被推薦?

?

如果你搜索“Soldier”,下面的電影名稱將被推薦

4.4基于投票的過濾:人口統計學過濾

計算avarage評級

篩選符合條件的電影

根據上面計算的分數對電影進行排序?

熱門電影?

5.總結

????????本研究通過構建并優化基于內容協同過濾算法的電影推薦系統,成功實現了對用戶個性化電影推薦需求的精準滿足。實驗結果表明,該系統能夠結合電影內容特征和用戶行為數據,為用戶提供更加符合其興趣和偏好的電影推薦。相較于單一的推薦方法,該系統展現出了更高的推薦準確性和用戶滿意度,從而驗證了內容協同過濾算法在電影推薦系統中的有效性和優越性。因此,該算法對于提升在線電影平臺的用戶體驗和服務質量具有重要的應用價值。

6.源代碼

import numpy as np 
import pandas as pd 
pd.set_option('display.max_columns', 25)
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')movie = pd.read_csv('tmdb_5000_movies.csv')
credit = pd.read_csv('tmdb_5000_credits.csv')
movie.head()
credit.head()
# 合并兩個數據集
credit.columns = ['id','cast', 'title', 'crew']
movie= movie.merge(credit, on='id')
movie.head()
movie.info()
# 詞云圖
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
# 自定義一個畫詞云圖的函數
def cloud(col):    wcloud = " ".join(f for f in movie[col])wc_ = WordCloud(width = 2000, height = 1000, random_state=1, background_color='black', colormap='Set2', collocations=False, stopwords = STOPWORDS)wc_.generate(wcloud)plt.subplots(figsize=(10,6))plt.imshow(wc_, interpolation="bilinear")plt.axis("off")
# 畫出標題列的詞云圖
cloud("original_title")
# 填充overview變量中的缺失值
movie["overview"] = movie["overview"].fillna("")
cloud("overview")
# Tfidf向量化
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words="english")
tfidf_matrix = tfidf.fit_transform(movie["overview"])
tfidf_matrix
# 我們將使用sklearn的linear_kernel()而不是cosine_similarity(),因為它更快。
from sklearn.metrics.pairwise import linear_kernel
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
# 索引和電影original_title的反向映射
indices = pd.Series(movie.index, index=movie['original_title']).drop_duplicates()
# 自定義一個推薦函數
def get_recommendation(title, cosine_sim):idx = indices[title]sim_scores = list(enumerate(cosine_sim[idx]))sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)sim_scores = sim_scores[1:11]movies = [i[0] for i in sim_scores]movies = movie["original_title"].iloc[movies]return movies
# 如果你搜索“Spectre”,下面的電影名稱將被推薦
get_recommendation('Spectre', cosine_sim)
# 如果你搜索“John Carter”,下面的電影名稱將被推薦
get_recommendation("John Carter", cosine_sim)
# 將字符串化后的特征解析為對應的python對象
from ast import literal_evalfeatures = ['keywords', 'genres']
for feature in features:movie[feature] = movie[feature].apply(literal_eval)movie[['original_title', 'keywords', 'genres']].head(3)
# 提取類型列表
def list_genres(x):l = [d['name'] for d in x]return(l)
movie['genres'] = movie['genres'].apply(list_genres)# 提取關鍵字列表
def list_keyword(y):i = [a['name'] for a in y]return(i)
movie['keywords'] = movie['keywords'].apply(list_keyword)
# 結合類型和關鍵詞
def genre(x):return ''.join(' '.join(x['genres']) + ' ' + ' '.join(x['keywords']))movie['mix'] = movie.apply(genre, axis=1)
movie["mix"]
# 向量化
from sklearn.feature_extraction.text import CountVectorizer
countvect = CountVectorizer(stop_words="english")
countvect_mat = tfidf.fit_transform(movie["mix"])
countvect_mat
from sklearn.metrics.pairwise import cosine_similarity
cos_sim = cosine_similarity(countvect_mat, countvect_mat)
# 索引和電影original_title的反向映射
movie = movie.reset_index()
indices = pd.Series(movie.index, index=movie['original_title'])
# 如果你搜索“John Carter”,下面的電影名稱將被推薦
get_recommendation("John Carter", cos_sim)
# 如果你搜索“Soldier”,下面的電影名稱將被推薦
get_recommendation("Soldier", cos_sim)
基于投票的過濾:人口統計學過濾
# avarage評級
avg = movie["vote_average"].mean()
#  我們將使用第90個百分位數作為截止點。換句話說,一部電影要想進入榜單,它必須比榜單上至少90%的電影獲得更多的選票。
q = movie["vote_count"].quantile(0.9)
print(avg)
print(q)
# 符合條件的電影
movies = movie[movie["vote_count"] >= q]
# weighted_rating函數
def weighted_rating(x, q=q, avg=avg):v = x['vote_count']R = x['vote_average']# 根據IMDB公式計算return (v/(v+q) * R) + (q/(q+v) * avg)# 符合條件的影片
movies["score"] = movies.apply(weighted_rating, axis=1)
# 根據上面計算的分數對電影進行排序
movies = movies.sort_values('score', ascending=False)
# 打印前10部電影
listed = movies[['original_title', 'vote_count', 'vote_average', 'score', "popularity"]].head(10)
# 可視化
import seaborn as sns
plt.subplots(figsize=(10,6))
sns.barplot(listed["score"], listed["original_title"], palette="Set2")
plt.title("Movie Vs Score")
plt.show()
# 熱門電影
popular= movies.sort_values('popularity', ascending=False)
plt.figure(figsize=(12,4))plt.barh(popular['original_title'].head(10),popular['popularity'].head(10), align='center',color="#313131")
plt.gca().invert_yaxis()
plt.xlabel("Popularity")
plt.title("Popular Movies")
plt.show()

資料獲取,更多粉絲福利,關注下方公眾號獲取

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14371.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【從C++到Java一周速成】章節9:構造器

章節9:構造器 對于一個類來說,一般有三種常見的成員:屬性、方法、構造器。 這三種成員都可以定義零個或多個。 構造方法也叫構造器,是一個創建對象時被自動調用的特殊方法,用于對象的初始化。 Java通過new關鍵字來調用…

OpenHarmony集成OCR三方庫實現文字提取

1. 簡介 Tesseract(Apache 2.0 License)是一個可以進行圖像OCR識別的C庫,可以跨平臺運行 。本樣例基于Tesseract庫進行適配,使其可以運行在OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)上,并新增N-API接口供上層應…

.Net Core學習筆記 框架特性(注入、配置)

注:直接學習的.Net Core 6,此版本有沒有startup.cs相關的內容 項目Program.cs文件中 是定義項目加載 啟動的地方 //通過builder對項目進行配置、服務的加載 var builder WebApplication.CreateBuilder(args); builder.Services.AddControllers();//將…

Ubuntu服務器運行Subspace節點和Farm

提供Subspace 節點部署&性能優化&機房托管&運維監控等服務。myto88 磁盤格式化 將插入的磁盤格式化。 sudo mkfs.ext4 -m 0 -T largefile4 /dev/sd*磁盤掛載 此處為語雀內容卡片,點擊鏈接查看:https://www.yuque.com/u25096009/lvoxa…

企商在線榮登甲子光年“2024中國AI算力層創新企業”榜單

5月15日,「AI創生時代——2024甲子引力X科技產業新風向」大會在北京順利舉辦,大會發布2024【星辰100】創新企業榜。企商在線憑借全棧式一體化AI算力能力,與超聚變、寒武紀等企業共同入選“2024中國AI算力層創新企業”榜單。 本次大會由中國科…

AJAX(JQuery版本)

目錄 前言 一.load方法 1.1load()簡介 1.2load()方法示例 1.3load()方法回調函數的參數 二.$.get()方法 2.1$.get()方法介紹 2.2詳細說明 2.3一些例子 2.3.1請求test.php網頁并傳送兩個參數 2.3.2顯示test返回值 三.$.post()方法 3.1$.post()方法介紹 3.2詳細說明 …

什么是云計算安全?如何保障云計算安全

云計算徹底改變了數據存儲的世界,它使企業可以遠程存儲數據并隨時隨地從任何位置訪問數據。存和取變得簡單,也使得云上數據極易造成泄露或者被篡改,所以云計算安全就顯得非常重要了。那么什么是云計算安全? 其實,云計…

WPS PPT學習筆記 1 排版4原則等基本技巧整理

排版原則 PPT的排版需要滿足4原則:密性、對齊、重復和對比4個基本原則。 親密性 彼此相關的元素應該靠近,成為一個視覺單位,減少混亂,形成清晰的結構。 兩端對齊,1.5倍行距 在本例中,19年放左邊&#x…

是誰的項目還在爛大街?一個基于 SpringBoot 的高性能短鏈系統

看了幾百份簡歷,真的超過 90% 的小伙伴的項目是商城、RPC、秒殺、論壇、外賣、點評等等爛大街的項目,人人都知道這些項目爛大街了,但大部分同學還是得硬著頭皮做,沒辦法,網絡上能找到的、教程比較完善的就這些項目了&a…

基于機器學習預測未來的二氧化碳排放量(隨機森林和XGBoost)

基于機器學習預測未來的二氧化碳排放量(隨機森林和XGBoost) 簡介: CO2排放是當今全球關注的環境問題之一。本文將使用Python對OWID提供的CO2排放數據集進行分析,并嘗試構建機器學習模型來預測未來的CO2排放趨勢。我們將探索數據…

kafka Kerberos集群環境部署驗證

背景 公司需要對kafka環境進行安全驗證,目前考慮到的方案有Kerberos和SSL和SASL_SSL,最終考慮到安全和功能的豐富度,我們最終選擇了SASL_SSL方案。處于知識積累的角度,記錄一下kafka keberos安裝部署的步驟。 機器規劃 目前測試環境公搭建了三臺kafka主機服務,現在將詳細…

ViLT學習

多模態里程碑式的文章,總結了四種多模態方法,根據文字和圖像特征特征抽取方式不通。 文章的貢獻主要是速度提高了,使用了數據增強,文本的mask 學習自b站朱老師的論文講解

電賽控制類PID算法實現

一、什么是PID PID(Proportional-Integral-Derivative)是一種經典的控制算法,廣泛應用在自動化控制系統中。它是通過對被控對象的測量值和設定值進行比較,并根據誤差的大小來調整輸出信號,實現對被控對象的穩定控制。 …

【C++】map和set的封裝

目錄 前言一、紅黑樹的設計1.1 紅黑樹存儲節點的設計1.2 紅黑樹的迭代器1.3 map的設計1.4 set的設計1.5關于map與set的const_iterator設計 前言 我們知道map和set的底層都是用紅黑樹實現的,但是set和map的結構不一樣,set只有一個參數K,而map…

前端基礎:1-2 面向對象 + Promise

面向對象 對象是什么?為什么要面向對象? 通過代碼抽象,進而藐視某個種類物體的方式 特點:邏輯上遷移更加靈活、代碼復用性更高、高度的模塊化 對象的理解 對象是對于單個物體的簡單抽象對象是容器,封裝了屬性 &am…

如何安裝 Docker

引言 - 介紹 Docker 技術的重要性和應用場景 - 簡要解釋 Docker 的工作原理和優勢 Docker 的安裝 Docker 在不同平臺上的安裝方法(Windows、Mac、Linux) Docker 是一個開源的容器化平臺,可以幫助開發人員和運維團隊更輕松地打包、交付和運行…

python 裝飾器 帶參數和不帶參數

裝飾器是Python語言中一種特殊的語法,用于在不修改原函數代碼的情況下,為函數添加額外的功能或修改函數的行為。通過裝飾器,我們可以在函數執行前后執行一些額外的代碼,或者修改函數的參數。 要使用裝飾器引入函數和參數&#xf…

Linux_應用篇(07) 系統信息與系統資源

在應用程序當中,有時往往需要去獲取到一些系統相關的信息,譬如時間、日期、以及其它一些系統相關信息,本章將向大家介紹如何通過 Linux 系統調用或 C 庫函數獲取系統信息, 譬如獲取系統時間、日期以及設置系統時間、日期等&#x…

restTemplate返回報文亂碼問題

默認服務端使用UTF8編碼 排查1&#xff1a; 請求前手動設置UTF-8編碼解析報文 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); ResponseEntity<String> excha…