文章推薦系統(tǒng) | 一箱残、推薦流程設(shè)計

推薦系統(tǒng)主要解決的是信息過載的問題滔迈,目標(biāo)是從海量物品篩選出不同用戶各自喜歡的物品,從而為每個用戶提供個性化的推薦被辑。推薦系統(tǒng)往往架設(shè)在大規(guī)模的業(yè)務(wù)系統(tǒng)之上,面臨著用戶的不斷增長敬惦,物品的不斷變化盼理,并且有著全面的推薦評價指標(biāo)和嚴(yán)格的性能要求(Netflix 的請求時間在 250 ms 以內(nèi),今日頭條的請求時間在 200ms 以內(nèi))俄删,所以推薦系統(tǒng)很難一次性地快速計算出用戶所喜好的物品宏怔,并且同時滿足準(zhǔn)確度、多樣性等評價指標(biāo)畴椰。為了解決如上這些問題臊诊,推薦系統(tǒng)通常被設(shè)計為三個階段:召回、排序和調(diào)整斜脂,如下圖所示:

在召回階段抓艳,首先篩選出和用戶直接相關(guān)或間接相關(guān)的物品,將原始數(shù)據(jù)從萬帚戳、百萬玷或、億級別縮小到萬儡首、千級別;在排序階段偏友,通常使用二分類算法來預(yù)測用戶對物品的喜好程度(或者是點擊率)蔬胯,然后將物品按照喜好程序從大到小依次排列,篩選出用戶最有可能喜歡的物品位他,這里又將召回數(shù)據(jù)從萬氛濒、千級別縮小到千、百級別鹅髓;最后在調(diào)整階段舞竿,需要過濾掉重復(fù)推薦的、已經(jīng)購買或閱讀的迈勋、已經(jīng)下線的物品炬灭,當(dāng)召回和排序結(jié)果不足時,需要使用熱門物品進(jìn)行補(bǔ)充靡菇,最后合并物品基礎(chǔ)信息重归,將包含完整信息的物品推薦列表返回給客戶端。

這里以文章推薦系統(tǒng)為例厦凤,講述一下推薦系統(tǒng)的完整流程鼻吮,如下圖所示:

  1. 同步業(yè)務(wù)數(shù)據(jù)
    為了避免推薦系統(tǒng)的數(shù)據(jù)讀寫、計算等對應(yīng)用產(chǎn)生影響较鼓,我們首先要將業(yè)務(wù)數(shù)據(jù)從應(yīng)用數(shù)據(jù)庫 MySQL 同步到推薦系統(tǒng)數(shù)據(jù)庫 Hive 中椎木,這里利用 Sqoop 先將 MySQL 中的業(yè)務(wù)數(shù)據(jù)同步到推薦系統(tǒng)的 HDFS 中,再關(guān)聯(lián)到指定的 Hive 表中博烂,這樣就可以在推薦系統(tǒng)數(shù)據(jù)庫 Hive 中使用用戶數(shù)據(jù)和文章數(shù)據(jù)了香椎,并且不會對應(yīng)用產(chǎn)生任何影響。

  2. 收集用戶行為數(shù)據(jù)
    除了用戶數(shù)據(jù)和文章數(shù)據(jù)禽篱,我們還需要得到用戶對文章的行為數(shù)據(jù)畜伐,比如曝光、點擊躺率、閱讀玛界、點贊、收藏悼吱、分享慎框、評論等。我們的用戶行為數(shù)據(jù)是記錄在應(yīng)用服務(wù)器的日志文件中的后添,所以可以利用 Flume 對應(yīng)用服務(wù)器的日志文件進(jìn)行監(jiān)聽笨枯,一方面將收集到的用戶行為數(shù)據(jù)同步到 HDFS 中,并關(guān)聯(lián)到 Hive 的用戶行為表,每天更新一次猎醇,以供離線計算使用窥突。另一方面將 Flume 收集到的用戶行為數(shù)據(jù)同步到 Kafka,實時更新硫嘶,以供在線計算使用阻问。

  3. 構(gòu)建離線畫像和特征

  • 文章畫像由關(guān)鍵詞和主題詞組成,我們首先讀取 Hive 中的文章數(shù)據(jù)沦疾,將文章內(nèi)容進(jìn)行分詞称近,根據(jù) TF-IDF 模型計算每個詞的權(quán)重,將 TF-IDF 權(quán)重最高的 K 個詞作為關(guān)鍵詞哮塞,再根據(jù) TextRank 模型計算每個詞的權(quán)重刨秆,將 TextRank 權(quán)重最高的 K 個詞與 TF-IDF 權(quán)重最高的 K 個詞的共現(xiàn)詞作為主題詞,將關(guān)鍵詞和主題詞存儲到 Hive 的文章畫像表中忆畅。接下來衡未,利用 Word2Vec 模型,計算得到所有關(guān)鍵詞的平均向量家凯,作為文章的詞向量缓醋,存儲到 Hive 的文章向量表中,并利用 BucketedRandomProjectionLSH 模型計算得到文章的相似度绊诲,將每篇文章相似度最高的 K 篇文章送粱,存儲到 Hbase 的文章相似表中。這樣我們就得到了每篇文章的畫像掂之、詞向量以及相似文章列表抗俄。

  • 構(gòu)建離線用戶畫像
    我們可以將用戶喜歡的文章的主題詞作為用戶標(biāo)簽,以便后面根據(jù)用戶標(biāo)簽來推薦符合其偏好的文章世舰。首先讀取用戶行為數(shù)據(jù)和文章畫像數(shù)據(jù)动雹,計算在用戶產(chǎn)生過行為的所有文章中,每個主題詞的權(quán)重跟压,不同的行為洽胶,權(quán)重不同,計算公式為:用戶標(biāo)簽權(quán)重 =(用戶行為分值之和)x 時間衰減裆馒,這樣就計算得到了用戶的標(biāo)簽及標(biāo)簽權(quán)重,接著讀取用戶數(shù)據(jù)丐怯,得到用戶基礎(chǔ)信息喷好,將用戶標(biāo)簽、標(biāo)簽權(quán)重及用戶基礎(chǔ)信息一并存儲到 Hbase 的用戶畫像表中读跷。到這里我們已經(jīng)通過機(jī)器學(xué)習(xí)算法梗搅,基于用戶和文章的業(yè)務(wù)數(shù)據(jù)得到了用戶和文章的畫像,但為了后面可以更方便地將數(shù)據(jù)提供給深度學(xué)習(xí)模型進(jìn)行訓(xùn)練,我們還需要將畫像數(shù)據(jù)進(jìn)一步抽象為特征數(shù)據(jù)无切。

  • 構(gòu)建離線文章特征
    由于已經(jīng)有了畫像信息荡短,特征構(gòu)造就變得簡單了。讀取文章畫像數(shù)據(jù)哆键,將文章權(quán)重最高的 K 個關(guān)鍵詞的權(quán)重作為文章關(guān)鍵詞權(quán)重向量掘托,將頻道 ID、關(guān)鍵詞權(quán)重向量籍嘹、詞向量作為文章特征存儲到 Hbase 的文章特征表闪盔。

  • 構(gòu)建離線用戶特征
    讀取用戶畫像數(shù)據(jù),將權(quán)重最高的 K 個標(biāo)簽的權(quán)重作為用戶標(biāo)簽權(quán)重向量辱士,將用戶標(biāo)簽權(quán)重向量作為用戶特征存儲到 Hbase 的用戶特征表泪掀。

  1. 多路召回
  • 基于模型的離線召回
    我們可以根據(jù)用戶的歷史點擊行為來預(yù)測相似用戶,并利用相似用戶的點擊行為來預(yù)測對文章的偏好得分颂碘,這種召回方式稱為 u2u2i异赫。獲取用戶歷史點擊行為數(shù)據(jù),利用 ALS 模型計算得到用戶對文章的偏好得分及文章列表头岔,讀取并過濾歷史召回結(jié)果塔拳,防止重復(fù)推薦,將過濾后的偏好得分最高的 K 篇文章存入 Hbase 的召回結(jié)果表中切油,列族為 als蝙斜,表明召回類型為 ALS 模型召回,并記錄到 Hbase 的歷史召回結(jié)果表澎胡。

  • 基于內(nèi)容的離線召回
    我們可以根據(jù)用戶的歷史點擊行為孕荠,向用戶推薦其以前喜歡的文章的相似文章,這種方式稱為 u2i2i攻谁。讀取用戶歷史行為數(shù)據(jù)稚伍,獲取用戶歷史發(fā)生過點擊、閱讀戚宦、收藏个曙、分享等行為的文章,接著讀取文章相似表受楼,獲取與發(fā)生行為的每篇文章相似度最高的 K 篇文章垦搬,然后讀取并過濾歷史召回結(jié)果,防止重復(fù)推薦艳汽,最后將過濾后的文章存入 Hbase 的召回結(jié)果表中猴贰,列族為 content,表明召回類型為內(nèi)容召回河狐,并記錄到 Hbase 的歷史召回結(jié)果表米绕。

  • 基于內(nèi)容的在線召回
    和上面一樣瑟捣,還是根據(jù)用戶的點擊行為,向用戶推薦其喜歡的文章的相似文章栅干,不過這里是用戶實時發(fā)生的行為迈套,所以叫做在線召回。讀取 Kafka 中的用戶實時行為數(shù)據(jù)碱鳞,獲取用戶實時發(fā)生點擊桑李、閱讀、收藏劫笙、分享等行為的文章芙扎,接著讀取文章相似表,獲取與發(fā)生行為的每篇文章相似度最高的 K 篇文章填大,然后讀取并過濾歷史召回結(jié)果戒洼,防止重復(fù)推薦,最后將過濾后的文章存入 Hbase 的召回結(jié)果表中允华,列族為 online圈浇,表明召回類型為在線召回,并記錄到 Hbase 的歷史召回結(jié)果表靴寂。

  • 基于熱門文章的在線召回
    讀取 Kafka 中的用戶實時行為數(shù)據(jù)磷蜀,獲取用戶當(dāng)前發(fā)生點擊、閱讀百炬、收藏褐隆、分享等行為的文章,增加這些文章在 Redis 中的熱度分?jǐn)?shù)剖踊。

  • 基于新文章的在線召回
    讀取 Kafka 中的實時用戶行為數(shù)據(jù)庶弃,獲取新發(fā)布的文章,將其加入到 Redis 中德澈,并設(shè)置過期時間歇攻。

  1. 排序

不同模型的做法大致相同,這里以 LR 模型為例梆造。

  • 基于 LR 模型的離線訓(xùn)練
    讀取 Hive 的用戶歷史行為數(shù)據(jù)缴守,并切分為訓(xùn)練集和測試集,根據(jù)其中的用戶 ID 和文章 ID镇辉,讀取 Hbase 的用戶特征數(shù)據(jù)和文章特征數(shù)據(jù)屡穗,將二者合并作為訓(xùn)練集的輸入特征,將用戶對文章是否點擊作為訓(xùn)練集的標(biāo)簽忽肛,將上一次的模型參數(shù)作為 LR 模型的初始化參數(shù)鸡捐,進(jìn)行點擊率預(yù)估訓(xùn)練,計算得出 AUC 等評分指標(biāo)并進(jìn)行推薦效果分析麻裁。

  • 基于 LR 模型的在線排序
    當(dāng)推薦中心讀取 Hbase 的推薦結(jié)果表無數(shù)據(jù)時,推薦中心將調(diào)用在線排序服務(wù)來重新獲取推薦結(jié)果。排序服務(wù)首先讀取 Hbase 的召回結(jié)果作為測試集煎源,讀取 Hbase 的用戶特征數(shù)據(jù)和文章特征數(shù)據(jù)色迂,將二者合并作為測試集的輸入特征,使用 LR 模型進(jìn)行點擊率預(yù)估手销,計算得到點擊率最高的前 K 個文章歇僧,然后讀取并過濾歷史推薦結(jié)果,防止重復(fù)推薦锋拖,最后將過濾后的文章列表存入 Hbase 的推薦結(jié)果表中诈悍,key 為 lr,表明排序類型為 LR 排序兽埃。

  1. 推薦中心
  • 流量切分(ABTest)
    我們可以根據(jù)用戶 ID 進(jìn)行哈希分桶侥钳,將流量切分到多個桶,每個桶對應(yīng)一種排序策略柄错,從而對比不同排序策略在線上環(huán)境的效果舷夺。

  • 推薦數(shù)據(jù)讀取邏輯
    優(yōu)先讀取 Redis 和 Hbase 中緩存的推薦結(jié)果,若 Redis 和 Hbase 都為空售貌,則調(diào)用在線排序服務(wù)獲得推薦結(jié)果给猾。

  • 兜底補(bǔ)足(超時截斷)
    當(dāng)調(diào)用排序服務(wù)無結(jié)果,或者讀取超時的時候颂跨,推薦中心會截斷當(dāng)前請求敢伸,直接讀取 Redis 中的熱門文章和新文章作為推薦結(jié)果。

  • 合并信息
    合并物品基礎(chǔ)信息恒削,將包含完整信息的物品推薦列表返回給客戶端池颈。

參考

https://space.bilibili.com/61036655/channel/detail?cid=91348(強(qiáng)烈推薦,螞蟻大神的視頻講得很棒)
https://www.bilibili.com/video/av68356229
https://pan.baidu.com/s/1-uvGJ-mEskjhtaial0Xmgw(學(xué)習(xí)資源已保存至網(wǎng)盤蔓同, 提取碼:eakp)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饶辙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斑粱,更是在濱河造成了極大的恐慌弃揽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件则北,死亡現(xiàn)場離奇詭異矿微,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尚揣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門涌矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人快骗,你說我怎么就攤上這事娜庇∷危” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵名秀,是天一觀的道長励负。 經(jīng)常有香客問我,道長匕得,這世上最難降的妖魔是什么继榆? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮汁掠,結(jié)果婚禮上略吨,老公的妹妹穿的比我還像新娘。我一直安慰自己考阱,他們只是感情好翠忠,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羔砾,像睡著了一般负间。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姜凄,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天政溃,我揣著相機(jī)與錄音,去河邊找鬼态秧。 笑死董虱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的申鱼。 我是一名探鬼主播愤诱,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捐友!你這毒婦竟也來了淫半?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤匣砖,失蹤者是張志新(化名)和其女友劉穎科吭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猴鲫,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡对人,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拂共。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牺弄。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宜狐,靈堂內(nèi)的尸體忽然破棺而出势告,到底是詐尸還是另有隱情蛇捌,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布培慌,位于F島的核電站豁陆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吵护。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一表鳍、第九天 我趴在偏房一處隱蔽的房頂上張望馅而。 院中可真熱鬧,春花似錦譬圣、人聲如沸瓮恭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屯蹦。三九已至,卻和暖如春绳姨,著一層夾襖步出監(jiān)牢的瞬間登澜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工飘庄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脑蠕,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓跪削,卻偏偏與公主長得像谴仙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碾盐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361