產品經理需要了解的算法——熱度算法和個性化推薦

88 評論 132639 瀏覽 1762 收藏 28 分鐘

本文作者以新聞產品為例,并結合自己之前產品從零積累用戶的經驗,從而整理了作為PM需要了解的基本算法知識和實操。enjoy~

今日頭條的走紅帶動了“個性化推薦”的概念,自此之后,內容型的產品,個性化算法就逐漸從賣點變為標配。伴隨著“機器學習”,“大數據”之類的熱詞和概念,產品的檔次瞬間提高了很多。而各種推薦算法絕不僅僅是研發自己的任務,作為產品經理,必須深入到算法內部,參與算法的設計,以及結合內容對算法不斷“調教”,才能讓產品的推薦算法不斷完善,最終與自己的內容雙劍合璧。

本文以新聞產品為例,結合了我之前產品從零積累用戶的經驗,整理了作為PM需要了解的基本算法知識和實操。

1. 算法的發展階段

個性化推薦不是產品首次發布時就能帶的,無論是基于用戶行為的個性化,還是基于內容相似度的個性化,都建立在大量的用戶數和內容的基礎上。產品發布之初,一般兩邊的數據都有殘缺,因此個性化推薦也無法開展。

所以在產品發展的初期,推薦內容一般采用更加聚合的“熱度算法”,顧名思義就是把熱點的內容優先推薦給用戶。雖然無法做到基于興趣和習慣為每一個用戶做到精準化的推薦,但能覆蓋到大部分的內容需求,而且啟動成本比個性化推薦算法低太多。

因此內容型產品,推薦在發布初期用熱度算法實現冷啟動,積累了一定量級以后,才能逐漸開展個性化推薦算法。

2. 熱度算法

2.1 熱度算法基本原理

需要了解的是,熱度算法也是需要不斷優化去完善的,基本原理:

新聞熱度分 = 初始熱度分 + 用戶交互產生的熱度分 – 隨時間衰減的熱度分

Score = S0 + S(Users) – S(Time)

新聞入庫后,系統為之賦予一個初始熱度值,該新聞就進入了推薦列表進行排序;隨著新聞不斷被用戶點擊閱讀,收藏,分享等,這些用戶行為被視作幫助新聞提升熱度,系統需要為每一種新聞賦予熱度值;同時,新聞是有較強時效性的內容,因此新聞發布之后,熱度必須隨著新聞變得陳舊而衰減。

新聞的熱度就在這些算法的綜合作用下不斷變化,推薦列表的排序也就不斷變化。

2.2 初始熱度不應該一致

上面的算法為每一條入庫的新聞賦予了同樣的熱度值,但在現實使用后發現行不通,例如娛樂類別比文化類別受歡迎程度本身就高很多;或者突發了嚴重的災害或事故;或是奧運會期間,體育類別的關注度突然高了起來;而此時如果還是每條新聞給同樣的熱度就不能貼合實際了。

解決辦法就是把初始熱度設置為變量:

(1)按照新聞類別給予新聞不同的初始熱度,讓用戶關注度高的類別獲得更高的初始熱度分,從而獲得更多的曝光,例如:

(2)對于重大事件的報道,如何讓它入庫時就有更高的熱度,我們采用的是熱詞匹配的方式。

即對大型新聞站點的頭條,Twitter熱點,競品的頭條做監控和扒取,并將這批新聞的關鍵詞維護到熱詞庫并保持更新;每條新聞入庫的時候,讓新聞的關鍵詞去匹配熱詞庫,匹配度越高,就有越高的初始熱度分。

這樣處理后,重大事件發生時,Twitter和門戶網站的爭相報道會導致熱詞集中化,所有匹配到這些熱詞的新聞,即報道同樣事件的新聞,會獲得很高的初始熱度分。

2.3 用戶行為分規則不是固定不變的

解決了新聞入庫的初始分之后,接下來是新聞熱度分的變化。先要明確用戶的的哪些行為會提高新聞的熱度值,然后對這些行為賦予一定的得分規則。例如對于單條新聞,用戶可以點擊閱讀(click),收藏(favor),分享(share),評論(comment)這四種行為,我們為不同的行為賦予分數,就能得到新聞的實時用戶行為分為:

S(Users) = 1*click + 5*favor + 10*comment + 20*share

這里對不同行為賦予的分數為1,5,10,20,但這個值不能是一成不變的;當用戶規模小的時候,各項事件都小,此時需要提高每個事件的行為分來提升用戶行為的影響力;當用戶規模變大時,行為分也應該慢慢降低,因此做內容運營時,應該對行為分不斷調整。

當然也有偷懶的辦法,那就是把用戶規模考慮進去,算固定用戶數的行為分,即:

S(Users) = (1*click + 5*favor + 10*comment + 20*share)/DAU * N(固定數)

這樣就保證了在不同用戶規模下,用戶行為產生的行為分基本穩定。

2.4 熱度隨時間的衰減不是線性的

由于新聞的強時效性,已經發布的新聞的熱度值必須隨著時間流逝而衰減,并且趨勢應該是衰減越來越快,直至趨近于零熱度。換句話說,如果一條新聞要一直處于很靠前的位置,隨著時間的推移它必須要有越來越多的用戶來維持。

我們要求推薦給用戶的新聞必須是24h以內,所以理論上講,衰減算法必須保證在24h后新聞的熱度一定會衰減到很低,如果是線性衰減,當某些新聞突然有大量用戶閱讀,獲得很高的熱度分時,可能會持續排名靠前很久,讓用戶覺得內容更新過慢。

參考牛頓冷卻定律,時間衰減因子應該是一個類似于指數函數:

T(Time) = e ^ (k*(T1 – T0))?

其中T0是新聞發布時間,T1是當前時間。

而由于熱度的發展最終是一個無限趨近于零熱度的結果,最終的新聞的熱度算法也調整為:

Score = ( S0(Type) + S(Users) ) / T(Time)

2.5 其他影響因素

很多新聞產品會給用戶“贊”,“踩”或“不在推薦此類”的選項,這些功能不僅適用于個性化推薦,對熱度算法也有一定的作用。

新聞的推送會造成大量的打開,在計算熱度的時候需要排除掉相關的影響。類似于這樣的因素,都會對熱度算法產生影響,因此熱度算法上線后,依然需要不斷地“調教”。建議把所有的調整指標做成可配項,例如初始熱度分,行為事件分,衰減因子等,從而讓產品和運營能實時調整和驗證效果,達到最佳狀態。

3. 基于內容的推薦算法

現在,你的內容產品順利度過了早期階段,擁有了幾萬甚至十幾萬級別的日活。這時候,你發現熱度算法導致用戶的閱讀內容過于集中,而個性化和長尾化的內容卻鮮有人看,看來是時候開展個性化推薦,讓用戶不僅能讀到大家都喜歡的內容,也能讀到只有自己感興趣的內容。

個性化推薦一般有兩種通用的解決方案,一是基于內容的相關推薦,二是基于用戶的協同過濾。由于基于用戶的協同過濾對用戶規模有較高要求,因此更多使用基于內容的相關推薦來切入。

這里引入一個概念叫“新聞特征向量”來標識新聞的屬性,以及用來對比新聞之間的相似度。我們把新聞看作是所有關鍵詞(標簽)的合集,理論上,如果兩個新聞的關鍵詞越類似,那兩個新聞是相關內容的可能性更高。 新聞特征向量是由新聞包含的所有關鍵詞決定的。得到新聞特征向量的第一步,是要對新聞內容進行到關鍵詞級別的拆分。

3.1 分詞

分詞需要有兩個庫,即正常的詞庫和停用詞庫。正常詞庫類似于一本詞典,是把內容拆解為詞語的標準;停用詞庫則是在分詞過程中需要首先棄掉的內容。

停用詞主要是沒有實際含義的,例如“The”,“That”,“are”之類的助詞;表達兩個詞直接關系的,例如“behind”,“under”之類的介詞,以及很多常用的高頻但沒有偏向性的動詞,例如“think”“give”之類。顯而易見,這些詞語對于分詞沒有任何作用,因此在分詞前,先把這些內容剔除。

剩下對的內容則使用標準詞庫進行拆詞,拆詞方法包含正向匹配拆分,逆向匹配拆分,最少切分等常用算法,這里不做展開。

因為網絡世界熱詞頻出, 標準詞庫和停用詞庫也需要不斷更新和維護,例如“藍瘦香菇”,“套路滿滿”之類的詞語,可能對最終的效果會產生影響,如果不及時更新到詞庫里,算法就會“一臉懵逼”了。

因此,推薦在網上查找或購買那些能隨時更新的詞庫,各種語種都有。

3.2 關鍵詞指標

前面已經說過,新聞特征向量是該新聞的關鍵詞合集,那關鍵詞的重合度就是非常重要的衡量指標了。

那么問題來了,如果兩條新聞的關鍵詞重合度達到80%,是否說明兩條新聞有80%的相關性呢?

其實不是,舉個例子:

(1)一條“廣州摩拜單車投放量激增”的新聞,主要講摩拜單車的投放情況,這篇新聞里“摩拜單車”是一個非常高頻的詞匯,新聞在結尾有一句“最近廣州天氣不錯,大家可以騎單車出去散心”。因此“廣州天氣”這個關鍵詞也被收錄進了特征向量。

(2)另外一條新聞“廣州回南天即將結束,天氣持續好轉”,這篇新聞結尾有一句“天氣好轉,大家可以騎個摩拜單車出門溜溜啦”,新聞里面“廣州天氣”是非常高頻的詞匯,“摩拜單車”盡管被收錄,但只出現了一次。

這兩個新聞的關鍵詞雖然類似,講的卻是完全不同的內容,相關性很弱。如果只是看關鍵詞重合度,出現錯誤判斷的可能性就很高;所以特征向量還需要有第二個關鍵詞的指標,叫新聞內頻率,稱之為TF(Term Frequency),衡量每個關鍵詞在新聞里面是否高頻。

那么問題來了,如果兩條新聞的關鍵詞重合度高,新聞中關鍵詞的頻率也相差無幾,是否說明相關性很強呢?

理論上是的,但又存在另外一種情況:如果我們新聞庫里所有的新聞都是講廣州的,廣州天氣,廣州交通,廣州經濟,廣州體育等,他們都是講廣州相關的情況,關鍵詞都包含廣州,天河,越秀,海珠(廣州各區)等,并且有著類似的頻率,因此算法很容易將它們判斷為強相關新聞;從地域角度講,這種相關性確實很強,但從內容類別層面,其實沒有太多相關性,如果我是一個體育迷,你給我推薦天氣,交通之類的內容,就沒多大意義了。

因此引入第三個關鍵詞的指標,即關鍵詞在在所有文檔中出現的頻率的相反值,稱之為IDF(Inverse Document Frequency)。為什么會是相反值?因為一個關鍵詞在某條新聞出現的頻率最大,在所有文檔中出現的頻率越小,該關鍵詞對這條新聞的特征標識作用越大。

這樣每個關鍵詞對新聞的作用就能被衡量出來即TFIDF=TF * IDF,這也就是著名的TF-IDF模型。

3.3 相關性算法

做完分詞和關鍵詞指標后,每一篇新聞的特征就能用關鍵詞的集合來標識了:

其中word0,1,2……n是新聞的所有關鍵詞,tfidf0,1,2……n則是每個關鍵詞的tfidf值。

兩個新聞的相似度就能通過重合的關鍵詞的tfidf值來衡量了。根據之前所學的知識,幾何中夾角余弦可以用來衡量兩個向量的方向的差異性,因此在我們的算法中使用夾角余弦來計算新聞關鍵詞的相似度。夾角越小,相似度越高。

有了關鍵詞和各關鍵詞的tfidf之后,就可以計算新聞的相似度了。假設兩條新聞的特征列表如下:

可以看到兩條新聞有5個重合的關鍵詞:廣州,摩拜單車,太陽,天河和市長,因此兩條新聞的相關性由這5個關鍵詞決定,計算方式如下:

得出兩條新聞的相關性最終值;用同樣的方法能得出一條新聞與新聞庫里面所有內容的相關性。

3.4 用戶特征

得到新聞特征以后,還需要得到用戶特征才能對兩者進行匹配和推薦,那怎么獲得用戶特征呢?

需要通過用戶的行為來獲得,用戶通過閱讀,點贊,評論,分享來表達自己對新聞內容的喜愛;跟熱度排名類似,我們對用戶的各種行為賦予一定的“喜愛分”,例如閱讀1分,點贊2分,評論5分等,這樣新聞特征跟用戶行為結合后,就能得到用戶的特征分。

而隨著用戶閱讀的新聞數越來越多,該用戶的標簽也越來越多,并且越發精準。

從而當我們拿到新聞的特征后,就能與用戶的關鍵詞列表做匹配,得出新聞與用戶閱讀特征的匹配度,做出個性化推薦。

3.5?其他運用

除了個性化推薦,基于內容的相關性算法能精準地給出一篇新聞的相關推薦列表,對相關閱讀的實現非常有意義。此外,標簽系統對新聞分類的實現和提升準確性,也有重要的意義。

3.6?優缺點

基于內容的推薦算法有幾個明顯優點:

  1. 對用戶數量沒有要求,無論日活幾千或是幾百萬,均可以采用;因此個性化推薦早期一般采用這種方式;
  2. 每個用戶的特征都是由自己的行為來決定的,是獨立存在的,不會有互相干擾,因此惡意刷閱讀等新聞不會影響到推薦算法。

而最主要的缺點就是確定性太強了,所有推薦的內容都是由用戶的閱讀歷史決定,所以沒辦法挖掘用戶的潛在興趣;也就是由于這一點,基于內容的推薦一般與其他推薦算法同時存在。

4.?基于用戶的協同推薦

終于,經過團隊的努力,你的產品已經有了大量活躍用戶了,這時候你開始不滿足于現有的算法。雖然基于內容的推薦已經很精準了,但總是少了那么一點性感。因為你所有給用戶的內容都是基于他們的閱讀習慣推薦的,沒能給用戶“不期而遇”的感覺。

于是,你就開始做基于用戶的協同過濾了。

基于用戶的協同過濾推薦算法,簡單來講就是依據用戶A的閱讀喜好,為A找到與他興趣最接近的群體,所謂“人以群分”,然后把這個群體里其他人喜歡的,但是A沒有閱讀過的內容推薦給A;舉例我是一個足球迷,系統找到與我類似的用戶都是足球的重度閱讀者,但與此同時,這些“足球群體”中有一部分人有看NBA新聞的習慣,系統就可能會給我推薦NBA內容,很可能我也對NBA也感興趣,這樣我在后臺的興趣圖譜就更完善了。

4.1 用戶群體劃分

做基于用戶的協同過濾,首先就要做用戶的劃分,可以從三方面著手:

(1)外部數據的借用

這里使用社交平臺數據的居多,現在產品的登錄體系一般都借用第三方社媒的登錄體系,如國外的Facebook、Twitter,國內的微信、微博,借用第三方賬戶的好處多多,例如降低門檻,方便傳播等,還能對個性化推薦起到重要作用。因為第三方賬戶都是授權獲取部分用戶信息的,往往包括性別,年齡,工作甚至社交關系等,這些信息對用戶群劃分很有意義。

此外還有其他的一些數據也能借用,例如IP地址,手機語種等。

使用這些數據,你很容易就能得到一個用戶是北京的還是上海的,是大學生還是創業者,并依據這些屬性做準確的大類劃分。比如一篇行業投資分析出來后,“上海創業圈”這個群體80%的用戶都看過,那就可以推薦給剩下的20%。

(2)產品內主動詢問

常見在產品首次啟動的時候,彈框詢問用戶是男是女,職業等,這樣能對內容推薦的冷啟動提供一些幫助。但總體來說,性價比偏低,只能詢問兩三個問題并對用戶的推薦內容做非常粗略的劃分,同時要避免打擾到用戶;這種做法算是基于用戶個性化的雛形。

(3)對比用戶特征

前文已經提到過,新聞的特征加用戶的閱讀數據能得到用戶的特征,那就可以通過用戶特征的相似性來劃分群體。

4.2 內容推薦實施

我們結合一個很小的實例來了解用戶協同過濾的原理,包括如何計算用戶之間的相似性和如何做出推薦。假設有A、B、C、D和E共5個用戶,他們各自閱讀了幾篇新聞并做出了閱讀,贊,收藏,評論,分享操作,我們對這幾種行為賦予的分數分別為1分、2分、3分、4分和5分,這樣用戶對每條新聞都有自己的得分,其中“-”表示未閱讀,得分如下:

接下來,我們需要給用戶E推薦4,5,6中的哪一篇?

用戶的閱讀特征向量由用戶所有的閱讀數據決定,我們以用戶E閱讀過的新聞數據作為參考標準,來找到與E最相似的用戶。

多維向量的距離需要通過歐幾里得距離公式來計算,數值越小,向量距離約接近。

算出結果:

  • distance(E,A)=4.123 (用戶A沒有閱讀news2,因此news2的數據不能用來計算與用戶E的相似度,這里取1,3)
  • distance(E,B)=3.162
  • distance(E,C)=3.742
  • distance(E,D)=1.414

因此得出結果:用戶D是與用戶E閱讀喜好最接近的那個,應該優先歸為同一類用戶。最終結論根據用戶D的閱讀數據,優先推薦news4。

4.3 內容選取

我們通過閱讀特征向量把用戶做群體劃分后,接下來就是如何獲取新聞推薦的優先級。上面的例子里面只需要選出一個相似用戶,并且用戶A,B,C,D都只閱讀news4,5,6中的一條,所以比較簡單,但現實情況中,同一個用戶群體閱讀的新聞多且隨機,用戶交互更是錯綜復雜,如何得出推薦新聞的優先級呢?

假設用戶X在系統歸屬于群體A,這個群體有n個用戶,分別為A0,A1,A2……An,這些用戶的集合用S(X,n)表示。

  1. 首先,我們需要把集合中所有用戶交互過(閱讀,評論等)的新聞提取出來;
  2. 需要剔除掉用戶X已經看過的新聞,這些就不用再推薦了,剩下的新聞集合有m條,用N(X,m)來表示;
  3. 對余下的新聞進行評分和相似度加權的計算,計算包括兩部分,一是用戶X與S(X,n) 每一個用戶的相似性,二是每個用戶對新聞集N(X,m)中每條新聞的喜好,這樣就能得到每條新聞相對于用戶X的最終得分;
  4. 將N(X,m)中的新聞列表按照得分高低的順序推薦給用戶。

4.4 優缺點

相比于基于內容的推薦算法,基于用戶的協同過濾同樣優缺點明顯。

優點主要在于對分詞等算法的精確度無太大要求,推薦都是基于用戶的行為數據去不斷學習和完善;同時能發現用戶的潛在閱讀興趣,能“制造驚喜”。

而缺點則是啟動的門檻高,用戶量不夠時幾乎無法開展;并且學習量不夠時推薦結果較差。

5. 總結

關于個性化推薦的算法,在網上有很多資料,也有很多其他的實現方法,因為筆者了解也有限,所以也不敢描述。如有興趣可以自行搜索。熱度和個性化推薦算法,作為大部分內容型產品的核心賣點之一,依然在不斷地進化和完善中。沒有哪種算法是完美的,甚至沒有哪種算法是一定優于其他的,在實際使用中,很多產品都是多算法結合去做好內容推薦。

而產品經理在算法的實施中,絕對不是一句“我們要做個性化推薦”就完事的,必須深入算法內部,對算法的原理做深入了解,然后結合自己的產品特征來部署和優化。

因此我站在產品經理的角度,整理了這一篇初步的算法相關的介紹,如有對文中內容感興趣的,歡迎探討!如有描述不當之初,敬請指正,感激不盡!

最后,需要對我的團隊表示感謝,飛哥在算法的研究中打了頭陣并給出了細致的分享,宗榮對算法進行了無數輪的調整和優化,凱華在關鍵詞的部署和效果驗證中付出了很多心血……喜歡那些日子里大家一起從零開始學習和實現算法,讓推薦效果越來越好。

 

作者:盧爭超,前UC,騰訊海外產品經理,負責UC Browser,微信支付等產品的國際化,現創業中。多年產品策劃運營和管理經驗,在工具,支付,內容,企業服務型產品的策劃和運營領域經驗豐富。

本文由 @盧爭超?原創發布于人人都是產品經理。未經許可,禁止轉載。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 真棒

    來自浙江 回復
  2. 數學真性感

    來自北京 回復
  3. 不錯不錯,太贊了

    來自廣東 回復
  4. 就像物理學的那樣,首先建立平面直角坐標系,然后開始算。 ??

    來自湖南 回復
  5. 66666666

    回復
  6. 文中提到了S(TIME),但在后續的繼續說明中,出現了時間因子T(TIME),沒有了S(TIME)。
    請問兩者的關系是?謝謝!

    來自北京 回復
    1. 同問

      來自北京 回復
    2. 我的理解(僅供參考哈):
      Score = S0 + S(Users) – S(Time),這個是最初的假設,感覺這里的S(Time)更多在表達Score和Time相關,或者說這個公式在說Score和初始熱度(后來又提到和類別相關)、用戶熱度、時間熱度相關。
      而文章后面提到“而由于熱度的發展最終是一個無限趨近于零熱度的結果,最終的新聞的熱度算法也調整為:Score = ( S0(Type) + S(Users) ) / T(Time)”,這里應該是確定了Score是隨Time衰減的。

      來自北京 回復
  7. 看了這么多,終于找到想要的東西了,謝謝分享!

    來自北京 回復
  8. 感謝分享^_^

    回復
  9. ??感覺作者分享。對于徘徊日均IP、粘性、跳失……在100之內,又經常被其他汪問如何設計算法而感到疑惑??

    回復
  10. 牛逼

    回復
  11. 還有關鍵就是去重

    回復
  12. 回復
  13. 牛逼

    回復
  14. 很有意思,贊

    回復
  15. 妥妥的干貨,感謝分享!??

    來自北京 回復
  16. 作者太棒,感謝分享

    來自上海 回復
  17. 干貨滿滿!感謝分享??!

    來自廣東 回復
  18. 干貨滿滿!希望這個評論能提高這篇文章的熱度

    回復
  19. 個性化推薦 呵呵 最sb的算法 把平臺粉絲變成專項用戶。

    來自浙江 回復
    1. 那是今日頭條等打標簽造成的

      來自上海 回復
  20. 非常好!我推薦給我的團隊,讓大家一起學習??纯搓P于算法能為我們現在的產品做些什么,期待作者后續文章。

    來自福建 回復
    1. 能幫到就好,謝謝欣賞

      來自廣東 回復
  21. 干貨

    來自四川 回復
  22. 受教了,我們一直沉迷于個性化推薦,開了眼界

    來自廣東 回復
  23. 回復
  24. 不錯,分析得透徹

    回復
  25. 一直想要了解這方面。感謝分享

    來自北京 回復
  26. 對于以后app做個性化推薦有了很好的認識 ??

    來自浙江 回復
  27. 有道~~ ??

    來自浙江 回復
  28. 燒腦算法

    來自北京 回復
  29. 好文章,感謝分享

    來自湖北 回復
  30. 非常好的文章,我也一直學習這方面的知識,這篇幫我好好梳理了一遍,謝謝啦。
    我們目前處于根據用戶行為推薦相似內容這一步,給內容打標簽這我們的執行辦法是,根據已有詞庫里的詞條熱度和該詞在當前文章的出現次數,會有一個權重分,權重排名靠前的詞相似度越高判定為內容越相似,這樣就容易出現“廣州天氣”那個案例的問題。但是會出現另外一個問題,重復的內容可能會重復推薦,所以對于PGC平臺,去重也很重要。(我們是UGC平臺,這個問題還想到很好的解決辦法。)

    來自浙江 回復