機器學習項目(五) 電影推薦系統(三)

四、基於內容推薦

協同過濾:基於內容 基於用戶
找到用戶或內容之間的相似性 進行推薦

基於內容推薦簡介

基於標的物相關信息、用戶相關信息及用戶對標的物操作行爲來構建推薦算法模型,爲用戶提供推薦服務。
在這裏插入圖片描述

基於內容推薦

核心步驟
# 插圖

基於用戶特徵和標的物特徵 實現爲用戶推薦相似的標的物

1.基於用戶歷史行爲記錄做推薦:先計算標的物之間的相似性,然後利用用戶歷史記錄中與標的物相似的物品進行推薦(餘弦相似度)
2.基於顯示的標籤標示做推薦:根據用戶的標籤,表示用戶的興趣,標籤可以關聯許多的標的物
3.基於向量相似做推薦:將用戶和標的物 嵌入向量空間中,找到用戶和標的物之間的相似性。計算用戶和標的物之間的相似性。

用戶特徵表示方法

1.用戶行爲記錄作爲顯示特徵:過去一段時間,用戶對商品的偏好
2.顯示的標籤特徵:標的物是由很多標籤表示的,這些標籤又可以表徵這些標的物,用戶畫像也可以基於用戶對標的物打上對應的標籤
3.向量式的興趣特徵:基於標的物的信息,將標的物嵌入到向量當中,利用向量來表示標的物,有了標的物的向量化之後,用戶的興趣向量就可以用其他操作過的標的物的向量的平均向量來表示,所有的標的物的向量化之後,用戶的興趣向量能夠表示出來
4.通過交互方式獲取用戶興趣標籤:很多APP在註冊的時候讓用戶選擇自己的用戶標籤,一旦用戶選擇了自己的興趣標籤,就爲推薦系統提供了推薦的原材料,具體是與向量的興趣特徵類似,計算對標的物的偏好程度,根據偏好度去進行推薦
5.用戶的人口統計學特徵:用戶在註冊或登錄平臺的時候提供了相關的信息,通過運營用戶填寫的信息,利用算法推斷出一些結論,用戶年齡,性別,地域輸入,愛好,居住地等,計算用戶之間的相似度,從而對用戶做推薦

商品特徵表示

四大表示方法

1.標籤信息:標的物可以用隱式向量、顯式標籤表示,標的物可以看做多維向量,利用one-hot編碼來描述標的物的信息
2.結構化信息:變成向量化,然後將商品特徵進行表示
3.包含文本信息的標的物的特徵表示:將文本中的信息進行向量化,提取一些關鍵字、關鍵詞、主題等(TFIDF、IDA),然後計算文本的相似程度(Doc2vec、word2vec)
4.包含圖片、音頻、或者視頻信息的特徵表示:利用包含文本的信息進行特徵表示,利用圖像、音頻等領域的技術將特徵進行提取

相似度衡量

1.餘弦相似度
2.喜好度
3.最近鄰方法
4.聚類

餘弦相似度

cos(θ)=ABAB=i=1nAiBii=1n(Ai)2i=1n(Bi)2\cos (\theta)=\frac{A^{*} B}{\|A\|^{*}\|B\|}=\frac{\sum_{i=1}^{n} A_{i}{*} B_{i}}{\sqrt{\sum_{i=1}^{n}\left(A_{i}\right)^{2}} \sqrt{\sum_{i=1}^{n}\left(B_{i}\right)^{2}}}

應用場景:
完全個性化推薦、主題推薦、配合其他推薦算法、給用戶推薦標籤

優缺點分析

優點

可以很好的識別用戶的口味
非常直觀易懂,可解釋性強
可以更加容易的解決冷啓動
算法實現相對簡單
對於小衆領域也能有比較好的推薦效果
非常適合標的物快速增長的有時效性要求的產品

缺點

推薦範圍狹窄,新穎性不強
流程複雜、耗時長
較難將長尾標的物分發出去
推薦進準度不太高

import pandas as pd

md = pd. read_csv('./data/movies_metadata.csv')
md.head()

links_small = pd.read_csv('./data/links_small.csv')
links_small = links_small[links_small['tmdbId'].notnull()]['tmdbId'].astype('int')

md = md.drop([19730, 29503, 35587])

md['id'] = md['id'].astype('int')

smd = md[md['id'].isin(links_small)]
smd.shape

smd['tagline'] = smd['tagline'].fillna('')
smd['description'] = smd['overview'] + smd['tagline']
smd['description'] = smd['description'].fillna('')


# 詞的向量化
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
# 餘弦相似度
from sklearn.metrics.pairwise import linear_kernel, cosine_similarity

# 去停用詞
tf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(smd['description'])
# 向量化之後的數據大小
tfidf_matrix.shape

# 建立混淆矩陣 並計算餘弦相似度
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
cosine_sim[0]

smd = smd.reset_index()
titles = smd['title']
indices = pd.Series(smd.index, index=smd['title'])

def get_recommendations(title):
    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:31]
    movie_indices = [i[0] for i in sim_scores]
    return titles.iloc[movie_indices]

get_recommendations('The Godfather').head(10)

get_recommendations('The Dark Knight').head(10)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章