PM技術課 | 推薦系統,從原理到實現
大數據時代,冗雜的信息讓身處其中的用戶們感到迷茫,無法抉擇。所以,大數據時代推薦系統的重要程度就不言而喻了。如何在有限的時間內給用戶推薦合適的信息或商品,是推薦系統最重要的工作。那么,推薦系統是如何運轉的,其原理以及運轉流程如何?以下,將由筆者為大家詳細講述。
一、你關心的,才是頭條
隨著互聯網行業的發展,網絡的數據量也在不斷增加。僅微信,平均每個人要關注幾十甚至上百個公眾號;淘寶的商品數量也有上億種。
如何在有限的時間找到需要的信息或者商品?如何給用戶推薦合適的內容和商品?
除了搜索引擎按照用戶的搜索展示外,推薦系統也起了關鍵作用,通常有兩種推薦方式。
第一種推薦方式是:大眾推薦。
基于“大家都喜歡潮流(跟風)”這一假設,根據流行程度進行大眾推薦,常見的有熱搜、排行榜,對于新的作品或者新的商品,也會單獨推薦,以提高新鮮感。
這種大眾推薦方式主要依靠閱讀量或者人工進行推薦,主要有兩個問題:一來熱門的數量有限,用戶可能看一會兒就沒什么可看的了;另一方面,用戶或許對特定的領域更感興趣,愿意為此花時間或者花錢,這也就是所說的長尾效應。
這就催生出了第二種推薦方式:個性推薦,也是我們要講述的。
個性推薦本質上是一種信息過濾系統,用于預測用戶對物品的偏好,推薦用戶更感興趣的內容,用戶使用時長會快速增加,刷新聞,一刷就是幾個小時;推薦用戶更感興趣的商品,“逛”商場的時間和客單價也會相應提高。
最近風頭正盛的今日頭條正是使用推薦系統,獲得快速成長的絕佳范例。
按照今日頭條官網的介紹:今日頭條“一款基于數據挖掘的推薦引擎產品,它為用戶推薦有價值的、個性化的信息,提供連接人與信息的新型服務”。通過個性推薦,今日頭條在短短幾年時間內,成長為互聯網領域炙手可熱的明星。
今日頭條融合了多種特征進行計算,包括興趣、年齡、性別、行為等用戶特征,地理位置、時間、天氣等環境特征,主題詞、熱度、時效性、質量、作者來源等文章特征。通過數據計算特征,根據特征計進行推薦,最終實現“千人千面”的新聞推薦方式。
在電商領域,最值得稱道的是亞馬遜,亞馬遜宣稱,通過個性推薦提高了其30%的銷售。
亞馬遜記錄用戶瀏覽頁面的點擊、加入購物車、購買、評價等行為,將用戶的行為記錄與其他用戶的進行對比,通過相似用戶,向用戶推薦更多可能感興趣的商品。與此同時,根據用戶的行為的變化,不定期更新推薦內容,充分考慮到了用戶喜好的改變。
除了電商和新聞,在視頻、圖書、音樂等領域,個性推薦系統也發揮了越來越大的作用。
常見的個性推薦算法主要包括:基于內容個性推薦、利用用戶行為的協同過濾、基于數學模型的推薦等。在實際應用中,往往會將這些推薦系統的結果進行融合,生成最終的推薦。
二、基于內容的推薦(Content-Based Recommendation)
1. 猜你喜歡
基于內容的推薦主要利用內容本身的特征進行推薦,把類似的內容推薦給用戶。
比如:根據音樂的流派、類型、歌手等推薦類似的音樂,如果用戶喜歡聽《青花瓷》,音樂APP就會推薦周杰倫的《千里之外》。同樣也可以根據商品推薦同類的商品,如果用戶搜索過手機,電商APP就會在首頁推薦各種牌子的智能手機。
基于內容的推薦是非?;A的推薦策略,最核心環節的是:計算內容本身的相似性。
以音樂為例:向用戶推薦同一個歌手的音樂是很簡單的,用戶喜歡《青花瓷》,就直接把周杰倫的歌單推薦過去就好了。
相比之下,向用戶推薦某個流派的音樂稍微有些難度,首先要有每一首歌的流派標簽,之后根據標簽進行推薦,還好幾乎每首歌都有流派標簽,比如:流行、輕音樂、搖滾、民謠等。
語言、主題、場景等標簽也是類似的。所有這些標簽都需要手工標記,雖然麻煩,但是也能實現。
但,如果用戶可能就是喜歡某種調調,某些歌詞呢?如何向用戶推薦某種曲風、曲調或者歌詞的音樂?這就需要計算旋律的相似性、歌詞的相似性等。
涉及到音頻處理,這個問題有些復雜,一時半會兒也說不清楚,我們拿稍微簡單些的新聞推薦,剖析下如何實現基于內容的推薦,雖然具體的操作和算法不同,但原理是相通的。
雖說稍微簡單些,但新聞相似度的計算也是相當復雜的工作,主要包括獲取新聞、清洗數據、數據挖掘、計算相似度等環節。
按照所述《網絡爬蟲》,我們可以使用爬蟲來獲取新聞,這里不再贅述。
數據獲取之后,就是數據清洗,主要是新聞去重,新聞熱點就那么多,大家“借鑒來借鑒去”,不可避免存在重復的內容。
比較簡單的去重方式就是直接計算句子是否重復出現,如果連續幾句話都一模一樣,重復的可能性就比較大。說句題外話,“洗稿”基本就把句子重新寫了一遍,直接重復很少,這也是洗稿不容易被發現的一個主要原因。
在去重的同時,也會識別色情內容、廣告、政治敏感內容等。
2. 新聞分類
基于內容的推薦,大多數的時間都在進行內容挖掘和分析。
數據清洗之后,基本就是一篇篇新聞文本了。但一篇文章動輒幾百上千字,文本自身的數據量太大,直接計算相似度還很困難,需要通過數據挖掘,計算文本的特征,之后再利用特征計算相似度。
最常見的特征是關鍵詞,我們可以用關鍵詞表示一篇文章,就像我們評價一個不是特別熟悉的人一樣,使用“標簽”來表示我們對他的看法。
常用的關鍵詞獲取技術是上一章《搜索引擎》所講的TF-IDF(Term Frequency–Inverse Document Frequency)模型,通過分詞、去除關鍵詞、計算每個詞出現的頻率獲得TF;計算關鍵詞在所有新聞中出現的頻率,計算IDF,之后按照TF-IDF模型,計算關鍵詞特征。
這里為了方便展示,沒有計算TF-IDF具體數值。
比如:這篇新聞(2019年3月7日《人民日報》),原文有上千字,我們使用TF-IDF模型,去掉停用詞和常用詞,提取關鍵詞。通過計算, “國產”“科幻電影”“流浪地球”等直接體現本文內容詞語就是本文的關鍵詞。
按照同樣的方法,另一篇類似的文章(2019年2月14日《中國經濟網》),我們可以提取其中的關鍵詞,“好萊塢”“科幻電影”“現實”等。
為了便于對比,我還找了另一篇文章來自微軟亞洲研究院的文章(2018年11月6日),關鍵詞是 “推薦系統”“收入”等。
我們用關鍵詞表示這幾篇新聞,使用新聞1代指第一篇新聞,其他類似:
新聞1={“中國”,“科幻電影”,“流浪地球”,“人類”}
新聞2={“好萊塢”,“科幻電影”,“人類”}
新聞3={“推薦系統”,“收入”}
這樣,一篇幾千字的新聞,就被我們壓縮成了幾個關鍵詞,當然,實際的情況沒有這么簡單,一篇新聞可能有數十個關鍵詞。
這里還不能明顯看出什么區別,當我們把這三篇文章的關鍵詞放在一起,就很容易發現文章之間的相似程度。
因為有相同的關鍵詞,相較新聞3,新聞1和新聞2明顯比較類似,可以把新聞1和新聞2歸為一類,新聞3單獨一類。
3. 余弦相似度
通過數據TF-IDF模型,我們已經獲得了關鍵詞,并發現可以根據關鍵詞的不同,判斷新聞內容的相似性。
那么,我們如何量化這種類似關系呢?
最簡單的方式是余弦相似度,通過計算兩個向量的夾角余弦值來評估他們的相似度。
如圖所示,我們使用向量夾角的大小,來判斷兩個向量的相似程度,夾角越小,兩個向量越類似;夾角越大,兩個向量越不同。左邊的夾角就要小于右邊,我們可以認為,左邊的兩個向量更加類似。
在二維空間中,我們使用a、b表示兩個向量,a和b的坐標分別是(x1,y1),(x2,y2),向量a和向量b的余弦計算公式如下:
余弦的這種計算方法對多維向量也成立,這里我們假設總共有n維向量。
利用余弦相似度,我們可以計算關鍵詞之間的相似程度。
我們把每一個新聞當做向量,每一個關鍵詞作為一個維度(可以理解為一個坐標軸,如果有兩個關鍵詞,就是二維向量;如果有三個關鍵詞,就是三維向量,依此類推)。
這樣,每篇新聞都用關鍵詞表示,每個關鍵詞都有一個TF-IDF值。
下表是一個簡單的TF-IDF表格,不同新聞有不同的關鍵詞,以及對應TF-IDF值。
之后,按照多維向量的計算公式,我們可以計算所有新聞兩兩之間的相似程度。
- 如果向量夾角為0度,余弦相似度為1,此時兩個向量應該是最相似的。這表明,兩篇新聞內容非常相似,當然,也有可能是重復的文章。
- 如果夾角為90度,此時余弦相似度為0。這表明,兩篇新聞的關鍵詞都不一樣,內容完全是無關的。
- 余弦相似度在0~1之間,說明兩篇新聞具有一定的相關性。
通過計算余弦相似度,我們可以發現:新聞1和新聞2的余弦相似度較大,說明兩個新聞很類似;而新聞1、新聞2和新聞3之間的余弦相似度接近0,說明新聞1、新聞2與新聞3基本沒有關系。
需要注意的是:在實際計算中,一篇文章的關鍵詞可能有幾十甚至上百個,所有文章組成的關鍵詞可能就是幾萬個了。用關鍵詞代表文章,相當于大小數萬的矩陣相乘,計算量會很大,即使是最快的服務器,計算所有的新聞之間的相似程度,也要好幾天。
在實踐上,會有很多優化的空間,比如:代表文章的向量中有很多0不需要計算,這樣可以把計算復雜度降低幾十上百倍。也可以利用數學模型,進行矩陣分解,加速計算。
4. 基于內容推薦的特點
首先,基于內容的推薦實現起來比較簡單。相較其他推薦系統,不需要復雜的算法和計算,因此在新聞、電影、音樂、視頻等推薦中有廣泛的應用。
第二,如果只計算標題的相關性,就可以實時計算。這在電商的商品推薦,非常有吸引力。試想一下,根據用戶的瀏覽行為,實時更新“猜你喜歡”,對用戶來說,是非常貼心的了,隨之而來是較高的轉化率。
第三,基于內容的推薦可以解決冷啟動的問題。在最開始做推薦的時候,往往沒有大量且有效的用戶行為數據的,無法實現協同過濾等更加高級的推薦方式,只能利用商品本身的數據做內容推薦。更多關于冷啟動的內容,會在后面介紹。
需要注意的是:在特定場景中,基于內容的推薦也存在很多問題。
比如:電商推薦會根據用戶購買記錄,推薦一些同款或者類似的產品。對于那些手機、單反相機等低頻購買行為,重復購買率很低,最好的展位就這樣被浪費掉了,機會成本非常大,這就需要更多的算法優化來改進基于內容的推薦,比如用戶可以手動過濾一些不想看到的內容等。
三、協同過濾(Collaborative Filtering,CF)
1. 什么是協同過濾
如果你想看個電影,但不知道看哪部,你會怎么做?
可能直接找個熱門的電影,這是基于熱度的大眾推薦;可能會找科幻、愛情類型的電影觀看,這是基于內容的推薦;還可能問問周圍的人,看有沒有什么好看的電影推薦,周圍有朋友、同事甚至父母,但我們一般不會找父母推薦,而是找朋友推薦,因為我們喜歡的電影很可能是類似的,這也是協同過濾的核心思想。
前面講的基于內容的推薦,只利用了內容之間的相似性,在冷啟動或者用戶數據較少的情況下,可以使用。有了用戶(User)數據,比如點擊、購買、播放、瀏覽等操作,就可以投其所好,推薦用戶感興趣的文章、音樂、電影或商品,統稱為物品(Item)。這就是協同過濾。
按照計算相似度采用的標準不同,協同過濾主要分為:基于用戶的協同過濾(User-based Collaborative Filtering,User-based CF)和基于物品的協同過濾(Item-based Collaborative Filtering,Item-based CF)。
基于用戶的協同過濾通過計算用戶之間相似度進行推薦,基于物品的協同過濾通過計算基于物品之間相關度進行推薦,這有些拗口,具體的內容會在后文介紹。
2. 數據獲取
由上面的分析,我們可以發現:無論是用戶的相似度計算,還是物品之間的相關性的計算,前提都是要有大量的數據。
那么,如何收集數據呢?
“當你在看風景時,你已成為別人眼中的人風景”,當你刷新聞APP的時候,后臺也在默默記錄你的點擊的新聞、觀看時長、點贊、評論等信息。
比如:新聞APP可能會記錄,用戶小明,早上8點半打開了APP,此時使用4G網絡,同時GPS定位在持續快速移動,他先瀏覽了首頁的推薦新聞,點擊了20條,點贊了5條,單個新聞停留最長時間為3分鐘,之后打開了“財經”板塊,發表了3條評論,快到9點的時候,小明關閉了APP。
同樣的,當你逛電商APP的時候,后臺也會默默記錄你點擊、瀏覽、看評論、加入購物車、購買等行為。
比如,電商可能會記錄,用戶小紅,晚上10點用iPhone打開了APP,此時使用WIFI,GPS定位穩定,她先瀏覽了首頁的個性推薦,點擊了幾個熱銷的女裝,之后在搜索框輸入了口紅,在瀏覽了18支口紅之后,她點擊進入了購物車,把2天前加入購物車的高跟鞋結算了,使用花唄支付,晚上11點,小紅關閉了APP。
數據獲取有幾個需要注意的問題。
首先,是數據量的問題。針對每一個用戶,需要記錄幾乎所有的操作,無論是隱性還是顯性操作,偏好還是厭惡行為,都要把這些行為數據上傳到服務器。如果一個APP有幾億的用戶,同一時刻可能有上百萬的在線瀏覽量,數據量之大可想而知,遇到雙十一、春晚等高流量場景,服務器可能一下子就宕機了。
其次,如何確定用戶身份的問題。一個用戶可能有多個手機;可能使用微信、QQ、手機號、郵箱、微博、淘寶等不用方式登錄;可能使用手機APP,也可能使用電腦瀏覽器。同一個用戶不同終端、賬號的信息要同步,這樣才能準確地計算用戶特征。APP通常會鼓勵用戶同時綁定微博、微信、手機等賬戶,很大程度上也是為了確定用戶的身份。
第三,數據的進一步清洗。比如因為網絡中斷,用戶在短時間內產生了大量點擊的操作,或者手機閃退,造成的信息丟失。這都需要針對每一個情況,具體分析,甚至需要針對每一種情況單獨寫代碼應對,工作量之大,可想而知。
第四,還有難以避免的隱私問題。記錄GPS、上傳通訊錄、訪問內容等算是APP的常規操作,不斷有APP被曝出偷偷錄音、拍照等行為,某互聯網大佬,在論壇上演講直接說出,“多數情況下,中國人愿意用隱私交換便捷性”, 引起輿論嘩然。隱私問題,無法僅僅依靠技術來解決。
3. 基于用戶的協同過濾(User-Based CF)
基于用戶的協同過濾,通過用戶對不同物品的偏好,計算用戶之間的相似度,之后基于用戶的相似度進行推薦,本質上就是將類似的用戶偏好的物品推薦給當前用戶。
亞馬遜的 “瀏覽詞商品的顧客也同時瀏覽”就是User-based協同過濾的典范。比如:在亞馬遜上搜索《統計學習方法》這本書,系統會推薦瀏覽《統計學習方法》這本書的人,也同時瀏覽《機器學習》《深度學習》等書。
基于用戶的協同過濾計算分兩步:第一步,根據用戶行為,計算用戶的相似程度;第二步,把與當前用戶類似的用戶喜歡的物品推薦給當前用戶,這句話同樣拗口,可以參考下圖。
計算用戶的相似度,與前文計算內容之間相似度的方法基本一樣,最常使用的是余弦相似度,通過計算用戶之間的余弦距離,判斷用戶相似程度。
比如下表,代表不同用戶對不同物品的喜好程度。
首先,計算用戶的相似度。用戶A、用戶C都喜歡商品1、商品3,但與用戶B基本沒有什么交集,所以,用戶A和用戶C比較相似。
之后,我們可以把相似用戶喜歡的物品互相推薦給對方。比如:用戶C喜歡物品4,而用戶A沒有買過,我們就把物品4推薦給用戶A,實現了推薦的過程。
這里需要注意的是:我們沒有必要根據用戶C喜歡物品3,就把物品3也推薦給用戶A ,因為物品3已經是用戶A喜歡的,這里沒有必要重復推薦。
4. 基于物品的協同過濾(Item-Based CF)
基于物品的協同過濾,通過分析用戶的記錄,計算物品之間的相關性,推薦與當前物品類似的物品。
基于物品的協同過濾有個經典的案例:超市巨頭沃爾瑪發現購買啤酒的人同時也會購買紙尿布,于是,就把啤酒和紙尿布放在一個貨架上,在這里,啤酒和紙尿布具有很大的相關性。
基于內容的推薦(Content-Based Recommendation)、基于物品的協同過濾(Item-Based Collaborative Filtering),兩者有些類似,都需要計算物品之間的關系,但兩者也有很大的不同。
基于內容的推薦,本質是計算內容本身的相似度。其中最大的問題是:我們無法通過用戶喜歡的音樂,給他推薦類似的電影;用戶購買了電視,我們無法給用戶推薦空調。
基于物品的協同過濾,本質上是通過用戶行為,計算相關性。不需要計算音樂和電影的相似程度,喜歡某首歌的人,也喜歡看某部電影,我們就說這首歌和這部電影有相關性;用戶購買電視的時候,很多時候也會順便購買空調,我們就判斷電視和空調具有相關性。
基于物品的協同過濾,同樣有兩個步驟:第一步,根據用戶行為,計算物品的相關度;第二步,根據用戶的偏好,推薦相關的物品給他。
相似度的計算是都是類似的,通常情況下直接計算余弦距離就可以了。這里著重講一下推薦的過程。
如下表所示:物品1同時受到用戶A、用戶B、用戶C喜歡,物品3同時受到用戶A、用戶B喜歡,而物品2只有用戶B喜歡,我們可以發現物品1和物品3有某種相似性或者相關性。我們就可以把物品3推薦給用戶C,這里同樣要避免重復推薦。
User-Based CF 和Item-Based CF是協同過濾的兩個最基本的算法,有各自的適用場景。User-Based CF計算用戶之間的相似度,適用于用戶較少的場景,Item-Based CF計算物品之間的相似度,適用于產品較少的場景。
User-Based CF很早以前就提出來了,Item-Based CF是從 Amazon 的論文和專利發表之后(2001 年左右)開始流行,其中的一個主要原因是亞馬遜提供很多都是自營服務,商品數量有限,商品的數據也比較穩定,計算起來比較方便。相比之下,用戶的數據就很多,而且分散,計算速度比較慢。
但對于新聞、影視等內容推薦系統,或者淘寶等電商平臺,情況正好是相反的,物品的數量很多,更新頻繁。相比之下,用戶數量就相對較少并且比較穩定了。在這種情況下,就比較適合User CF推薦系統。
5. 協同過濾的特點
協同過濾的優勢顯而易見。
首先,在于充分利用了現有的數據,從而可以挖掘出更多的信息。比如:前面所說的紙尿布和啤酒的相關性,使用基于內容的推薦無論如何也是計算不出來的。
其次,協同過濾可以更加直觀地展示推薦理由。讓人信服的理由,總能激發人們的點擊和購買的欲望。比如:亞馬遜在推薦頁面顯示“瀏覽此商品的顧客也同時瀏覽”就比較有說服力,用戶購買的可能性就比較大。使用基于內容的推薦或者更高級的基于數學模型的推薦算法,往往不能簡潔清楚地說明推薦理由,總不能顯示“根據計算新聞之間的相似度,這篇新聞和某篇新聞比較相似,推薦給你”。
但,協同過濾也存在一些問題。
首先,是數據的問題。在用戶冷啟動或者產品上新時,因為沒有數據,協同過濾就無法實現推薦。與此同時,大量的數據隨著而來的是較大的計算量,在一些實時推薦系統中,應用受到一定限制。
第二,是用戶喜好的變化。不少追星族可能會三天兩頭換一個明星追,在推薦領域,也存在類似的問題。協同過濾通過歷史數據計算用戶的愛好、用戶之間的類似程度,這就存在一個基本假設:用戶會喜歡和他以前喜歡的相似的東西,但用戶的愛好會隨著時間、新產品的出現、營銷等發生改變。
甚至在某種程度上,推薦系統本身就在有意無意地影響用戶的喜好,典型的社交電商會通過各種方式“種草”新的流行產品。
6. 50行代碼實現Item-Based協同過濾
import pandas as pd
import numpy as np
#?原始數據
data = {‘張三’: {‘小時代’: 2.5, ‘大圣歸來’: 3.5, ‘無雙’: 2.5},
‘李四’: {‘小時代’: 3.0, ‘我不是藥神’: 3.5,’致青春’: 1.5, ‘霸王別姬’: 3.0},
‘王五’: {‘小時代’: 2.5,? ‘大圣歸來’: 3.5, ‘霸王別姬’: 4.0},
‘趙六’: {‘我不是藥神’: 3.5, ‘致青春’: 3.0, ‘霸王別姬’: 4.5, ‘無雙’: 2.5},
‘小甲’: {‘致青春’: 2.0,? ‘大圣歸來’: 3.0, ‘無雙’: 2.0},
‘小乙’: {‘我不是藥神’: 4.0, ‘霸王別姬’: 3.0,? ‘無雙’: 3.5},
‘小丙’: {‘我不是藥神’: 4.5, ‘無雙’: 1.0, ‘大圣歸來’: 4.0}}
#讀取數據,清晰數據,數據歸一化[0,1]
data = pd.DataFrame(data)
data = data.fillna(0)
mdata = data.T
np.set_printoptions(3)
mcors = np.corrcoef(mdata, rowvar=0)
mcors = 0.5 + mcors * 0.5
mcors = pd.DataFrame(mcors, columns=mdata.columns, index=mdata.columns)
#計算user-item評分
def cal_score(matrix, mcors, item, user):
totscore = 0;totsims = 0;score = 0
if matrix[item][user] == 0:
for mitem in matrix.columns:
if matrix[mitem][user] == 0:
continue
else:
totscore += matrix[mitem][user] * mcors[item][mitem]
totsims += mcors[item][mitem]
score = totscore / totsims
else:
score = matrix[item][user]
return score
#計算物品之間的相關性
def cal_matscore(matrix, mcors):
score_matrix = np.zeros(matrix.shape)
score_matrix = pd.DataFrame(score_matrix, columns=matrix.columns, index=matrix.index)
for mitem in score_matrix.columns:
for muser in score_matrix.index:
score_matrix[mitem][muser] = cal_score(matrix, mcors, mitem, muser)
return score_matrix
#根據物品相關性,進行推薦
def recommend(matrix, score_matrix, user):
user_ratings = matrix.ix[user]
not_rated_item = user_ratings[user_ratings == 0]
recom_items = {}
#排除用戶已經看過的電影
for item in not_rated_item.index:
recom_items[item] = score_matrix[item][user]
recom_items = pd.Series(recom_items)
#推薦結果排序
recom_items = recom_items.sort_values(ascending=False)
return recom_items[:1]
score_matrix = cal_matscore(mdata, mcors)
user = input(‘請輸入用戶名:’)
recom_items=recommend(mdata, score_matrix, user)
print(recom_items)
如果你的電腦有Python環境,運行這個程序,按照提示輸入,就可以看到輸出結果:
你可以對這些Python語言不太了解、對編程也不太感興趣,但你不用知道每行代碼用什么用,如何運行這些代碼,只需要有個直觀的印象,直觀了解程序員每天的工作——協同過濾原來是這么做的呀。
首先獲取User-Item信息,進行數據處理,計算用戶或者物品之間的相關性,最后進行推薦就好了。每一個步驟都可以用一個代碼模塊寫出來,之后匯總到一起就可以了。
在實際寫代碼的過程中,也有開源的解決方案可以使用,在開源解決方案的基礎上,可以在較短的時間內、花費較短的成本,獲得可靠的解決方案。
當然,現實中的推薦系統沒有這么簡單,應用場景不同,使用的算法、系統的配置也不盡相同,程序員要花很多時間在系統的配置上,這個我們在最后會講到。
四、現實中的推薦系統
1. 如何實現冷啟動
在推薦系統中,數據積累量較少,無法給新用戶或者新產品做個性推薦,這就是冷啟動問題。沒有用戶數據,就沒辦法推薦;沒有更好的推薦,用戶留下的數據就很少,這也是一個先有雞還是先有蛋的問題。
冷啟動問題基本可以分為兩類:用戶冷啟動和物品冷啟動。顧名思義,用戶冷啟動指如何給新用戶進行個性化推薦。
物品冷啟動指:如何將新的物品推薦給可能對它感興趣的用戶?
產品經理、程序員、創業者想了很多辦法來解決冷啟動問題,最常見的兩種解決辦法。
第一種解決方式是:大眾推薦。
通常20%的產品獲得了80%的關注和流量,給用戶推薦一些熱門產品,比如:熱搜榜、熱銷榜等,點擊率也不錯,通過這種方式,可以滿足用戶的基本需求。對于一些新上架的商品或者新的音樂,也會有新品榜單獨推薦,以此解決物品冷啟動的問題。
第二種方式是:盡可能獲得更多的信息。
比如:在用戶注冊時候,激勵用戶綁定微博賬號,從微博的數據接口,可以發掘用戶的一些偏好;激勵用戶選擇一些感興趣的博主或者板塊,可以直接獲得用戶的喜好;利用用戶注冊時填寫的年齡、性別、手機號碼(歸屬地)甚至教育程度等信息,也可以獲得很多有用的數據。
一些APP或者網頁也會開發出有趣的測試,獲得用戶的偏好。
2. 位置和時間約束
地理位置約束:
在很多情況下,地理位置是推薦系統最常見的一個約束,不少外賣、本地電商等平臺,在排序中也有距離優先的選項。比如:我們使用本地電商平臺找餐廳,通常情況下,我們不會跑大半個城市吃飯,所以APP會推薦較近的餐廳。
那么,如何實現基于地理位置進行個性推薦呢?
常見的方式是在排序的時候,對距離添加一個權重,如果距離越近,相應的權重越高,排名越靠前。比如:我們在杭州火車站搜索餐館,會優先推薦附近的,這也是搜索引擎和個性推薦的一個交集。
為了加快計算速度,通常會采用樹狀存儲,比如:下面這張圖,可以通過杭州、上城區、火車站,快速找到火車站范圍內的餐館。
時間約束:
在協同過濾中,我們講到,用戶的喜好可能會隨著時間發生改變,比如:電商產品在賣衣服時,冬天推薦的衣物和夏天推薦的衣物是不同的;上班時候上看的新聞跟下班看的也可能不一樣。這就要求我們在進行推薦的時候,把時間這個因素考慮進去。
最常用的處理方式,是在推薦中添加跟時間相關的權重。比如:用戶一個月前加入購物車跟今天加入購物車的行為應該有不同的權重,今天的行為權重更高,在個性推薦時,應更多地根據今天的行為進行推薦,這也是電商APP實時更新推薦商品的重要方式。
實時熱榜,也是利用時間約束的一個范例,用戶可以關注時下最流行的新聞、衣服、電影等,閱讀時長、購買轉化率等都會有很大的提高。比如:微博的Slogan就是“隨時隨地,發現新鮮事”,把熱點利用到了極致。
3. 推薦系統架構
融合:
在實際使用中,單獨使用一種推薦系統無法解決所有的問題,推薦系統需要將用戶的行為、物品的特征、時間和地理條件等考慮進去。通常情況下,推薦系統會同時使用基于內容的推薦、協同過濾、基于時間的推薦等作為推薦引擎,之后,對這些推薦結果進行按照一定權值進行合并。
這樣的好處非常明顯,每一個推薦引擎都實現了特定的目的,相當于解耦合,降低了系統的復雜度,我們可以單獨調整某個模塊進行優化。
需要注意的是:推薦引擎也會添加一些大眾推薦或者隨機推薦,以增加系統的多樣性,給用戶帶來新鮮感。同時,在某種程度上也可以避免“信息繭房”的道德指責。比如推薦音樂,如果完全按照用戶的習慣進行推薦,結果往往就局限在一個很小的范圍——聽民謠的人,可能永遠不會被推薦搖滾,這就需要加入大眾推薦或者隨機推薦,適當拓展推薦的內容。
過濾:
過濾是對初始的推薦結果進行處理,這里主要有兩個方面的過濾。
一方面,為了針對實際需求,對推薦結果進行篩選。
最常見的是過濾熱門的物品,比如:TFBOYS新出了一首歌,成為爆款,很多年輕人都聽過,再把這首歌推薦給用戶可能就沒有什么意義。
除此之外,還需要過濾用戶已經看過的新聞、電影、購買過的商品,比如:我們已經買了一款手機,電商APP還在一直推薦,我們就會覺得這個APP很傻。針對一些質量差、評價低的商品,也可以有選擇的過濾,比如電商APP會折疊一些低質低價的商品。
另一方面,是合規的需求。
無論是什么產品,都要合法合規,今日頭條等不少內容平臺,也加大力度,對熱搜、推薦進行審查。
比如:今日頭條成立早期,官媒就連發評論,批評其讓用戶困在信息繭房,低俗內容污染網絡生態,字節跳動旗下內涵段子就被廣電總局永久關停。為此,今日頭條張一鳴公開道歉,聲稱要傳播正能量,符合時代要求,尊重公序良俗。
4. 現實中的推薦系統
個性推薦系統可以提高用戶體驗,增加用戶使用時長,提高銷量,但在實踐上,根據應用場景和數據規模的不同,系統的差異也非常大。
對小型的網頁或者APP而言,由于成本、內容數量、技術的限制,很可能是不進行個性推薦的,運營人員直接編輯推薦或者通過熱度進行大眾推薦,可以滿足一般的使用。
對于稍大些的網頁或者APP,可能在單個或較少的服務器上就可以搭建出推薦系統,每天進行離線特征提取、模型訓練,訓練完成之后,再上線運行。對于這類需求而言,有成熟的開源推薦系統可以使用,比如Spark的機器學習(Machine Learning,ML)模塊可以直接使用。
離線數據處理,對一段時間(比如一天)的數據進行集中計算,對于用戶今天的操作,可能第二天才會更新模型,并進行個性推薦。離線數據處理實現起來比較簡單,但速度慢是硬傷。與離線數據處理對應的是在線處理,兩者最大的差別是數據處理是不是實時的。
比如:我們點擊商品之后,個性推薦就會實時更新,這個是根據用戶的數據,實時進行處理。在線數據處理要求實時記錄用戶行為、上傳到服務器、進行推薦、之后再反饋給用戶,完成整個過程可能只有50ms的時間,眨眼的時間200ms,真真一眨眼的功夫就計算好了。
對于大型的信息或者電商平臺,可能有百萬的用戶同時在線,數據量也急劇上升,通常采用實時數據處理和離線數據處理相結合的方式。
由前面章節的介紹,我們知道:當用戶數據量增加十倍,系統的復雜度可能不是十倍增加,而是上百倍的增加,甚至直接演變成了另外一個系統。
復雜系統的每一個環節都有可能成為系統的短板,進而拉低整個系統的運行效率,所以就需要對整個系統進行重新開發。大多數時候也不是簡單的推倒再來,而是在現有基礎上進行的修改,這就像在老城區開發一樣,既要維持現有的秩序,又要滿足不斷增長的流量需求。
對于大數據離線處理而言,單個服務器的數據存儲容量、處理速度有限,通常使用幾十甚至上百個服務器同時進行數據存儲和計算,如同上百人的大公司一樣,人與人之間的交流和分工,要耗費大量的時間和精力。
上百服務器通常作為一個集群,使用分布式管理,比如:使用開源的工具Hadoop作為整個分布式系統的基礎架構,使用Hive進行分布式存儲,使用Spark進行分布式計算和數據挖掘。
幸運的是,這些優秀的工具都是開源的,這也是互聯網發展速度非??斓闹匾?。相比之下,不少行業更加封閉,一個公司老員工、新員工之間的技術交流尚且不暢,更別說不同公司之間的技術共享了。
對實時數據處理而言,處理速度是最大的追求,通常使用“流”式處理,就像生產工廠的流水線一樣,數據實時從用戶傳到服務器集群,服務器對接收的數據處理、更新模型、保存結果,客戶端實時獲取這些更新。
大規模的數據處理,特別是實時處理,要花不少時間在系統的架構、調試上,還要時不時面對流量過高的宕機風險,這種情況下進行個性推薦,有時候,難度可能不在推薦算法本身。
本文由@linghu 原創發布于人人都是產品經理,未經許可,禁止轉載
題圖來自Unsplash, 基于CC0協議
請問 {‘小時代‘: 2.5, ‘大圣歸來‘: 3.5, ‘無雙‘: 2.5},這里面的2.5,3.5是怎么計算出來的呢?
“常用的關鍵詞獲取技術是上一章《搜索引擎》所講的TF-IDF(Term Frequency–Inverse Document Frequency)模型,通過分詞、去除關鍵詞、計算每個詞出現的頻率獲得TF” —–>應該是通過分詞、去除停用詞/功能詞、計算每個關鍵詞吧
干貨,正在學習中!
滿屏都是干貨
受益匪淺,請問在推薦系統這方面,有什么書或者課程可以學習嗎,先謝謝啦?
2012年有本《推薦系統實踐》,不過都是比較傳統的推薦方式了,現在很多都轉深度學習了,相關的書籍和課程還比較少。
好的,謝謝~
難的干貨
真是一篇好文章