史愛武 李險貴



摘要:推薦系統廣泛應用于人們生活的多個領域,日常生活中常見的有電商、電影、音樂和新聞推薦等。推薦系統根據用戶的歷史偏好主動推送相關的信息,節約了用戶的時間,極大地提升了用戶的體驗。隨著大數據技術的發展成熟,數據處理的速度變得更快。該文選取MovieLens電影數據集,并基于大數據分布式處理框架Spark和交替最小二乘法ALS等算法搭建數據處理平臺,然后再結合Spring Boot和Spring Cloud等搭建電影后臺服務,實現一個基于微服務架構的電影推薦系統。
關鍵詞:推薦系統;Spark;ALS;微服務架構
Abstract: Recommendation system is widely used in many fields of people's life, such as e-commerce, movies, music and news recommendation and so on. Recommendation system actively pushes relevant information according to the user's historical preference, which saves the user's time and greatly improves the user's experience. With the development and maturity of big data technology, the speed of data processing becomes faster. This paper selects movielens movie data set, builds a data processing platform based on big data distributed processing framework Spark and alternating least squares algorithm ALS, and then builds movie background service combined with Spring Boot and Spring Cloud to realize a movie recommendation system based on microservice architecture.
Key words: recommendation system; Spark; ALS; microservice architecture
1 背景
大數據時代用戶面臨信息過載的問題,為了從海量數據中找到用戶可能感興趣的信息,由此產生了推薦系統。日常生活中常見的有電商、電影、音樂和新聞推薦等[1]。隨著大數據技術如Spark、Flink等的發展成熟,其計算速度更快,可以更好地為廣大群眾服務。本文將基于Spark和微服務架構設計并實現一個簡易的電影推薦系統。
2 相關技術
2.1 推薦策略
推薦系統的實質是對用戶或者物品的本身屬性即基本信息,或者是對用戶的行為數據進行分析,通過特定的算法模型從海量數據中找到相關性,從而產生推薦的結果。常見的推薦策略有基于內容的推薦、協同過濾推薦和混合推薦等[2]。
基于內容的推薦,即根據物品自身的屬性特征計算物品間的相關性或相似性,再基于用戶的歷史偏好記錄為用戶推薦相似的物品。基于協同過濾的推薦,即根據用戶評分矩陣,用戶和物品協同作戰。協同過濾推薦可分為基于內存的協同過濾Memory-based CF和基于模型的協同過濾Model-based CF。Memory-based 可分為基于用戶的協同過濾User-based CF和基于物品的協同過濾Item-based CF[3]。混合推薦,即多種算法按照不同的策略進行混合后再推薦,常見的混合推薦有加權、切換、分區、分層、瀑布式混合、特征組合和特征增強等[4]。
2.2 Spark介紹
Spark作為大數據并行計算框架,由于支持內存計算,減少了IO開銷,帶來了更高的迭代計算效率,同時Spark也支持批處理和實時流數據處理等。Spark包含的組件主要有Spark Core、Spark SQL、Spark Streaming、Structured Streaming、MLlib和GraphX等[5]。
2.3 微服務架構
微服務架構將單一應用細分為多個微服務,可以獨立開發和部署每個微服務,便于開發和維護。多個微服務之間互相協調、互相配合。常見的微服務架構有Spring Cloud和Dubbo等等。微服務架構體系包含服務注冊與發現、服務調用、服務降級、服務網關、服務配置和服務總線等[6],對應的組件如表1所示。
3 系統設計
3.1 架構設計
本系統采用微服務架構,并基于前后端分離設計理念。系統架構設計如下圖1,首先選取MovieLens電影數據集ml-1m,并基于Spark進行數據處理,將結果存入到MongoDB中;然后基于Spring Boot搭建電影后臺微服務,同時將服務注冊到Nacos中;前端基于Vue等進行開發,通過服務網關Gateway訪問不同的服務,并由Feign調用具體的微服務[7]。
3.2 功能模塊
本系統主要分為數據處理部分和電影后臺微服務部分。如圖2其中數據處理主要包括離線統計模塊和離線推薦模塊,離線統計模塊包含最新電影推薦和熱門電影推薦功能;離線推薦模塊包含基于交替最小二乘法ALS的協同過濾推薦、基于物品的協同過濾推薦和基于內容的推薦;電影后臺服務包含電影模塊和用戶模塊等。
4 系統實現
4.1 開發工具和開發環境
實現一個簡易的基于微服務架構的電影推薦系統,選取IntelliJ IDEA和Visual Studio Code為開發工具,開發環境如下表2。
4.2 熱門電影推薦實現
熱門電影推薦考慮最近每周內每部電影的評分次數,評分次數越多說明該電影的熱度越高。具體流程如下。
1)加載數據集。
2)統計最近每周電影的評分次數并進行降序排序。
3)將結果存入到MongoDB中。
4.3 基于ALS的協同過濾推薦實現
交替最小二乘法ALS其實是將一個稀疏的用戶評分矩陣通過降維得到用戶隱特征矩陣和電影隱特征矩陣的過程[8],推薦流程如下。
1)加載數據集并隨機切分為訓練集和測試集。
2)多次調整ALS的參數如迭代次數iteration、隱特征個數k和正則化系數lambda等對模型進行訓練。
3)計算每種參數組合下測試集預測評分與實際評分之間的均方根誤差RMSE。
4)選取RMSE最小時的參數組合作為ALS的最優參數組合。
5)通過訓練ALS模型得到電影隱特征矩陣。
6)計算兩兩電影隱特征向量的余弦相似度并按照相似度進行降序排序。
7)將結果存入到MongoDB中。
4.4 基于物品的協同過濾推薦實現
基于物品的協同過濾是根據用戶的行為數據如評分、點擊、收藏等計算出兩物品間的相似度,即兩物品間有相同的受眾,表示兩物品間有相關性。以用戶評分記錄為例,具體流程如下。
1)加載數據集。
2)統計每部電影的評分個數,并根據電影ID進行組合。
3)統計兩兩電影被同一用戶評過分的次數。
4)計算兩兩電影間的同現相似度并按相似度降序排序。
5)將結果存入到MongoDB中。
4.5 電影后臺服務實現
電影后臺服務基于Spring Boot和Spring Cloud等實現,主要功能是讀取MongoDB中的數據,并對外提供用戶模塊和電影模塊的訪問接口。為了讓每種算法推薦的效果更加明顯,基于Vue搭建前端項目,最終前端頁面的推薦效果如圖3,其中上半部分展示電影的詳細信息,中間部分展示各種推薦算法推薦的電影ID列表和是否有交集及交集個數,下半部分展示不同算法推薦的電影列表及相似度。
5 結束語
通過設計并實現一個簡易的電影推薦系統,對Spark進行數據處理和微服務架構等有更深入的了解,同時也了解了不同推薦算法的具體流程,本系統暫時包含最新電影推薦、熱門電影推薦、基于ALS的協同過濾推薦、基于物品的協同過濾推薦、基于內容的推薦、用戶注冊登錄和電影展示等功能。未來的研究工作將結合kmeans和深度學習等模型進行推薦,提高推薦的多樣性和準確率,同時也可考慮進行實時推薦。
參考文獻:
[1] 項亮.推薦系統實踐[M].北京:人民郵電出版社,2012.
[2] Zhang S,Yao L N,Sun A X,et al.Deep learning based recommender system:a survey and new perspectives[EB/OL].[2020-03-02].https://arxiv.org/abs/1707.07435.
[3] Zhang Y F,Chen X.Explainable recommendation:a survey and new perspectives[J].Foundations and Trends? in Information Retrieval,2020,14(1):1-101.
[4] 張志威.個性化推薦算法研究綜述[J].信息與電腦(理論版),2018(17):27-29.
[5] 林子雨.大數據技術原理與應用:概念、存儲、處理、分析與應用[M].2版.北京:人民郵電出版社,2017.
[6] 馮志勇,徐硯偉,薛霄,等.微服務技術發展的現狀與展望[J].計算機研究與發展,2020,57(5):1103-1122.
[7] 熊其昌.基于微服務架構的學習系統設計與實現[D].武漢:華中師范大學,2020.
[8] 侯敬儒,吳晟,李英娜.基于Spark的并行ALS協同過濾算法研究[J].計算機與數字工程,2017,45(11):2197-2201.
【通聯編輯:謝媛媛】