背景
對個人來說,推薦系統起著信息過濾的作用;對 Web/App 來說,推薦系統起著 滿足用戶個性化需求,提升用戶滿意度的作用。亞馬遜推薦產生的成交額佔其 GMV 的 30%以上;Netflix 推薦系統每年幫其節省了近 10 億美金的業務費用。
推薦系統越來越實時化。當一個會員訪問 Netflix,Netflix 希望能夠幫助他在幾秒鐘之內就找到他感興趣的影片,以免他去尋找別的娛樂方式。
概述
推薦就是把用戶的興趣與物品做鏈接。但通常情況下,用戶和物品之前不會有直接的關係(比如用戶根本沒看過這個物品,自然也不會有瀏覽、點擊、收藏、喜歡等聯繫),需要一些中間元素來做橋接。
根據中間元素的不同,推薦的思路大概分下面三類:
- 物品:推薦和用戶過去喜歡的物品相識的物品;
- 用戶:推薦和當前用戶興趣相近的用戶喜歡過的物品;
- 特徵:推薦符合用戶過去喜歡的物品特徵的物品。
本文重點介紹基於特徵的推薦:基於標籤的實時推薦。
標籤是特徵的一種表現形式,標籤再弱化一些,就是類別。
說明:
基於標籤的推薦其實應用很普遍,比如豆瓣,比如淘寶,都用到了大量的標籤,這樣的推薦系統有很多優點,比如實現簡單、可解釋性好等等。 一個簡單的基於標籤的實時推薦系統大概分三部分:
- 標籤系統
- 數據流處理系統
- 根據用戶標籤篩選出要推薦的內容
作為示例,假設業務需求描述為: 用戶最近點擊了什麼樣的內容,把類似的內 容推薦給他。
說明:
上圖綠色實線部分是在線的實時流,藍色虛線部分是離線計算的非實時部分。
標籤系統
標籤系統就是俗稱的用戶畫像。 從屬性變化性質來分,標籤系統可分為靜態標籤和動態標籤:
- 靜態標籤: 短時間內變化不大的標籤,比如性別、地域、職業、生活習 慣等;
- 動態標籤: 不斷變化的行為標籤,比如關注的產品類別、產品偏好、內 容偏好等 從更新時間的頻率上來說,又可以分為短期興趣標籤和長期用戶標籤。
說明:
短期標籤的更新頻率是分鐘級或秒級。
在這個簡化的推薦系統裡,我們只考慮實時部分(綠色實線部分)是可以滿足需 求的。 所以只考慮短期興趣標籤的計算,還是出於簡化問題的考慮,我們假設 現在只有四個標籤,描述用戶對內容類別的感興趣程度:美妝、汽車、衣服、電 子產品。 對一個用戶來說,可以用 0-1 的浮點值來描述其感興趣程度(也可以 更簡化,大於某個閾值為 1,小於某個閾值為 0)。
數據流處理系統(實時)
主要是綠色實線部分,針對系統推薦的內容。 用戶有兩種行為,點擊或不點擊,這個事件推送到實時計算(其實是兩個流,一
個是點擊流,一個是曝光流,這兩個流根據用戶 ID、內容 ID 做 J)。
實時計算實時計算過去 N 秒(N 可以根據業務需求取值,比如 60,這就是一個 事件窗口)內每個用戶針對四種內容類別的點擊率,然後把這個點擊率作為用戶 的短期興趣標籤。
比如用戶 a:
內容篩選系統
內容篩選系統就是根據用戶的短期興趣標籤去篩選內容。 假設所有的內容都存
儲到某個數據庫裡,並打好了內容標籤。 比如文檔 1:
推薦流程是:用戶發起訪問⇒找到用戶短期興趣標籤⇒計算文檔與用戶標籤的相似度⇒相似度排序⇒展示內容。
總結
上文描述了一個簡單的基於實時計算的實時推薦系統。
可以進一步簡化:把所有的 0-1 區間內的值替換成 0 或 1。這樣,每個用戶的興趣標籤只有是否,文章的標籤也是確定的。直接用搜索的方式就能完成內容篩選部分。比如當前用戶最近60秒的興趣標籤是汽車,那麼直接去內容庫裡搜索含 有汽車標籤的內容並推送。
也可以逐步替換各個組件,升級成一個更完備和專業的實時推薦系統。
專注於技術熱點大數據,人工智能,JAVA、Python、 C 、GO、Javascript等語言最新前言技術,及業務痛點問題分析,請關注【編程我最懂】共同交流學習。
閱讀更多 編程我最懂 的文章