如何只使用标签来构建一个简单的电影推荐系统
作者:Johnson Kuan? ?編譯:ronghuaiyang
導讀
使用基于內容的方法來找到最相似的電影。
No MIT chalkboard required
介紹
假設你正在推出下一個非常大的訂閱視頻點播(SVOD)流媒體服務,并且你已經獲得了過去100年里發行的所有主要電影的流媒體權。祝賀你,這是不可思議的壯舉!
現在你有了很多電影。如果沒有推薦系統,你就會擔心隨著時間的推移,用戶可能會被他們不關心的電影所淹沒。這可能會導致客戶流失,這是你最不想看到的!
所以你決定建立一個電影推薦系統。由于你的服務是新的,所以你還沒有足夠的數據來了解哪些用戶正在觀看哪些電影。這就是所謂的冷啟動問題,它不能讓你僅根據用戶的歷史收視記錄來推薦電影。
幸運的是,即使沒有足夠的觀看數據,我們仍然可以建立一個像樣的電影元數據推薦系統。這就是MovieLens的作用所在。MovieLens提供了一個公共數據集,其中包含每個電影的關鍵字標簽。這些標簽信息量很大。例如,看看Good Will Hunting的最重要的社群標簽。
在這篇文章的其余部分,我將回答三個業務問題,這三個問題對于構建一個簡單的基于內容的推薦系統非常關鍵,其中的標簽來自MovieLens:
每部電影需要多少個標簽?
我們如何使用標簽來衡量電影之間的相似性?
我們如何使用標簽為用戶生成電影推薦?
這個分析的代碼可以在這里找到:
https://github.com/JohnsonKuan/movie-rec-tags,以及數據和Conda環境YAML文件,以便你輕松地復現結果。
1) 每部電影我們需要多少個標簽?
MovieLens標簽數據集中大約有10K個不一樣的電影和1K個不一樣的標簽。每部電影的每個標簽都有一個相關分數,所以大約有1000萬個電影標簽對。相關性得分范圍為0到1。
并不是每個標簽都與電影相關,所以我們只需要保留最相關的標簽。首先,我們可以根據相關評分對每部電影的標簽進行排序。例如,下面是Remember the Titans的top10標簽。請注意,相關性評分遠遠高于0.9,這表明它們是非常相關的標簽。
基于相關性得分的前10個標簽(降序排列)接下來,我們在下面的圖中確認,電影的高排名標簽往往具有較高的中值相關性得分。電影的排第一個的標簽的中值相關度幾乎是1。我們可以看到,當我們下降到第50位時,中值相關性得分逐漸下降。
為了找到與電影最相關的標簽,我們可以根據相關性評分保留電影的前N個標簽。在這里,我們需要仔細挑選。如果N很小,我們有非常相關的但是很少的標簽。如果N很大,我們有很多標簽,但是其中很多可能是無關的。
下面的圖顯示了從第1個標簽到第100個標簽的中值的變化百分比。當相關性得分開始變得更穩定時,我們看到在第50位附近有一個拐點。因此,我們可以選擇N=50作為每個電影保留的合理數量的標簽。注意,這是一個相當簡單的“拐點方法”風格的方法,可以在以后進行優化。
現在我們可以得到每個電影的前50個標簽的列表,我們將在下一節中使用它們。例如,Toy Story的前50個標簽如下。
2) 我們如何使用標簽來度量電影之間的相似度?
在為用戶生成電影推薦之前,我們需要一種基于電影的前50個標簽的相似性度量方法。在基于內容的推薦系統中,用戶將被推薦與他們已經看過的電影相似的電影。
在這里,我會演示兩種度量相似性的方法:
兩個電影標簽集合的Jaccard Index
基于標簽的電影向量(即內容嵌入)的余弦相似度。
Jaccard Index
使用Jaccard Index的第一種方法度量兩個集合A和B之間的相似性,即交集的大小除以并集的大小。在度量電影之間的相似性時,我們可以計算這兩組電影標簽的索引。

例如,我們有三個電影下面和他們的前3個標簽:
電影A的標簽 =(動作,空間,友情)
電影B的標簽=(冒險,太空,友誼)
電影C的標簽=(浪漫,喜劇,成長)
直觀上,我們可以看出電影A與B更相似,而不是C。這是因為電影A和B共享兩個標簽(空間,友情),而電影A和C不共享任何標簽。
下面是基于Jaccard Index的與Good Will Hunting相似的10部電影。對于Good Will Hunting的觀眾來說,這些建議似乎是合理的。注意,我在列表中包括了Good Will Hunting,以顯示在比較電影本身時Jaccard Index=1。
基于Jaccard Index的標簽集的類似Good Will Hunting的電影以下是10部與Interstellar相似的電影。對于Interstellar的觀眾來說,這些建議似乎也很合理。
基于Jaccard Index的標簽集的類似Interstellar的電影為了進一步說明Jaccard Index的有效性,請看下面基于和Interstellar相似的電影的標簽頻率的詞云。在這里,我們可以看到哪些標簽在相似性計算中更加突出(例如科幻小說,偉大的結局,反烏托邦的未來,哲學,大腦)。
基于和Interstellar相似的電影的標簽頻率的詞云電影向量(也就是內容嵌入)的余弦相似度
第一個使用Jaccard Index的方法幫助我們建立了一種關于與標簽相似的含義的直覺。基于余弦相似度的第二種方法稍微復雜一點。它要求我們把電影表示成一個向量。這里,向量就是一組數字。
例如,我們可以用三個實數來表示三個相同的電影:
電影A = (1.1, 2.3, 5.1)
電影B = (1.3, 2.1, 4.9)
電影C = (5.1, 6.2, 1.1)
直觀上,我們可以再次看到電影A與B更相似,而不是C。這是因為電影A和B在每個維度上有更接近的數字(例如第一個維度是1.1 vs 1.3)。
為了找到一個好的向量表示的電影,我使用了Doc2Vec (PV-DBOW)技術,我們拿到一個電影(文檔),并基于標簽(文檔中的詞)學習一個到潛在K維空間的映射。我不會在這里深入討論細節,但這是我們如何基于標簽將電影表示為向量的方法。
Doc2Vec論文中對PV-DBOW技術的可視化,對于每個段落ID (movie),我們訓練一個模型來預測該段落中某個單詞(movie tag)的共現性一旦我們可以把每一部電影表示成一個向量,我們就可以計算向量之間的余弦相似度來找到相似的電影。我不會在這里詳細介紹余弦相似度,但是在一個較高的層次上,它告訴我們電影向量彼此之間有多么相似,我們可以使用它來生成推薦。
下面我用UMAP在二維空間上可視化電影向量,這是一種流行的非線性降維技術。我們可以看到,在這個向量空間中距離較近的電影更加相似(例如Toy Story和Monsters等等)。
從電影標簽語料庫中學習電影向量3) 我們如何使用標簽為用戶生成電影推薦?
現在我們可以使用標簽來度量電影之間的相似性,我們可以開始為用戶生成電影推薦。
請記住,在基于內容的推薦系統中,用戶將被推薦與他們已經看過的電影相似的電影。如果用戶只看過一部電影(如Good Will Hunting),我們可以像以前一樣簡單地使用Jaccard Index(或余弦相似度)來生成要推薦的類似電影的列表。
更實際的情況是,用戶已經觀看了一組電影,我們需要根據這些電影的組合屬性來生成推薦。
一個簡單的方法是計算一個用戶向量,作為他們看過的電影向量的平均值。這些用戶向量可以表示用戶的電影偏好屬性。
例如,如果用戶只看過電影A和B:
電影A = (1,2,3)
電影B = (7,2,1)
用戶向量=電影A和B的平均 = (4,2,2)
以下是我喜歡看的電影。我們如何使用這些電影的標簽生成電影推薦?
Interstellar, Good Will Hunting, Gattaca, Almost Famous, The Shawshank Redemption, Edge of Tomorrow, Jerry Maguire, Forrest Gump, Back to the Future
我的用戶向量是上述9部電影的電影向量的平均值。我可以使用我的用戶向量,找到我還沒有看過的最相似的電影(基于余弦相似性)。下面是我的電影推薦,這是令人驚訝的好,考慮到我們在這里只是使用了電影標簽!
The Theory of Everything Cast Away Dead Poets Society Charly Rain Man Groundhog Day Pay It Forward A Beautiful Mind E.T. the Extra-Terrestrial Mr. Holland's Opus On Golden Pond It's a Wonderful Life Children of a Lesser God The Curious Case of Benjamin Button Star Trek II: The Wrath of Khan Cinema Paradiso Mr. Smith Goes to Washington The Terminal Her The World's Fastest Indian The Truman Show Star Trek: First Contact The Family Man下面總結一下我們基于內容的推薦系統。請注意,如果我們將系統部署為API,我們可以在批處理過程中預先計算用戶向量和相似分數,以加快推薦的提供。
輸入:用戶向量(從標簽中學習到的電影向量的平均值)
輸出:基于用戶和電影向量的余弦相似度,與用戶相似的電影列表
—END—
英文原文:https://towardsdatascience.com/how-to-build-a-simple-movie-recommender-system-with-tags-b9ab5cb3b616
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的如何只使用标签来构建一个简单的电影推荐系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何利用pycharm实现本地代码和远程
- 下一篇: 【网络结构】小议如何跳出魔改网络结构的火