前言
在產(chǎn)品蛛株、運(yùn)營(yíng)這次做社區(qū)改版的過(guò)程中,我們大數(shù)據(jù)部門(mén)結(jié)合具體的業(yè)務(wù)細(xì)節(jié)翰苫,通過(guò)研究止邮、討論與試錯(cuò),最終設(shè)計(jì)了一個(gè)基本符合需求的內(nèi)容熱度值算法奏窑,本文就簡(jiǎn)述其設(shè)計(jì)方法导披。
他山之石
有為數(shù)很少的幾家外國(guó)公司開(kāi)源或公開(kāi)說(shuō)明了自家的內(nèi)容熱度值算法,包括Hacker News埃唯、Reddit撩匕、Stack Overflow/Stack Exchange、StumbleUpon等墨叛。我們?cè)谠O(shè)計(jì)自己的算法之前止毕,參考了他們的一些理念。為了節(jié)省篇幅漠趁,就不再重復(fù)講一遍了扁凛,直接將reference傳送門(mén)放在下面:
- https://moz.com/blog/reddit-stumbleupon-delicious-and-hacker-news-algorithms-exposed
- https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/lib/db/_sorts.pyx
- https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions
- https://meta.stackexchange.com/questions/60756/how-do-the-arbitrary-hotness-points-work-on-the-new-stack-exchange-home-page-a
可以攻玉
列舉內(nèi)容數(shù)據(jù)維度
在我們的社區(qū)體系中,與一篇內(nèi)容相關(guān)的指標(biāo)如下:
- 時(shí)間維度:發(fā)布時(shí)間post_time闯传、最后回復(fù)時(shí)間last_reply_time谨朝、最后操作時(shí)間last_op_time
- 互動(dòng)量維度:閱讀量view_num、回復(fù)量reply_num甥绿、收藏量favor_num字币、點(diǎn)贊量like_num、回復(fù)點(diǎn)贊量reply_like_num共缕、分享量share_num
- 內(nèi)容維度:內(nèi)容長(zhǎng)度content_length洗出、平均回復(fù)長(zhǎng)度reply_avg_length、圖片數(shù)picture_num
-
用戶維度:用戶對(duì)內(nèi)容的興趣度图谷、活躍度翩活、發(fā)/回帖用戶的聲望,etc.
明確各維度的業(yè)務(wù)含義
時(shí)間維度
時(shí)間維度用來(lái)控制熱度隨時(shí)間的衰減蜓萄,距離當(dāng)下比較久遠(yuǎn)的內(nèi)容應(yīng)該具有更低的熱度值隅茎,就像人會(huì)逐漸忘記一些之前做過(guò)的事情一樣。我們認(rèn)為嫉沽,三種時(shí)間維度指標(biāo)各自有適合的場(chǎng)景:
- 發(fā)布時(shí)間:(1)內(nèi)容時(shí)效性強(qiáng),容易過(guò)期俏竞,如新聞和資訊網(wǎng)站绸硕;(2)UGC遠(yuǎn)多于PGC堂竟,且用戶喜歡討論流行話題,基本不需要內(nèi)容沉淀玻佩,如綜合性論壇和BBS出嘹。
- 最后回復(fù)時(shí)間:(1)內(nèi)容具有沉淀意義,發(fā)布很久之后也仍然可讀咬崔,如專業(yè)領(lǐng)域論壇或博客税稼;(2)用戶回復(fù)的信息量普遍大于內(nèi)容主體,如交互式問(wèn)答垮斯。
- 最后操作時(shí)間:(1)UGC經(jīng)忱善停或周期性由發(fā)布者自己修改,如小說(shuō)連載兜蠕;(2)以PGC為主并且運(yùn)營(yíng)有明顯的指向性(人工推薦扰肌、打星標(biāo)等),如商品推廣熊杨。
互動(dòng)量維度
互動(dòng)量是表征內(nèi)容熱度的最直接指標(biāo)曙旭,一般采用對(duì)各項(xiàng)數(shù)據(jù)加權(quán)的方式來(lái)計(jì)算。
權(quán)重值的大小必然會(huì)有區(qū)別晶府,閱讀量的權(quán)重幾乎總是最低的桂躏,而回復(fù)、點(diǎn)贊/收藏川陆、分享量的權(quán)重值如何排序剂习,也需要根據(jù)業(yè)務(wù)場(chǎng)景來(lái)具體討論。
以新浪微博為例书劝,它追求的是熱點(diǎn)內(nèi)容(如明星相關(guān)的內(nèi)容)的高正向評(píng)價(jià)與病毒式傳播进倍,所以點(diǎn)贊和轉(zhuǎn)發(fā)的量相對(duì)于回復(fù)量而言往往都很高。而以網(wǎng)易新聞為例购对,其中很多板塊都有不少爭(zhēng)議性內(nèi)容(如體育猾昆、3C方面),目的是引起用戶之間的強(qiáng)烈互動(dòng)甚至撕逼骡苞,所以跟帖量又會(huì)遠(yuǎn)遠(yuǎn)超過(guò)喜歡和分享的數(shù)量垂蜗。
內(nèi)容維度
內(nèi)容維度一般只起輔助作用,因?yàn)閮?nèi)容的質(zhì)量與字?jǐn)?shù)解幽、平均回復(fù)字?jǐn)?shù)贴见、圖片數(shù)等指標(biāo)的關(guān)系不太能通過(guò)計(jì)算來(lái)衡量(比如很長(zhǎng)的文章也有可能完全是篇水文),只有通過(guò)NLP或者人工篩選才能更加精準(zhǔn)地看出來(lái)躲株。
用戶維度
在標(biāo)簽化推薦系統(tǒng)中片部,如果用戶對(duì)帶有標(biāo)簽的內(nèi)容產(chǎn)生了互動(dòng),那么內(nèi)容上的標(biāo)簽就會(huì)轉(zhuǎn)化并積累為用戶的興趣向量霜定。用戶興趣度和內(nèi)容熱度的綜合档悠,可以保證呈現(xiàn)給用戶的內(nèi)容不會(huì)過(guò)于大眾化廊鸥,也不會(huì)造成興趣的收斂。另外辖所,如果用戶分級(jí)的體系比較完善惰说,那么KOL、大V創(chuàng)作或參與互動(dòng)的內(nèi)容往往會(huì)獲得比普通用戶更高的熱度值缘回。
算法設(shè)計(jì)思路
時(shí)間維度
由于我們的定位是針對(duì)垂直領(lǐng)域的專業(yè)性攻略和交流社區(qū)吆视,所以選取了最后回復(fù)時(shí)間作為時(shí)間維度。它的優(yōu)點(diǎn)是優(yōu)質(zhì)內(nèi)容可以隨時(shí)獲得較高的熱度酥宴,激起用戶的討論欲望啦吧;缺點(diǎn)是無(wú)法應(yīng)對(duì)挖墳、灌水等惡意行為幅虑,但可以通過(guò)反垃圾機(jī)制過(guò)濾掉這些異常數(shù)據(jù)丰滑。以后可以考慮發(fā)布時(shí)間與最后回復(fù)時(shí)間的結(jié)合方案。
我們采用牛頓冷卻定律作為時(shí)間衰減函數(shù)倒庵,即:
H(t) = Ha · exp[-γ · (t-tlast) / 86400]
其中Ha是內(nèi)容的原始熱度值褒墨,即通過(guò)互動(dòng)量算出的熱度值。采用以e為底的指數(shù)函數(shù)擎宝,tlast即該內(nèi)容的最后回復(fù)時(shí)間郁妈。時(shí)間的單位都是秒,所以要除一天中的秒數(shù)86400绍申,以天為單位做衰減噩咪。γ是所謂“重力因子”(gravity factor),即該值越大极阅,帖子的熱度會(huì)更快地下落胃碾。
采用Wolfram Alpha畫(huà)圖可以展示出不同Ha與γ值的影響,我們也會(huì)根據(jù)具體業(yè)務(wù)的特點(diǎn)適當(dāng)調(diào)整γ值筋搏。
互動(dòng)量維度
我們暫時(shí)還無(wú)法從后端日志或其他數(shù)據(jù)源采集到內(nèi)容分享量仆百,但是它是一個(gè)相對(duì)低頻的行為,可以日后再實(shí)現(xiàn)奔脐。至于內(nèi)容中回復(fù)的點(diǎn)贊量俄周,我們認(rèn)為熱評(píng)對(duì)內(nèi)容整體熱度的貢獻(xiàn)有限,并且也不太好采集髓迎,暫時(shí)也擱置一邊峦朗。所以互動(dòng)量維度剩下了四個(gè)指標(biāo):閱讀量、回復(fù)量排龄、收藏量波势、點(diǎn)贊量,內(nèi)容的原始熱度值Ha計(jì)算方法如下:
Ha = ln(1+Nview) + 1.0·Nreply + 1.75·Nlike + 3.2·Nfavor
回復(fù)、收藏艰亮、點(diǎn)贊量都是采用線性加權(quán)的方式來(lái)做闭翩,它們的權(quán)重是根據(jù)現(xiàn)有內(nèi)容規(guī)律大致推斷的挣郭。還有一種較為科學(xué)的方式是讓運(yùn)營(yíng)人員根據(jù)經(jīng)驗(yàn)手動(dòng)為一批較熱門(mén)的內(nèi)容打分迄埃,然后利用多元線性回歸(multivariate linear regression)確定各個(gè)系數(shù)的值,這件事可以之后做兑障。
閱讀量的處理方式比較特殊侄非。由于閱讀是門(mén)檻最低的互動(dòng)行為,因此我們傾向于認(rèn)為那些第一批來(lái)閱讀的用戶對(duì)熱度貢獻(xiàn)值較大流译,而之后跟風(fēng)來(lái)看的用戶會(huì)越來(lái)越?jīng)]有價(jià)值逞怨。自然對(duì)數(shù)能夠很好地滿足,如下圖所示福澡。
內(nèi)容維度
內(nèi)容字?jǐn)?shù)和圖片數(shù)可以間接地作為內(nèi)容質(zhì)量潛力的判斷指標(biāo)叠赦,但有很大的隨機(jī)性。我們目前只采用了字?jǐn)?shù)的常用對(duì)數(shù)值革砸,即lg(Nlength)作為它對(duì)熱度的貢獻(xiàn)除秀,按數(shù)量級(jí)增長(zhǎng)的幅度很小,因此就算不準(zhǔn)算利,也不會(huì)對(duì)最終結(jié)果造成什么影響册踩。
圖片數(shù)對(duì)某一部分內(nèi)容而言可能非常具有代表性,可以與運(yùn)營(yíng)人員討論確定一些標(biāo)準(zhǔn)效拭。
用戶維度
經(jīng)過(guò)上面的介紹暂吉,我們其實(shí)已經(jīng)可以得出通用的熱度值計(jì)算方法:
H = [lg(Nlength) + ln(1+Nview) + 1.0·Nreply + 1.75·Nlike + 3.2·Nfavor] · exp[-γ · (t-tlast) / 86400]
而用戶維度的存在,可以讓我們獲得更加差異化的推薦效果缎患。
目前我們的標(biāo)簽化推薦系統(tǒng)已經(jīng)運(yùn)行了相當(dāng)長(zhǎng)的時(shí)間慕的,有不少的用戶興趣積累。我們根據(jù)日志采集每位用戶的近30天行為挤渔,計(jì)算其對(duì)每個(gè)標(biāo)簽的興趣度肮街,形成興趣向量,并將它們的值歸一化到[0.1,1.0]區(qū)間內(nèi)蚂蕴,以削除最低與最高興趣之間的巨大差距低散。然后,計(jì)算用戶興趣向量與內(nèi)容標(biāo)簽向量的相似度(余弦相似度骡楼、Pearson相關(guān)性等)熔号,并將其作為總熱度值的系數(shù)即可。
在實(shí)際使用時(shí)鸟整,我們還可以用隨機(jī)數(shù)適當(dāng)打散排序引镊,使內(nèi)容列表展示在用戶面前時(shí)看起來(lái)更加豐富。即:
rand(0.75,1.25) · Cinterest · H
至于用戶聲望的影響,是一個(gè)更大的話題弟头,還有待我們?nèi)ヌ剿鞣宰ァP枰⒁獾氖牵^(guò)分強(qiáng)調(diào)KOL和大佬的影響力本質(zhì)上是反社交的赴恨,會(huì)造成“精英主義”(elitism)的泛濫疹娶,所以一旦要上這種邏輯的話,需要嚴(yán)格控制伦连。
總結(jié)
從技術(shù)人員的角度講雨饺,一句話:技術(shù)本身是死的,但業(yè)務(wù)與人都是活的惑淳。如果技術(shù)人員對(duì)業(yè)務(wù)邏輯有深入了解的話额港,就會(huì)自然地去尋找更準(zhǔn)確、高效的解決方法歧焦,雙方合作起來(lái)也會(huì)更愉快移斩。