如何設(shè)計(jì)一款百萬日活的推薦系統(tǒng)(1)—大智慧RES從0到1實(shí)戰(zhàn)
編輯導(dǎo)語:百萬日活的推薦系統(tǒng)是很多人可望而不可求的,其系統(tǒng)的設(shè)計(jì)也并不簡(jiǎn)單,那么該如何設(shè)計(jì)這樣一款推薦系統(tǒng)呢?本文作者基于自己的實(shí)際搭建經(jīng)驗(yàn),為我們分享了他的產(chǎn)品設(shè)計(jì)歷程,希望能夠幫助大家在系統(tǒng)搭建的過程中少走一些彎路。
前言
作者簡(jiǎn)介:本人3年金融行業(yè)產(chǎn)品經(jīng)驗(yàn),主攻python數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)。目前就職于上海大智慧,主要負(fù)責(zé)大數(shù)據(jù)平臺(tái)、用戶畫像、推薦搜索、知識(shí)圖譜等方向 。曾參與過ontrade數(shù)字金融交易所、區(qū)塊鏈錢包、仙人掌股票證券投顧平臺(tái)等多個(gè)項(xiàng)目。獨(dú)自建立了datagrowth.cn數(shù)據(jù)驅(qū)動(dòng)增長(zhǎng)自媒體網(wǎng)站。
本系列專欄主要講述本人從0到1搭建RES推薦系統(tǒng)的一些經(jīng)驗(yàn),記錄下產(chǎn)品設(shè)計(jì)的心路歷程,以此激勵(lì)自己不斷探索新知識(shí)。
與市面上泛泛而談的博客不同的是,本文主要從產(chǎn)品的角度,結(jié)合行業(yè)特性,剖析踩過的坑。
一、產(chǎn)品架構(gòu)
任何一款再簡(jiǎn)單的產(chǎn)品,都需要商業(yè)模式和產(chǎn)品架構(gòu)的設(shè)計(jì)。架構(gòu)不需要多么復(fù)雜、花哨,深入理解行業(yè)背景,適合產(chǎn)品規(guī)劃才是最重要。
用visio畫的一個(gè)比較滿意的產(chǎn)品圖,基本能把要表達(dá)的思路全部畫了出來。
不同于前任設(shè)計(jì)的基于規(guī)則的1.0版本,這次重構(gòu)主要在于搭建一個(gè)可擴(kuò)展的體系,同時(shí)引入數(shù)據(jù)驅(qū)動(dòng)、算法賦能,而不是拍腦袋決定。
從產(chǎn)品的角度看推薦,應(yīng)屬于業(yè)務(wù)應(yīng)用層。
一切的一切,都是基于底層埋點(diǎn)到分析流程、大數(shù)據(jù)平臺(tái)、用戶標(biāo)簽畫像、自然語言處理等基礎(chǔ)服務(wù)搭建較為完善的前提下開展。
推薦的整體流程分為召回、過濾、排序(因?yàn)閿?shù)據(jù)量不是非常大,所以不需要粗排、精排)、重排序,這次主要講召回層最易理解但最重要的熱門召回。
二、整體流程
流程首先考慮閉環(huán):從app用戶行為產(chǎn)生、大數(shù)據(jù)實(shí)時(shí)統(tǒng)計(jì),到產(chǎn)生熱門召回、過濾、排序后,形成熱門推薦服務(wù);又通過用戶行為來評(píng)估推薦效果【產(chǎn)品指標(biāo),如PV/UV、人均閱讀時(shí)長(zhǎng)、轉(zhuǎn)化率等 】。
根據(jù)整體流程,發(fā)現(xiàn)核心在于熱門值的計(jì)算方案。
新聞入到資訊的es庫中,系統(tǒng)賦予一個(gè)初始熱度值;進(jìn)入推薦列表后,用戶的點(diǎn)擊、分享、點(diǎn)贊等交互行為可以提升新聞的熱度值。由于新聞?dòng)休^強(qiáng)的時(shí)效性,新聞發(fā)布后,熱度非線性衰減。
資訊熱度分=(初始熱度值+用戶交互產(chǎn)生熱度值-低質(zhì)量懲罰分(暫無))*時(shí)間衰減系數(shù)。
1. 初始熱度值
1)不同類別的文章給與不同的權(quán)重
根據(jù)用戶數(shù)據(jù)反饋,選擇其中某些熱門主題類型的文章,同時(shí)綜合考慮高質(zhì)量的類目,給與較高的權(quán)重。
類別初始熱門值:
2)人工構(gòu)建熱門詞庫
新媒體運(yùn)營(yíng)的專家是最懂行業(yè),最懂當(dāng)前熱點(diǎn)的了,引入人工規(guī)則,維護(hù)一張熱門詞庫。
對(duì)文章進(jìn)行提取關(guān)鍵字,進(jìn)行匹配,根據(jù)匹配程度適當(dāng)提升熱門權(quán)重。提取關(guān)鍵字的算法也很簡(jiǎn)單,利用textrank,彌補(bǔ)tf-idf無法提取上下文關(guān)系的劣勢(shì),取共現(xiàn)詞topN。
def get_keywords(self,conntent):
key_words1 = jieba.analyse.extract_tags(sentence=conntent,topK=50,withWeight=True,allowPOS=[‘n’,’v’,’f’])
key_words2 = jieba.analyse.textrank(sentence=conntent,topK=50,withWeight=True,allowPOS=[‘n’,’f’,’v’])
key_words1 = dict(key_words1)
key_words2 = dict(key_words2)
df1 = pd.DataFrame([key_words1]).T
df2 = pd.DataFrame([key_words2]).T
#取兩者共現(xiàn)詞作為關(guān)鍵字,取內(nèi)連接
df = pd.merge(df1,df2,how=’inner’,left_index=True,right_index=True).head(10)
#取tf-idf算法的權(quán)重作為真實(shí)權(quán)重
df=df.drop(df.columns[1], axis = 1)
#重設(shè)索引
df.reset_index(inplace=True,drop=False)
df.columns=[‘feature’,’weight’]
print(df)
return df
作為關(guān)鍵詞,當(dāng)然前置工作有去除停用詞,后置工作有同義詞歸并等等,所以NLP的底層基礎(chǔ)能力很重要。
3)自動(dòng)發(fā)現(xiàn)熱詞
若某一段時(shí)間,某一些文章的點(diǎn)擊/搜素?cái)?shù)量劇增,排除置頂?shù)冗\(yùn)營(yíng)干預(yù)后,就應(yīng)該考慮到可能出現(xiàn)了熱門詞。這種可以通過算法自動(dòng)捕捉:算法思路也很簡(jiǎn)單,通過聚類,提取共性主題的關(guān)鍵字。
2. 交互熱度值
取前M小時(shí)用戶的不同行為賦予不同的分?jǐn)?shù),如【具體分值根據(jù)數(shù)據(jù)表現(xiàn)配置】:
幾個(gè)核心的點(diǎn):
- 評(píng)論:無法單一的根據(jù)內(nèi)容得出用戶的偏好。需要對(duì)內(nèi)容做正負(fù)面分析。
- 閱讀時(shí)長(zhǎng):過短的閱讀時(shí)長(zhǎng),可能是負(fù)面反饋。這里由于找不到好的擬合函數(shù),就簡(jiǎn)單做了分段函數(shù),正常來說應(yīng)該是基于預(yù)估閱讀時(shí)長(zhǎng)做一個(gè)正態(tài)分布。
3. 時(shí)間衰減
采用經(jīng)典的hacker news的排行算法:
G重力衰減因子默認(rèn)為1.8,值越大衰減越快:
至于接下來的,LR+adam排序算法,將在后續(xù)章節(jié)介紹。
作者:數(shù)據(jù)增長(zhǎng)創(chuàng)始人,datagrowth.cn數(shù)據(jù)驅(qū)動(dòng)增長(zhǎng)自媒體網(wǎng)站創(chuàng)始人。
本文由 @數(shù)據(jù)增長(zhǎng)創(chuàng)始人 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Pexels,基于CC0協(xié)議
- 目前還沒評(píng)論,等你發(fā)揮!