李亞欣,蔡永香,張 根
(長江大學(xué) 地球科學(xué)學(xué)院,武漢 430100)
自1997年Resnick等人[1]首次提出用“推薦系統(tǒng)”(Recommender System,RS)一詞代替“協(xié)同過濾”來描述推薦技術(shù)以來,推薦系統(tǒng)實現(xiàn)了面向系統(tǒng)的探索階段,開始成為一個重要的研究領(lǐng)域[2].推薦系統(tǒng)按總體的功能劃分,可分為用戶建模模塊、推薦對象建模模塊、推薦算法模塊3個重要模塊[3].目前許多研究專注于其中某個或某幾個模塊的優(yōu)化設(shè)計上,如文獻(xiàn)[4,5]側(cè)重于用戶建模優(yōu)化,文獻(xiàn)[6]側(cè)重于對傳統(tǒng)協(xié)同過濾推薦的算法優(yōu)化等.一個好的推薦系統(tǒng)在側(cè)重功能實現(xiàn)的同時還需要關(guān)注其整體性能的優(yōu)化,如推薦算法計算時間過長時如何保證系統(tǒng)運(yùn)行流暢,如何提高系統(tǒng)的可伸縮性等.此外,各推薦方法自身還存在著缺陷,比如典型的協(xié)調(diào)過濾推薦和新出現(xiàn)的基于網(wǎng)絡(luò)結(jié)構(gòu)的推薦都存在冷啟動及稀疏性問題;基于內(nèi)容的推薦,用戶將僅限于獲得跟以前類似的推薦結(jié)果,很難為用戶發(fā)現(xiàn)新的感興趣的信息[3].推薦系統(tǒng)在采用這些推薦方法解決問題時,如何揚(yáng)長避短進(jìn)行完善?
另外,用戶的偏好是一種理性和感性的共同選擇[7],用戶除了具有固定興趣偏好,由于時間、事件、場合等原因,也會在短時間內(nèi)發(fā)生興趣焦點(diǎn)轉(zhuǎn)移,如某一用戶以前對財經(jīng)類文章并不感興趣,但最近因為所在的公司要重組準(zhǔn)備上市,也開始關(guān)注這方面的新聞,這就是興趣焦點(diǎn)的轉(zhuǎn)移.如何迎合用戶長期偏好的同時也能適應(yīng)用戶短時間內(nèi)的興趣變化?
本文設(shè)計了一種實時推薦與離線推薦相結(jié)合的推薦系統(tǒng)來解決上述問題,提出了待推薦池的概念,用于存儲準(zhǔn)備推薦給用戶的數(shù)據(jù),用戶獲取數(shù)據(jù)直接從待推薦池內(nèi)提取,從而保證系統(tǒng)運(yùn)行始終流暢;系統(tǒng)通過分析用戶實時數(shù)據(jù)進(jìn)行實時推薦,分析用戶歷史數(shù)據(jù)進(jìn)行離線推薦,二者結(jié)合可更好地貼近用戶長期偏好及短期興趣焦點(diǎn);此外,系統(tǒng)采用控制模塊,通過設(shè)置該模塊控制調(diào)節(jié)不同的推薦結(jié)果,從而提高系統(tǒng)的可伸縮能力.此外,本文將該推薦系統(tǒng)應(yīng)用于微信文章的推薦上,實時推薦采用基于內(nèi)容數(shù)據(jù)的推薦方式,離線推薦采用基于用戶行為數(shù)據(jù)的推薦方式,文中介紹了具體實施方法,并對推薦效果進(jìn)行了分析和總結(jié).
目前已有的推薦方法有很多,根據(jù)不同的分類標(biāo)準(zhǔn)可以得到不同的分類結(jié)果.文獻(xiàn)[2]依據(jù)推薦方法使用的數(shù)據(jù)源不同,將推薦方法分為:基于內(nèi)容數(shù)據(jù)的推薦、基于用戶行為數(shù)據(jù)的推薦、基于社交網(wǎng)絡(luò)數(shù)據(jù)的推薦等7種推薦方法.其中基于內(nèi)容數(shù)據(jù)的推薦與基于用戶行為數(shù)據(jù)的推薦是最為常見的兩種推薦方式.
基于內(nèi)容數(shù)據(jù)的推薦(content-based recommendation)的基本思想是對一個給定的用戶,推薦與他之前喜歡的項目在內(nèi)容上有相似性的其他項目.而項目間相似度計算方法包括:向量空間模型、改進(jìn)的向量空間模型、顯式?jīng)Q策模型、線性分類和機(jī)器學(xué)習(xí)等.基于用戶行為數(shù)據(jù)的推薦(user behavior-based recommendation)的基本思想是利用興趣相投,擁有共同經(jīng)驗的群體喜好來給使用者推薦可能感興趣的項目[2].其最為廣泛的計算方法是協(xié)同過濾,包括基于用戶的協(xié)同過濾、基于項目的協(xié)調(diào)過濾以及基于模型的協(xié)同過濾[3].
單一的推薦方法存在各自的優(yōu)缺點(diǎn),如文獻(xiàn)[2]指出基于內(nèi)容數(shù)據(jù)的推薦不需要一個很大的用戶社區(qū)或打分歷史,對單個用戶就可以產(chǎn)生推薦列表,但其推薦給用戶的項目與該用戶已經(jīng)消費(fèi)過的項目很相似,這使得不易發(fā)現(xiàn)用戶不熟悉但是潛在感興趣的項目種類,給用戶造成的驚喜度不高;基于用戶行為數(shù)據(jù)的推薦不需要預(yù)先獲得用戶或項目的特征,僅依賴于用戶的歷史行為給用戶興趣建模,從而為用戶進(jìn)行推薦.但其過于依賴于用戶的歷史行為,這使得推薦方法無法滿足用戶短時間內(nèi)的興趣變化等.
對于上述基于內(nèi)容數(shù)據(jù)的推薦和基于用戶行為數(shù)據(jù)的推薦各自呈現(xiàn)的不足之處,一些研究者采用混合推薦策略來達(dá)到揚(yáng)長避短的目的.混合推薦包括推薦結(jié)果的混合以及推薦算法的混合[3].前者各推薦方法獨(dú)立運(yùn)行,只對推薦結(jié)果進(jìn)行選擇,如文獻(xiàn)[8]通過設(shè)定標(biāo)準(zhǔn)從各自推薦產(chǎn)生的結(jié)果中進(jìn)行判斷選擇;后者則是推薦方法間的嵌套使用,如文獻(xiàn)[9]在基于協(xié)同推薦的框架內(nèi)混合基于網(wǎng)絡(luò)結(jié)構(gòu)的推薦等,一般根據(jù)應(yīng)用場景不同采取不同方式.
針對前面提出的問題,我們在推薦系統(tǒng)設(shè)計時著重考慮:① 關(guān)注用戶長期偏好以及短期興趣焦點(diǎn)變化,② 將推薦系統(tǒng)作為一個整體考慮系統(tǒng)運(yùn)行的流暢性及可伸縮能力.為此,我們的設(shè)計思路為:
① 既然用戶的實時反饋信息,如閱讀,點(diǎn)贊,評論等,能反映用戶短時間內(nèi)的興趣焦點(diǎn),而對這些反饋信息進(jìn)行長期累積,就能形成貼近用戶長期偏好的歷史數(shù)據(jù).我們可以基于實時反饋信息進(jìn)行實時推薦,基于歷史數(shù)據(jù)進(jìn)行離線推薦,將二者結(jié)合,就能在考慮用戶長期固有偏好的同時也能關(guān)注用戶短時間內(nèi)的興趣焦點(diǎn)變化.
② 系統(tǒng)運(yùn)行不暢,往往是由于推薦計算時間過長,不能及時提供推薦結(jié)果導(dǎo)致.本文提出待推薦池這一概念,用于存儲準(zhǔn)備推薦給用戶的數(shù)據(jù)集.推薦時,系統(tǒng)首先從待推薦池提取一定數(shù)量的數(shù)據(jù)推薦給用戶,再通過實時推薦與離線推薦產(chǎn)生推薦數(shù)據(jù)補(bǔ)充到待推薦池內(nèi),這樣即使推薦計算運(yùn)行時間長,用戶依然能夠連續(xù)多次從待推薦池中提取數(shù)據(jù),保證了系統(tǒng)運(yùn)行始終流暢.待推薦池中的數(shù)據(jù),除了在系統(tǒng)運(yùn)行初期是按類別等比例隨機(jī)獲取的數(shù)據(jù)外,后面補(bǔ)充到待推薦池中的數(shù)據(jù)都是實時推薦與離線推薦的結(jié)果.因此,長時間運(yùn)行后,池內(nèi)數(shù)據(jù)會不斷貼近用戶的偏好,這樣通過分析池內(nèi)數(shù)據(jù),也可對本系統(tǒng)推薦效果進(jìn)行評價.
③ 為了提高系統(tǒng)健壯性與可伸縮能力,在推薦系統(tǒng)中增加控制模塊.一方面,按照實時推薦模塊和離線推薦模塊產(chǎn)生的推薦數(shù)量,控制模塊能夠合理調(diào)節(jié)兩者份額,補(bǔ)充到待推薦池內(nèi),提高系統(tǒng)的健壯性.如當(dāng)離線推薦數(shù)據(jù)少而實時推薦數(shù)據(jù)多時,會適當(dāng)增大實時推薦比例,反之亦然.另一方面,當(dāng)系統(tǒng)增加其它推薦算法時,很容易通過對該模塊進(jìn)行設(shè)置,來選擇其它推薦算法的推薦結(jié)果,提高了系統(tǒng)的可伸縮能力.
本系統(tǒng)整體運(yùn)行流程如圖1所示,具體步驟包括:
① 初始狀態(tài)下,將所要推薦的數(shù)據(jù),如書籍、文本、圖片、電影、音樂等數(shù)據(jù),隨機(jī)等比例地填充到待推薦池內(nèi),保證池內(nèi)數(shù)據(jù)全面多樣;
② 每次推薦,系統(tǒng)從待推薦池內(nèi)獲取定額數(shù)據(jù)推薦給用戶,如每次從池內(nèi)提取10篇文章推薦給用戶;
③ 記錄模塊記錄用戶對本次推薦的反饋,如用戶對其中某些數(shù)據(jù)的閱讀,收藏,點(diǎn)贊,評論等行為信息;
圖1 推薦流程圖
④ 用戶獲取下次推薦數(shù)據(jù)時,實時推薦開始運(yùn)行.提取記錄模塊內(nèi)的所有記錄信息,實時推薦模塊根據(jù)這些信息計算并產(chǎn)生推薦數(shù)據(jù);
⑤ 統(tǒng)計模塊獲取記錄模塊信息(提取后記錄模塊清空),與前面獲取的歷史紀(jì)錄合并,離線推薦模塊根據(jù)這些統(tǒng)計信息計算并產(chǎn)生推薦數(shù)據(jù);
⑥ 控制模塊監(jiān)控待推薦池,對實時推薦數(shù)據(jù)與離線推薦數(shù)據(jù)進(jìn)行去重處理,包括與用戶的歷史數(shù)據(jù)比較去重,與待推薦池比較去重,實時與離線推薦數(shù)據(jù)比較去重;然后,根據(jù)待推薦池內(nèi)缺額數(shù),通過加權(quán)或計算TopN的方式,組合兩類推薦數(shù)據(jù),補(bǔ)充到待推薦池內(nèi).
待推薦池以隊列形式存儲,池內(nèi)最大容積固定,每次推薦時提取池內(nèi)排名在前的定額數(shù)據(jù)給用戶.控制模塊根據(jù)池內(nèi)缺額數(shù),結(jié)合實時推薦數(shù)據(jù)與離線推薦數(shù)據(jù)補(bǔ)充到待推薦池.
初始狀態(tài)下,推薦程序由于無用戶歷史數(shù)據(jù)和即時反饋數(shù)據(jù),無法進(jìn)行實時推薦與離線推薦,系統(tǒng)自動將各類數(shù)據(jù)等比例隨機(jī)選取填充到待推薦池內(nèi),一方面保證池內(nèi)數(shù)據(jù)全面多樣,使用戶在池內(nèi)能夠獲得所有類型數(shù)據(jù);另一方面,系統(tǒng)后續(xù)可從用戶對各類數(shù)據(jù)的反饋中獲取用戶的興趣焦點(diǎn)與偏好,從而進(jìn)行實時推薦與離線推薦.
推薦初期,用戶歷史數(shù)據(jù)沒達(dá)到一定規(guī)模,實時推薦正常而離線推薦無法有效進(jìn)行.這時,提取實時推薦數(shù)據(jù)中至多需補(bǔ)充數(shù)額量的數(shù)據(jù),將這些數(shù)據(jù)的80%插入到待推薦池隊首,其余20%數(shù)據(jù)插入到隊尾,保證下次推薦給用戶的數(shù)據(jù)既能圍繞用戶當(dāng)前的興趣焦點(diǎn),又能讓用戶有機(jī)會接觸到池內(nèi)其它種類的數(shù)據(jù),此外也保證了待推薦池內(nèi)的數(shù)據(jù)量.
隨著用戶歷史數(shù)據(jù)不斷積累,離線推薦開始正常運(yùn)行.補(bǔ)充待推薦池時,組合兩類推薦數(shù)據(jù)至需補(bǔ)充數(shù)額量,將其中實時推薦部分插入到隊首,使下次推薦的數(shù)據(jù)中包含大量實時推薦數(shù)據(jù)與原池內(nèi)少量數(shù)據(jù),保證推薦給用戶的數(shù)據(jù)大部分圍繞用戶的興趣焦點(diǎn)上,還有小部分是池內(nèi)存儲的用戶之前可能感興趣的數(shù)據(jù);將離線推薦數(shù)據(jù)部分插入到隊尾,逐漸改變待推薦池內(nèi)數(shù)據(jù)類型,使其逐漸貼合用戶的歷史偏好.
為保證系統(tǒng)流暢性,用戶每次獲取數(shù)據(jù)時,直接從待推薦池內(nèi)提取,然后控制模塊選擇調(diào)節(jié)兩種推薦方法的結(jié)果數(shù)據(jù)進(jìn)行數(shù)據(jù)補(bǔ)充.當(dāng)多次推薦用戶無反饋,即實時推薦模塊不能正常產(chǎn)生推薦數(shù)據(jù),而同時用戶的歷史數(shù)據(jù)稀疏,離線推薦模塊也沒有推薦數(shù)據(jù)時,會出現(xiàn)待推薦池內(nèi)數(shù)據(jù)不斷減少的現(xiàn)象,這時就需要設(shè)置預(yù)警閥值,以避免待推薦池內(nèi)數(shù)據(jù)量為空.當(dāng)池內(nèi)數(shù)據(jù)小于預(yù)警閥值時,系統(tǒng)需要及時補(bǔ)充數(shù)據(jù),所補(bǔ)充的數(shù)據(jù)可依據(jù)統(tǒng)計模塊中已有的用戶偏好信息產(chǎn)生,若沒有,可按照初始數(shù)據(jù)填充方式,將各類數(shù)據(jù)等比例隨機(jī)選取,產(chǎn)生一定量的數(shù)據(jù)進(jìn)行補(bǔ)充.
將上述推薦系統(tǒng)應(yīng)用到微信文章推薦上.微信文章是一種數(shù)量大、種類多的文章類型.文章數(shù)據(jù)主要來源于微信精選網(wǎng)站(https://fzn.cc/),使用Python爬蟲Scrapy進(jìn)行數(shù)據(jù)抓取,提取包括美文哲理、幽默笑話、趣味測試、經(jīng)驗總結(jié)、美食美景及保健養(yǎng)生6大類文章類型.同時補(bǔ)充搜狗微信網(wǎng)站(https://weixin.sogou.com/)中搞笑、養(yǎng)生堂、旅游、美食類文章數(shù)據(jù),微信群網(wǎng)站(https://weixinqun.com/article)中養(yǎng)生之道、搞笑段子、人氣美食、旅游美景、人生哲理、經(jīng)驗總結(jié)類文章數(shù)據(jù).
(1)數(shù)據(jù)存儲形式
采用MySQL數(shù)據(jù)庫與Redis數(shù)據(jù)庫存儲文章數(shù)據(jù).MySQL是一個開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),文章數(shù)據(jù)爬取后存在該數(shù)據(jù)庫中;而Redis是一個基于內(nèi)存的,存儲形式為Key-Value的非關(guān)系型數(shù)據(jù)庫(NoSql)[10],推薦系統(tǒng)中的待推薦池及其他數(shù)據(jù)池均使用Redis數(shù)據(jù)庫存儲.
為實現(xiàn)微信文章推薦,每個用戶擁有六個數(shù)據(jù)池(如下表1所示),各數(shù)據(jù)池的命名格式為“用戶賬號_數(shù)據(jù)池特性_存儲類型”.
(2)推薦方式選擇
本推薦過程中,實時推薦采用基于內(nèi)容數(shù)據(jù)的推薦方式,根據(jù)用戶近期閱讀的文章,將含有這些文章標(biāo)簽的文章推薦給用戶,從而聚焦在用戶興趣焦點(diǎn)上.離線推薦采用基于用戶行為數(shù)據(jù)的推薦方式,將相似用戶閱讀過而本用戶沒有閱讀過的文章推薦給用戶,拓展推薦數(shù)據(jù)的興趣廣度.
文獻(xiàn)[2]指出基于內(nèi)容數(shù)據(jù)的推薦方式需要進(jìn)行預(yù)處理獲得其項目特性.在來源網(wǎng)站上,微信文章被設(shè)置多個標(biāo)簽來代表其特性,標(biāo)簽數(shù)多為3個,但存在無標(biāo)簽、少標(biāo)簽、多標(biāo)簽、標(biāo)簽不規(guī)范等問題,為此,需要對獲取的文章進(jìn)行預(yù)處理,規(guī)范文章標(biāo)簽.使用Python結(jié)巴分詞結(jié)合TF-IDF統(tǒng)計方法實現(xiàn).
文章標(biāo)簽設(shè)置標(biāo)準(zhǔn)如圖2所示.選取方法如下:
表1 數(shù)據(jù)池設(shè)計表
圖2 標(biāo)簽提取規(guī)則
① 使用Python結(jié)巴分詞,提取3個標(biāo)題關(guān)鍵詞,7個除標(biāo)題關(guān)鍵詞外的內(nèi)容關(guān)鍵詞,兩類關(guān)鍵詞提取詞數(shù)不足時,以能取到的詞數(shù)為準(zhǔn);
② 將所有文章的所有關(guān)鍵詞進(jìn)行統(tǒng)計計數(shù)形成一個關(guān)鍵詞統(tǒng)計排名;
③ 針對每篇文章,從標(biāo)題關(guān)鍵詞中提取TF-IDF最大的一個標(biāo)題關(guān)鍵詞,同理從內(nèi)容關(guān)鍵詞中提取一詞.然后針對剩余的最多8個關(guān)鍵詞,對照關(guān)鍵詞統(tǒng)計排名獲得排名最高的一個高頻詞,以這三個關(guān)鍵詞作為文章標(biāo)簽.
分詞過程中,引用用戶字典,確保如“微信”“朋友圈”等網(wǎng)絡(luò)詞語能夠被識別出來;引用停用詞詞庫,避免分詞結(jié)果出現(xiàn)常用而無意義的詞語;引用同義詞詞庫(如菜鳥和新手同義),使詞語標(biāo)準(zhǔn)化;引用包含詞詞庫(如顏色包含白色、灰色等),使標(biāo)簽更具代表性.
確定標(biāo)簽提取規(guī)則后,我們對527篇具備標(biāo)簽的微信文章進(jìn)行測試,以提取的最多10個關(guān)鍵詞是否包含標(biāo)簽詞作為分詞合格標(biāo)準(zhǔn),以最終提取的3個關(guān)鍵詞是否包含標(biāo)簽詞作為提取合格標(biāo)準(zhǔn)進(jìn)行測試,測試結(jié)果如圖3所示.分詞合格率為91%,提取合格率為87%,基本滿足需求.然后對所有文章進(jìn)行標(biāo)簽處理.以3個優(yōu)先(優(yōu)先保留合格標(biāo)簽,優(yōu)先添加標(biāo)題關(guān)鍵詞,優(yōu)先保留標(biāo)簽與關(guān)鍵詞的重疊詞)為標(biāo)準(zhǔn)結(jié)合關(guān)鍵詞統(tǒng)計排名進(jìn)行設(shè)置,如圖4所示.
圖3 標(biāo)簽詞提取測試情況
圖4 標(biāo)簽設(shè)置規(guī)則
3.3.1 實時推薦
文章標(biāo)簽規(guī)范化處理后,每篇文章固定存在3個標(biāo)簽代表文章特性.實時推薦模塊采用基于內(nèi)容數(shù)據(jù)的推薦方式進(jìn)行推薦,具體流程如圖5所示.
圖5中文章流行度涉及到標(biāo)簽流行度[11]的概念,標(biāo)簽流行度是指用戶查看的所有文章中某標(biāo)簽出現(xiàn)的頻率高低,計算方法如式(1)所示
其中,T(u)表示用戶u閱讀的文章所有標(biāo)簽集合,Freq(u,ti)表示用戶u閱讀所有文章中標(biāo)簽ti的次數(shù).
文章流行度是指用戶對文章的偏好程度,可以用文章標(biāo)簽流行度累加和表示,如式(2)如下:
其中,T(r)表示文章r的所有標(biāo)簽.對于本文研究的微信文章,該公式所計算的就是每篇文章中三個標(biāo)簽的流行度之和.
3.3.2 離線推薦
用戶統(tǒng)計模塊統(tǒng)計用戶閱讀的所有文章的id、類型以及標(biāo)簽,離線推薦模塊根據(jù)這些歷史數(shù)據(jù)采用基于用戶行為數(shù)據(jù)的推薦方式進(jìn)行推薦,具體推薦流程如圖6所示.
圖6 離線推薦流程
(1)群組劃分
用戶統(tǒng)計模塊中類型統(tǒng)計池對用戶閱讀的所有文章的類型進(jìn)行統(tǒng)計,即記錄了用戶閱讀美文哲理、幽默笑話、趣味測試、經(jīng)驗總結(jié)、美食美景及保健養(yǎng)生6類文章的文章數(shù).將該數(shù)據(jù)記為一個代表用戶閱讀類型偏好的六維向量,計算兩用戶間余弦相似度,余弦值越接近1表示越相似,越接近0表示越不相似.計算方法如式(3)所示,其中xi,yi分別表示用戶x與用戶y在統(tǒng)計模塊中類型統(tǒng)計池內(nèi)i類型文章的統(tǒng)計數(shù).
在用戶群體中隨機(jī)抽取一名用戶,計算該用戶與剩余所有用戶的余弦相似度,取閥值為0.8,將余弦相似度大于等于0.8的用戶以及該用戶劃分為一個群組從用戶群體中剝離.在余下的用戶群體中再隨機(jī)抽取一名用戶,如上述方法計算,直至將用戶群體完全劃分.
(2)尋找相似用戶
用戶標(biāo)簽是指用戶經(jīng)常看的文章標(biāo)簽集合,以該數(shù)據(jù)代表用戶閱讀主題偏好.統(tǒng)計模塊中標(biāo)簽統(tǒng)計池對用戶閱讀的所有文章的標(biāo)簽進(jìn)行了統(tǒng)計,利用這些數(shù)據(jù)可以計算用戶標(biāo)簽,具體方法為:去除標(biāo)簽統(tǒng)計池內(nèi)用戶只閱讀過一次的標(biāo)簽,然后將剩余標(biāo)簽根據(jù)標(biāo)簽流行度(式(1))排序,排名前80%的標(biāo)簽集合作為用戶標(biāo)簽.通過計算用戶間標(biāo)簽重疊率,重疊率越接近1越相似,計算方法如式(4)所示,其中l(wèi)abelsi表示用戶i的標(biāo)簽,overlap(i,j)表示用戶i與用戶j的標(biāo)簽重疊率:
群組劃分后,對于每個群組,遍歷群組成員,計算該成員與其他成員的標(biāo)簽重疊率,取閥值0.5,重疊率大約等于0.5的成員即為該成員的最終相似用戶.
(3)被分享池
將這些相似用戶的已閱讀池內(nèi)的數(shù)據(jù),經(jīng)過去重處理,記錄到本用戶的被分享池內(nèi).被分享池內(nèi)的文章數(shù)據(jù)即為離線推薦數(shù)據(jù).
3.3.3 整體推薦策略
本推薦系統(tǒng)中實時推薦在每次用戶獲取數(shù)據(jù)時運(yùn)行一次,運(yùn)行次數(shù)取決于用戶的獲取次數(shù),而離線推薦每天定時執(zhí)行一次,所產(chǎn)生的推薦數(shù)據(jù)存儲在用戶的被分享池內(nèi).
控制模塊一方面對傳遞過來的實時/離線推薦數(shù)據(jù)進(jìn)行去重處理,包括與用戶的歷史數(shù)據(jù)比較去重,與待推薦池內(nèi)數(shù)據(jù)比較去重,實時與離線推薦數(shù)據(jù)比較去重.另一方面,監(jiān)控待推薦池內(nèi)數(shù)據(jù)量變化,以加權(quán)及具體場景具體分析的方式組合兩類推薦數(shù)據(jù)補(bǔ)充待推薦池,具體組合方式如表2所示.當(dāng)需要增添其他推薦方式時,通過對該模塊進(jìn)行設(shè)置,結(jié)合這些推薦算法的推薦結(jié)果,從而提高了系統(tǒng)的可伸縮能力,如圖7所示.
本文設(shè)計的推薦系統(tǒng),其目的主要在于讓推薦的數(shù)據(jù)能夠貼合用戶的偏好,可以通過對待推薦池內(nèi)數(shù)據(jù)進(jìn)行分析,考查本系統(tǒng)推薦效果.
以10 788篇微信文章進(jìn)行推薦測試,設(shè)置用戶待推薦池容積為100,每次推薦,提取池內(nèi)10篇文章數(shù)據(jù)給用戶.系統(tǒng)模擬100名用戶,每名用戶進(jìn)行了100次推薦操作,為貼近實際情況,保證模擬效果,所模擬的用戶一方面需要具有一定的興趣偏好,另一方面還能按照一定概率閱讀不在該偏好內(nèi)的其他文章.因此,對模擬用戶做如下設(shè)置:① 每名用戶隨機(jī)具有1~3個感興趣的文章類型.② 每次推薦,用戶會隨機(jī)閱讀1~3篇偏好類型的文章.③ 每次推薦,用戶有20%的概率閱讀1篇不在偏好類型之內(nèi)的其他類型的文章.推薦過程中,前50次只進(jìn)行實時推薦,第50次以后加入離線推薦,每進(jìn)行25次推薦,統(tǒng)計所有用戶當(dāng)前待推薦池內(nèi),含有2個及以上用戶標(biāo)簽的文章所占比例,計算最大值、最小值、平均值、兩平均值總和以及該總和的增長比例.實驗結(jié)果如表3所示.
表2 兩類推薦數(shù)據(jù)組合方式
圖7 整體推薦流程
含有2個及以上用戶標(biāo)簽的文章可以認(rèn)為是用戶感興趣的文章.初始狀態(tài)下,待推薦池內(nèi)含2個及以上用戶標(biāo)簽的文章所占比例為0.根據(jù)表3所示,經(jīng)過25次推薦,占比約占22.97%,之后每25次推薦,達(dá)到44.39%,50.75%,53.48%,分別增長了93.25%,14.33%,5.38%.經(jīng)過100次推薦后,含用戶標(biāo)簽的文章總計約占91.76%,其中能夠代表用戶感興趣的文章(含有2個及以上用戶標(biāo)簽的文章)約占53.48%,只含有1個用戶標(biāo)簽的文章約占38.28%,如表4所示.從池內(nèi)文章占比變化可以看出,待推薦池內(nèi)文章能夠逐漸貼近用戶偏好.
表3 待推薦池內(nèi)含2個及以上用戶標(biāo)簽的文章占比變化表
表4 待推薦池最終各類文章占比
本文設(shè)計了一種結(jié)合實時推薦與離線推薦的推薦系統(tǒng),能夠保證系統(tǒng)運(yùn)行流暢、具備可伸縮能力以及能夠適應(yīng)用戶長期偏好及短期興趣焦點(diǎn)變化.基于該系統(tǒng),實現(xiàn)了對于微信文章的推薦實驗,采用易理解、可操作、效果可見的推薦方式,在實驗中,推薦方式具備如下特點(diǎn):① 用戶歷史數(shù)據(jù)稀疏不影響推薦系統(tǒng)運(yùn)行;② 只采集了用戶閱讀行為,無評分機(jī)制;③ 系統(tǒng)具備可伸縮能力,能夠根據(jù)各推薦模塊產(chǎn)生的推薦數(shù)據(jù)量,調(diào)節(jié)兩類推薦數(shù)據(jù)比例,并且可以增添其他推薦方式;④ 保證了推薦系統(tǒng)始終運(yùn)行流暢.此外,對于推薦系統(tǒng)評價方面,本系統(tǒng)通過對待推薦池內(nèi)數(shù)據(jù)分析來對本系統(tǒng)推薦效果進(jìn)行評價,實驗表明待推薦池內(nèi)數(shù)據(jù)能夠逐步貼近用戶興趣偏好.