1. 前言
在之前總結過協同過濾的召回通路後,今天我們來總結下召回策略中的重頭戲:基於內容的召回通路,也即我們常說的基於標籤的召回。這裡就要涉及兩個一直很流行的詞彙:使用者畫像User Profile和物品畫像Item Profile。
說回推薦系統,它的使命就是,要在使用者(User)和物品(Item)之間建立連線。那麼使用者畫像和物品畫像是否是推薦系統的“銀彈”呢?答案肯定不是,但也不能說使用者畫像一無是處。
使用者畫像只是推薦系統構建過程中的一個副產品,而不是推薦系統的目的。歸根結底,使用者畫像是給機器看的,而不是給使用者看的,所以越酷炫的使用者畫像越沒什麼用。在使用機器學習、深度學習時,使用者畫像的維度、數量、量化等,這些往往是不可解釋的。所以,不要把使用者畫像看的那麼重要,但是,實際工作中,推薦系統的召回側,標籤化的內容召回,效果往往會比其他策略要好很多,而標籤化的迭代往往是一個長期持久的過程。
為何一定要做好內容的推薦呢?這是因為,通常一個推薦系統往往從基於內容開始成長。推薦最開始的時候,內容資料很好獲得,不需要有使用者資料就可以做出推薦系統。內容資料是基礎,只要深入挖掘,就可以挖掘出一些很有用的資訊給推薦系統用。
然後,當最初的推薦結果反饋給使用者後,使用者的行為資料可以作為協同過濾等其他召回通路的資料輸入源。
那麼,今天我們就來聊聊基於內容的推薦召回。
2. 構建畫像
現在我們來一起聊聊如何構建畫像,拿使用者畫像來說,有兩個關鍵因素:維度、量化。對於維度來說,比如性別、年齡、價格等,我們在處理資料時,要銘記一點,這些資料是讓機器去學習的,不一定讓人類能夠理解,後續我會總結在模型構建時,相關資料格式的處理。
說說量化,在實際的生產系統中,畫像每個維度的量化,應該交給機器,而且以目標為導向,以結果來反向優化才有意義。
那麼如何構建畫像呢?常見的有三種方法:
- 查戶口:直接使用最原始的資料作為畫像的內容,如:性別、年齡、區域、興趣愛好等等,在經過資料清洗挖掘階段後,這些資料往往在冷啟動等場景下有很好的作用。
- 堆資料:堆積歷史資料,也就是在使用者有一定行為後,對歷史資料進行挖掘,構建標籤系統,然後基於這些標籤,進行各種維度的統計,這些統計結果就可以作為量化指標。
- 黑盒子:這個呢,就是使用機器學習、深度學習等方法,學習出人類無法理解的user_embedding,在推薦的中後期迭代中,承擔非常大的作用。
那該如何把內容推薦做好呢?從技術層面上來說,需要做好:抓、洗、挖、算,這四門功課。
抓:爬蟲,很多公司都會有爬蟲組,在公司的資料基礎上,獲取更多網際網路的資料來補充自己的內容源,增加分析的維度
洗:清洗,抓取過來的資料,必須洗洗才會更健康,冗餘、黃賭毒等敏感及黑名單資料需要清洗
挖:挖掘,不管是自己的資料還是抓取過來的的資料,在清洗之後,需要深入挖掘,統計各維度的結果
算:計算,匹配使用者和物品的屬性,然後計算出更合理的推薦結果
整體上的流程,是這樣的:基於現有的資料來源,對內容進行分析,得到結構化的內容庫和內容模型,然後根據標籤給使用者推薦結果,在使用者使用產品後,對行為資料進行分析,構建使用者的標籤。而同時對於那些沒有歷史行為的使用者,可以根據最初的標籤,直接拿標籤去推薦,所以基於內容的推薦,也常常作用於冷啟動過程。
3. 內容召回的演算法
說完流程,我們來談談基於內容召回,經常使用的一些演算法。
從最初的資料來源開始,對於文字資料,經常的做法就是:
- 把非結構化的文字結構化
- 根據使用者行為資料,把物品的結構化結果傳給使用者,與使用者結構化資訊合併
對於文字結構化的處理上來說,一般使用比較多的就是NLP相關演算法:
- TF-IDF:目前我經常用的就是,可以提取出item的關鍵詞詞頻,然後建立關鍵詞和item的倒排表。
- Kmeans:可以對使用者、物品分別聚類,根據聚類進行鍼對性推薦
- Word2vec:計算詞向量,擴充結構化標籤;累加得到一個文字的稠密向量;聚類,得到更好的聚類效果
- 其他:LDA主題識別,TextRank演算法,UGC內容分類,卡方檢驗CHI和資訊增益IG
在具體的實踐中,我目前的做法是:
- 針對item,利用TF-IDF,計算出每個item的關鍵詞,然後在ES中構建關鍵詞-item的倒排表,如:劍南春:[item1:0.9, item2:0.7, item100:0.5...]
- 擷取近30天內使用者的行為資料,統計出使用者每個關鍵詞的比例,如:劍南春-0.5,茅臺0.2,五糧液0-0.2,瀘州老窖-0.1,這個過程用hive、spark都可以統計出來
- 假如內容召回100個,那麼拿著關鍵詞去es中,提取每個關鍵詞對應的item數量,如:劍南春-50個,茅臺-20個,五糧液-20個,瀘州老窖-10個
通過這樣的方法,就完成了基於內容的召回,真的不難。就是給每個item打標籤,然後統計使用者的標籤比例,然後根據召回的個數,對應的去資料庫裡拿item就結束了。
當然,在打標籤的時候,根據內容的特點,去針對性的選擇演算法,篩選完後,再選擇es或redis等查詢快速的資料庫儲存即可。
而在實際工作中,標籤打的越多,對使用者的喜好也就越準確,但是,耗費的精力也就越多。召回階段是推薦系統的一部分,沒必要在某一個節點做的太過細緻,就目前業界的趨勢來說,更多的是用機器學習,深度學習等演算法,去提升生產力,所以適度的標籤化即可,也就是前面提到的,使用者畫像不是推薦系統的目的,而是附帶的產品。
好了,關於基於內容的召回,就總結到這裡,還是那句話,思路最重要,具體使用什麼演算法,使用什麼工具,需要根據資料的特點來選擇。學習就應該從全域性到區域性,由上至下的思想,才會把知識體系構建出來。
後續我會針對演算法進行詳細的總結,拜了個拜~