本章將首先介紹推薦系統(tǒng)的外圍框架,然后介紹推薦系統(tǒng)的框架弟蚀,并對(duì)架構(gòu)中每個(gè)模塊的設(shè)計(jì)進(jìn)行深入討論。
外圍架構(gòu)
推薦系統(tǒng)要發(fā)揮強(qiáng)大的作用酗失,除了推薦系統(tǒng)本身义钉,主要還依賴于兩個(gè)條件——界面展示和用戶行為數(shù)據(jù)。目前流行的界面主要有以下共性:
①通過一定方式展示物品规肴;
②很多推薦界面都提供了推薦理由增加信任度捶闸;
③提供一些按鈕讓用戶對(duì)推薦結(jié)果進(jìn)行反饋
一般來說夜畴,需要實(shí)時(shí)獲取的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)和緩存中,而大規(guī)模的非實(shí)時(shí)地存儲(chǔ)在分布式文件系統(tǒng)(如HDFS)中删壮。
推薦系統(tǒng)的架構(gòu)
推薦系統(tǒng)聯(lián)系用戶和物品的方式主要有三種:
推薦系統(tǒng)的核心任務(wù)就被拆解成兩部分贪绘,一個(gè)是如何為給定用戶生成特征。另一個(gè)是如何根據(jù)特征找到物品
推薦系統(tǒng)的推薦任務(wù)也有很多種:
①將最新加入的物品推薦給用戶央碟;
②將商業(yè)上需要宣傳的物品推薦給用戶税灌;
③給用戶推薦不同種類的物品
④給用戶混合推薦;
⑤對(duì)于不同的產(chǎn)品推薦不同新穎度的物品硬耍;
⑥考慮到用戶訪問推薦系統(tǒng)的上下文
推薦系統(tǒng)需要由多個(gè)推薦引擎組成垄琐,每個(gè)推薦系統(tǒng)負(fù)責(zé)一類特征和一種任務(wù),推薦系統(tǒng)的任務(wù)只是將推薦引擎的結(jié)果按照一定權(quán)重或者優(yōu)先級(jí)合并经柴、排序然后返回
這樣有兩個(gè)好處:
①可以方便地增加/刪除引擎狸窘,控制不同引擎對(duì)推薦結(jié)果的影響。對(duì)于絕大多數(shù)需求坯认,只需要通過不同的引擎組合實(shí)現(xiàn)翻擒;
②可以實(shí)現(xiàn)推薦引擎接的用戶反饋
推薦系統(tǒng)的架構(gòu)
推薦引擎架構(gòu)主要包括3部分:
①部分A負(fù)責(zé)從數(shù)據(jù)庫(kù)或者緩存中拿到用戶行為數(shù)據(jù),通過分析不同行為牛哺,生成當(dāng)前用戶的特征向量陋气。不過如果是使用非行為特征,就不需要使用行為提取和分析模塊了引润。該模塊的輸出是用戶特征向量巩趁;
②部分B負(fù)責(zé)將用戶的特征向量通過特征-物品相關(guān)矩陣轉(zhuǎn)化為初始推薦物品列表;
③部分C負(fù)責(zé)對(duì)初始的推薦列表進(jìn)行過濾淳附、排名等處理议慰,從而生成最終的推薦結(jié)果
一個(gè)特征向量由特征以及特征的權(quán)重組成,在利用用戶行為計(jì)算特征向量時(shí)需要考慮以下因素:
①用戶行為的種類奴曙;
②用戶行為產(chǎn)生的時(shí)間别凹;
③用戶行為的次數(shù);
④物品的熱門程度
特征-物品相關(guān)推薦
候選集集合的目的是保證推薦結(jié)果只包含候選物品集合的物品洽糟。比如某些產(chǎn)品要求給用戶推薦最近一周加入的新物品炉菲,那么候選物品就包括最近一周新加的物品
那么為什么不在過濾模塊中將候選集合外的電視劇過濾掉?這是為了防止給物品推薦的物品過于熱門坤溃。
特征-物品相關(guān)推薦模塊除了給用戶返回物品推薦列表拍霜,還需要給推薦列表中的推薦結(jié)果產(chǎn)生一個(gè)解釋列表,表明這個(gè)物品是因?yàn)槟男┨卣魍扑]出來的薪介。下面的代碼給出了相關(guān)推薦模塊的大體工作流程:
def RecommendationCore(featrues, related_table):
ret = dict()
for fid, fweitght in featrures.items():
for item, sim in related_table[fid].items():
ret[item].weight += sim*fweight
ret[item].reason[fid] = sim*fweight
return ret
過濾模塊
①用戶已經(jīng)產(chǎn)生過行為物品沉御;
②候選物品以外的物品;
③某些質(zhì)量很差的物品
排名模塊
1.新穎性排名
要準(zhǔn)確了解用戶是否已經(jīng)知道某個(gè)物品是非常困難的昭灵,因此我們只能通過某種近似的方式知道吠裆,比如對(duì)推薦結(jié)果中熱門的物品進(jìn)行降權(quán),比如使用如下公式:
2.多樣性
第一種提高多樣性的方法是將推薦結(jié)果按照某種物品的內(nèi)容屬性分成幾類烂完,然后在每個(gè)類中都選擇該類中排名最高的物品組合成最終的推薦列表试疙。這種方法比較簡(jiǎn)單直觀,但是也有嚴(yán)重缺點(diǎn)抠蚣。首先選擇什么樣的內(nèi)容屬性進(jìn)行分類對(duì)結(jié)果的影響很大祝旷。其次,就算選擇了某種類別嘶窄,但物品是否屬于某個(gè)類別是編輯確定的怀跛,但不一定得到用戶的公認(rèn)。
因此第二種提高推薦結(jié)果多樣性的方法是控制不同推薦結(jié)果的推薦理由出現(xiàn)的次數(shù)柄冲。
下面的代碼根據(jù)推薦理由增加推薦結(jié)果的多樣性吻谋,這里輸入法recommendations是按照權(quán)重從大到小排序的,程序中每次拿出一個(gè)推薦結(jié)果现横,如果這個(gè)結(jié)果已經(jīng)被用過了漓拾,就會(huì)對(duì)推薦結(jié)果的權(quán)重除以2降權(quán),最終結(jié)果將推薦結(jié)果重新按照權(quán)重從大到小排序:
def ReasonDiversitu(recommendations):
reasons = set()
for i in recommendations:
if i.reason in reasons:
i.weight /= 2
reasons.add(i.reason)
recommendations = sortByWeight(recommendations)
3.時(shí)間多樣性
時(shí)間多樣性主要是為了保證用戶不要每天來推薦都看到同樣的推薦結(jié)果戒祠。首先要保證推薦系統(tǒng)的實(shí)時(shí)性骇两,在用戶有新行為時(shí)實(shí)時(shí)調(diào)整推薦結(jié)果以滿足用戶最近的需求。第二方面是要在用戶沒有新的行為時(shí)姜盈,也要保證推薦結(jié)果每天都有變化低千。要實(shí)現(xiàn)這一點(diǎn),只能通過如下方式:
①記錄用戶每次登陸推薦系統(tǒng)看到的推薦結(jié)果馏颂;
②將這些結(jié)果發(fā)回日志系統(tǒng)示血;
③在用戶登陸時(shí)拿到用戶昨天及之前看過的推薦結(jié)果列表,從當(dāng)前推薦結(jié)果中將用戶已經(jīng)看到的推薦結(jié)果降權(quán)
4.用戶反饋
用戶反饋模塊主要通過分析用戶之前和推薦結(jié)果的交互日志饱亮,預(yù)測(cè)用戶會(huì)對(duì)什么樣的推薦結(jié)果比較感興趣矾芙。在推薦系統(tǒng)的點(diǎn)擊率預(yù)測(cè)中可以用如下特征預(yù)測(cè)用戶u會(huì)不會(huì)點(diǎn)擊物品i:
①用戶u相關(guān)的特征;
②物品i相關(guān)的特征近上;
③物品i在推薦列表中的位置剔宪;
④用戶之前是否點(diǎn)擊過和推薦物品i具有同樣推薦解釋的其他推薦結(jié)果;
⑤用戶之前是否點(diǎn)擊過和推薦物品i具有同樣推薦引擎的其他推薦結(jié)果