国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Spark的電影推薦系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

2023-06-10 06:42:26蔡春花
軟件工程 2023年6期
關(guān)鍵詞:離線日志矩陣

劉 念, 蔡春花

(黃河交通學(xué)院, 河南 焦作 454000)

1 引言(Introduction)

20世紀(jì)90年代以來,個(gè)性化推薦系統(tǒng)受到了全球各大在線平臺(tái)的關(guān)注和研究。與此同時(shí),逐漸出現(xiàn)了各種不同的推薦系統(tǒng)及推薦算法。2014年,RAMEZANI等[1]提出了一種基于用戶興趣模式,尋找鄰居用戶的方法,該方法改善了傳統(tǒng)推薦算法在稀疏性和計(jì)算上的問題。2019年,KIM等[2]為降低評(píng)分相關(guān)數(shù)據(jù)的稀疏現(xiàn)象提出了基于免疫網(wǎng)絡(luò)的推薦算法,該算法采用收縮評(píng)分矩陣的方法,在降低數(shù)據(jù)稀疏性方面的效果顯著。

隨著互聯(lián)網(wǎng)時(shí)代的推進(jìn),用戶對(duì)推薦系統(tǒng)的需求呈現(xiàn)多樣化的趨勢,只有單一推薦算法的推薦系統(tǒng)在推薦質(zhì)量和計(jì)算效率上已經(jīng)無法滿足時(shí)代的需求。國內(nèi)學(xué)者對(duì)推薦系統(tǒng)的研究從未停止,宋文君等[3]提出的改進(jìn)混合推薦算法,應(yīng)用在Netflix數(shù)據(jù)集上的推薦結(jié)果準(zhǔn)確性平均提高了4.22%,而且降低了大規(guī)模數(shù)據(jù)所引發(fā)的計(jì)算復(fù)雜度。王全民等[4]提出的綜合推薦法,是利用人口統(tǒng)計(jì)資料與評(píng)分資料求得系統(tǒng)內(nèi)物品的相似性;綜合推薦算法表現(xiàn)出較好的推薦質(zhì)量。

觀看電影已經(jīng)成為一種重要的娛樂方式,人們在閑暇時(shí)間會(huì)在視頻軟件中搜索熱播的影視節(jié)目。由于現(xiàn)有的視頻軟件電影分類不夠健全,因此有必要設(shè)計(jì)了一個(gè)根據(jù)用戶偏好和通過簡單操作就能獲得電影推薦的系統(tǒng)?;诖?本文設(shè)計(jì)一個(gè)基于Spark[5]的電影推薦系統(tǒng),該系統(tǒng)根據(jù)用戶推薦需求,采用基于模型和內(nèi)容的推薦算法,使用MongoDB業(yè)務(wù)數(shù)據(jù)庫、Redis緩存數(shù)據(jù)庫,以及Flume、Kafka、Spring等工具,實(shí)現(xiàn)電影推薦功能。

2 系統(tǒng)設(shè)計(jì)(System design)

2.1 總體架構(gòu)設(shè)計(jì)

本節(jié)主要介紹系統(tǒng)的總體架構(gòu),本設(shè)計(jì)采用大數(shù)據(jù)框架中最流行的Spark分布式計(jì)算引擎,結(jié)合MongoDB數(shù)據(jù)庫、Flume、Kafka及Spring等工具搭建一個(gè)支持處理海量數(shù)據(jù)的離線和實(shí)時(shí)的電影推薦系統(tǒng)。系統(tǒng)總體架構(gòu)設(shè)計(jì)如圖1所示。

圖1 系統(tǒng)架構(gòu)圖Fig.1 System architecture diagram

該推薦系統(tǒng)是基于Web開發(fā)的B/S系統(tǒng),其業(yè)務(wù)邏輯架構(gòu)是由Web前端響應(yīng)后臺(tái)業(yè)務(wù)請求的Spring框架創(chuàng)建的,采用MongoDB管理業(yè)務(wù)數(shù)據(jù)庫;采用Elastic Search作為檢索服務(wù)器實(shí)現(xiàn)匹配查詢操作;采用Redis作為緩存數(shù)據(jù)庫實(shí)現(xiàn)實(shí)時(shí)推薦模塊里對(duì)數(shù)據(jù)的提取。系統(tǒng)基于Spark平臺(tái),運(yùn)用到了Spark部分生態(tài)組件。采用Flume進(jìn)行日志收集業(yè)務(wù)以及Kafka進(jìn)行消息緩沖操作,使用Spark Streaming將Kafka處理后的實(shí)時(shí)數(shù)據(jù)合并更新到MongoDB數(shù)據(jù)庫。

如圖1所示,系統(tǒng)的Web端綜合業(yè)務(wù)服務(wù)模塊包括用戶登錄、用戶注冊、電影評(píng)分、電影推薦和電影搜索功能,主要負(fù)責(zé)將后臺(tái)業(yè)務(wù)數(shù)據(jù),如圖片和文字等展現(xiàn)給用戶,為用戶展示推薦結(jié)果,實(shí)現(xiàn)用戶與系統(tǒng)的交互。

后臺(tái)的業(yè)務(wù)除了響應(yīng)前端的數(shù)據(jù)處理,還應(yīng)把數(shù)據(jù)寫入對(duì)應(yīng)的數(shù)據(jù)庫。系統(tǒng)使用的核心業(yè)務(wù)數(shù)據(jù)庫是MongoDB,原始數(shù)據(jù)全部存在MongoDB中,然后從里面讀數(shù)據(jù),讀完數(shù)據(jù)做分析計(jì)算,計(jì)算后得到的推薦結(jié)果也寫入MongoDB。系統(tǒng)采用Elastic Search的匹配查詢功能和Redis緩存數(shù)據(jù)庫存放用戶最近的幾次電影評(píng)分,可使系統(tǒng)在實(shí)時(shí)推薦時(shí)快速獲取所需數(shù)據(jù)。

數(shù)據(jù)采集使用Flume技術(shù),將用戶在商業(yè)平臺(tái)上對(duì)某一影片的評(píng)分行為及其數(shù)據(jù)進(jìn)行收集,并將其實(shí)時(shí)傳輸至Kafka集群。本系統(tǒng)使用Kafka作為流數(shù)據(jù)緩存部件,用于接收Flume的數(shù)據(jù)收集,并把資料傳送至實(shí)時(shí)推薦系統(tǒng)。使用Redis作為緩存數(shù)據(jù)庫的目的是為了支持實(shí)時(shí)推薦系統(tǒng)中的數(shù)據(jù)快速采集。

離線推薦模塊,首先進(jìn)行離線的統(tǒng)計(jì)推薦服務(wù),由于需要加載的數(shù)據(jù)量較大,Spark SQL會(huì)對(duì)所獲得的數(shù)據(jù)進(jìn)行一系列的數(shù)據(jù)預(yù)處理,與MongoDB和Elastic Search有對(duì)應(yīng)的連接方式,只需把定義好的數(shù)據(jù)直接寫入,保存在數(shù)據(jù)庫中供系統(tǒng)調(diào)用,這就是數(shù)據(jù)加載的過程。寫入數(shù)據(jù)后做離線統(tǒng)計(jì)服務(wù),這部分涉及四個(gè)常見的統(tǒng)計(jì)量,包括歷史熱門電影、近期熱門電影、電影平均評(píng)分和各類別優(yōu)質(zhì)電影,這部分的數(shù)據(jù)從MongoDB讀取并做處理,對(duì)應(yīng)生成各自的推薦列表,最后寫回MongoDB,由于統(tǒng)計(jì)推薦為用戶推薦當(dāng)前主流電影和經(jīng)典電影,所有用戶看到的推薦列表都是一樣的,所以又叫做非個(gè)性化的離線統(tǒng)計(jì)推薦。然后進(jìn)行個(gè)性化的離線推薦服務(wù),這也是一個(gè)協(xié)同過濾的推薦,利用Spark MLlib庫的ALS(Alternating Least Squares,交替最小二乘)算法對(duì)用戶評(píng)分?jǐn)?shù)據(jù)通過隱語義模型做預(yù)測評(píng)分,然后通過預(yù)測評(píng)分求電影之間的相似度,得到的結(jié)果是用戶推薦列表,最后把結(jié)果寫回業(yè)務(wù)數(shù)據(jù)庫。

實(shí)時(shí)推薦模塊的流程為用戶在系統(tǒng)電影詳情頁面進(jìn)行電影評(píng)分,用戶請求發(fā)送至業(yè)務(wù)后臺(tái),電影數(shù)據(jù)先寫入MongoDB,使用Flume技術(shù)從綜合業(yè)務(wù)后臺(tái)日志環(huán)境里收集日志,然后推送到Kafka集群上做消息隊(duì)列的緩沖,待Kafka做完處理后,Spark Streaming從Kafka主題拉取MongoDB和Redis收集的用戶行為數(shù)據(jù),對(duì)預(yù)處理后得到評(píng)分?jǐn)?shù)據(jù)進(jìn)行實(shí)時(shí)推薦,結(jié)果寫回MongoDB。對(duì)應(yīng)的搜索服務(wù)要結(jié)合MongoDB和 Elastic Search檢索服務(wù)器,推薦結(jié)果的查詢需要從數(shù)據(jù)庫獲取數(shù)據(jù),最后返回前臺(tái)。

2.2 系統(tǒng)功能設(shè)計(jì)

電影推薦系統(tǒng)的核心是針對(duì)不同的用戶進(jìn)行不同類型的電影推薦,那么相應(yīng)的系統(tǒng)功能需求也是圍繞著推薦業(yè)務(wù)服務(wù)展開,具體要具備的功能要求如圖2所示。

圖2 用戶功能模塊框架圖Fig.2 Framework of user function module

2.3 數(shù)據(jù)庫設(shè)計(jì)

電影推薦系統(tǒng)使用了三種數(shù)據(jù)庫,分別是MongoDB業(yè)務(wù)數(shù)據(jù)庫、Redis緩存數(shù)據(jù)庫和Elastic Search檢索服務(wù)器。其中,MongoDB是系統(tǒng)的核心數(shù)據(jù)庫,數(shù)據(jù)源可以以文檔的形式存儲(chǔ)在MongoDB數(shù)據(jù)庫中,也可以自定義數(shù)據(jù)結(jié)構(gòu),適合海量數(shù)據(jù)存儲(chǔ),除了存儲(chǔ)數(shù)據(jù)源,還能存儲(chǔ)用戶信息表、各種推薦指標(biāo)的電影推薦列表和通過推薦算法得到的推薦矩陣列表,例如電影信息表(Movie)、電影評(píng)分表(Rating)和電影標(biāo)簽表(Tag)。電影信息表(表1)主要記錄每部電影的關(guān)鍵信息以及影響用戶選擇的多種因素,進(jìn)而為實(shí)現(xiàn)個(gè)性化推薦提供數(shù)據(jù)支持,同時(shí)可以完成統(tǒng)計(jì)類推薦。電影評(píng)分表(表2)用來記錄用戶在過去一段時(shí)間內(nèi)的評(píng)分行為信息、具體評(píng)分時(shí)間和行為內(nèi)容。該表的數(shù)據(jù)來源于日志數(shù)據(jù)。電影標(biāo)簽表(表3)用來記錄每個(gè)用戶關(guān)注的電影集合及其類別,數(shù)據(jù)源主要是為個(gè)性化的推薦服務(wù)提供支持。

表 1 電影信息表Tab.1 Movie table

表 2 電影評(píng)分表Tab.2 Rating table

表 3 電影標(biāo)簽表Tab.3 Movie tag table

Redis緩存數(shù)據(jù)庫用于存放用戶近期對(duì)影片的評(píng)分?jǐn)?shù)據(jù),作為支撐實(shí)時(shí)推薦算法的數(shù)據(jù)源,當(dāng)用戶對(duì)電影進(jìn)行評(píng)分時(shí),后臺(tái)服務(wù)記錄數(shù)據(jù)后,將數(shù)據(jù)推送至Redis緩存數(shù)據(jù)庫用于計(jì)算電影的預(yù)測評(píng)分。

Elastic Search檢索服務(wù)器主要存放一些搜索業(yè)務(wù)需求產(chǎn)生的數(shù)據(jù),系統(tǒng)利用其強(qiáng)大的匹配查詢能力實(shí)現(xiàn)基于內(nèi)容的推薦服務(wù)。

3 系統(tǒng)實(shí)現(xiàn)(System implementation)

3.1 系統(tǒng)環(huán)境介紹

本系統(tǒng)主要在Windows和Linux操作系統(tǒng)上運(yùn)行。系統(tǒng)的開發(fā)環(huán)境為CentOS7.0、JDK1.8版本、ZooKeeper分布式服務(wù)管理框架3.4版本、Flume日志采集工具1.7.0版本、Kafka分布式消息隊(duì)列2.11版本、MongoDB分布式文件存儲(chǔ)數(shù)據(jù)庫5.0.4版本、Key-Value數(shù)據(jù)庫Redis4.0.2版本、Elastic Search搜索服務(wù)器5.6.2版本。主要開發(fā)工具為IntelliJ IDEA,推薦系統(tǒng)模塊的開發(fā)語言主要為Java和Scala。物理機(jī)的硬件配置為16 GB內(nèi)存、500 GB硬盤,CPU為Intel Core i7-11800H。

3.2 Spark集群搭建

本系統(tǒng)基于Spark平臺(tái)對(duì)海量數(shù)據(jù)進(jìn)行存儲(chǔ)和分析,但受經(jīng)濟(jì)條件的約束,實(shí)際開發(fā)過程中只配置了一臺(tái)物理機(jī),所以采取Spark的偽分布式集群安裝模式,在一臺(tái)物理機(jī)上模擬多機(jī),通過虛擬機(jī)技術(shù)實(shí)現(xiàn)小規(guī)模的集群,其中Spark由4個(gè)虛擬節(jié)點(diǎn)組成(1個(gè)Master節(jié)點(diǎn)和3個(gè)Slave節(jié)點(diǎn))。以下為偽分布式Spark集群的搭建步驟。

(1)首先在物理機(jī)上安裝VMware虛擬機(jī)軟件,然后在虛擬機(jī)中安裝CentOS操作系統(tǒng)的鏡像文件,在Linux系統(tǒng)中安裝JDK,配置其環(huán)境變量,主機(jī)名為hadoop102,重復(fù)上述步驟,在虛擬機(jī)中再次安裝、運(yùn)行2個(gè)CentOS系統(tǒng),主機(jī)名分別設(shè)置為hadoop103、hadoop104。

(2)在集群中配置ssh,生成公鑰,實(shí)現(xiàn)3臺(tái)客戶機(jī)的相互免密碼登錄、修改對(duì)應(yīng)配置文件及加入集群節(jié)點(diǎn)的主機(jī)名。配置Spark運(yùn)行的IP地址、端口號(hào)、JDK位置和集群對(duì)應(yīng)的Master節(jié)點(diǎn)等信息。

(3)以獨(dú)立部署模式Standalone為例,使用Spark自身節(jié)點(diǎn)運(yùn)行集群模式,執(zhí)行腳本命令sbin/start-all.sh,查看3臺(tái)服務(wù)器運(yùn)行進(jìn)程,可以看到1個(gè)Master節(jié)點(diǎn)和3個(gè)Slave節(jié)點(diǎn)均正常運(yùn)行。Spark運(yùn)行圖如圖3所示。

圖3 Spark運(yùn)行圖Fig.3 Spark operation diagram

3.3 數(shù)據(jù)采集模塊

電影推薦系統(tǒng)采用Fulme作為實(shí)時(shí)日志數(shù)據(jù)采集引擎,該引擎包括三個(gè)組件,即Source、Channel和Sink,Source是指數(shù)據(jù)的來源和方式,Channel是一個(gè)數(shù)據(jù)的緩沖池,Sink定義了數(shù)據(jù)輸出的方式和目的地[6]。使用Flume將日志數(shù)據(jù)更新到Kafka隊(duì)列,實(shí)現(xiàn)流式的日志處理,使用Spark Streaming流式實(shí)時(shí)處理技術(shù),從而完成日志實(shí)時(shí)解析的目標(biāo)。Flume組件結(jié)構(gòu)如圖4所示。

圖4 Flume組件Fig.4 Flume component

Kafka配置如下:

∥輸入和輸出的topic

string from = ″log″ ;

String to = ″recommender ″;

∥定義Kafka Streaming的配置

Properties settings = new Properties();

settings.put(StreamsConfig.APPLICATION_ID_CONFIG,″logFilter″);

settings.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,brokers);

settings.put(StreamsConfig.ZOOKEEPER_CONMECT_CONFIG,zookeepers);

∥創(chuàng)建 Kafka Stream配置對(duì)象

StreamsConfig config = new StreamsConfig(settings);

∥創(chuàng)建一個(gè)拓?fù)浣?gòu)器

TopologyBuilder builder = new TopologyBuilder();

∥定義流處理的拓?fù)浣Y(jié)構(gòu)

builder.addSource( ″SOURCE″,from)

.addProcessor(″PROCESSOR″,()->new LogProcessor(), ″SOURCE″″)

.addSink( ″SINK″,to,″PROCESSOR″);

KafkaStreams streams = new KafkaStreams( builder,config );

3.4 推薦計(jì)算模塊

3.4.1 離線推薦

基于模型的協(xié)同過濾算法(ModelCF)根據(jù)已有的用戶評(píng)分?jǐn)?shù)據(jù)進(jìn)行學(xué)習(xí)并訓(xùn)練模型,進(jìn)而預(yù)測空白的用戶和物品之間的評(píng)分關(guān)系。實(shí)際上,ModelCF算法可以稱作是基于用戶的協(xié)同過濾算法(UserCF)和基于物品的協(xié)同過濾算法(ItemCF)的混合形式,同時(shí)分析了用戶和物品兩個(gè)方面,讓其更加節(jié)省空間,并且訓(xùn)練和預(yù)測速度也更快,推薦結(jié)果也更加準(zhǔn)確。交替最小二乘(ALS)矩陣分解的協(xié)同過濾算法[7]就是典型的基于模型的協(xié)同過濾算法。

該矩陣是用戶與物品之間的關(guān)系矩陣,其數(shù)值代表用戶對(duì)物品的看法,數(shù)值可為布爾值。1代表曾做過的事,例如喜歡、點(diǎn)擊、購買,0代表沒有,此矩陣稱為“行為矩陣”。此外,矩陣的數(shù)值還可以是一個(gè)表示回饋的分?jǐn)?shù),例如0—5的數(shù)值,這個(gè)矩陣叫做“分?jǐn)?shù)矩陣”。由于用戶無法對(duì)所有項(xiàng)目進(jìn)行操作,因此該矩陣是稀疏的?;谀P偷膮f(xié)同過濾算法是通過訓(xùn)練出一個(gè)參數(shù)模型描述用戶與物品、用戶與用戶或者物品與物品之間的關(guān)系,然后通過優(yōu)化過程得到模型參數(shù)。離線推薦算法的執(zhí)行流程如圖5所示。

圖5 離線推薦算法流程Fig.5 Offline recommendation algorithm flow

3.4.2 實(shí)時(shí)推薦算法

基于內(nèi)容的推薦算法[8]的具體流程為加載電影內(nèi)容信息數(shù)據(jù),提取電影ID (Mid)、電影名稱(Name)和電影所屬類別(Genres)3項(xiàng)作為電影原始內(nèi)容特征;實(shí)例化一個(gè)分詞器,默認(rèn)按空格分詞,用分詞器對(duì)原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換,生成新的數(shù)據(jù)結(jié)構(gòu);引入HashingTF工具,把一個(gè)詞語序列轉(zhuǎn)化成對(duì)應(yīng)的詞頻TF(Term Frequency);引入逆文檔頻率IDF(Inverse Document Frequency)工具,訓(xùn)練IDF模型得到一個(gè)詞的逆文檔頻率;用模型對(duì)原數(shù)據(jù)進(jìn)行處理,得到文檔中每個(gè)詞的TF-IDF[9],作為新的特征向量;通過特征向量計(jì)算電影相似度矩陣,通過實(shí)時(shí)推薦算法計(jì)算基于內(nèi)容的實(shí)時(shí)推薦結(jié)果。

4 結(jié)論(Conclusion)

本文以Spark分布式計(jì)算引擎為核心,設(shè)計(jì)了離線推薦和實(shí)時(shí)推薦相結(jié)合的電影推薦系統(tǒng),結(jié)合MongoDB、Kafka、Flume等與推薦系統(tǒng)相關(guān)的大數(shù)據(jù)技術(shù),對(duì)電影推薦系統(tǒng)的整體架構(gòu)設(shè)計(jì)、功能模塊設(shè)計(jì)、數(shù)據(jù)庫設(shè)計(jì)、系統(tǒng)環(huán)境的搭建、數(shù)據(jù)采集模塊的設(shè)計(jì)以及推薦算法的設(shè)計(jì)進(jìn)行了詳細(xì)的闡述,系統(tǒng)各部分功能實(shí)現(xiàn)后,通過測試驗(yàn)證了各模塊的功能滿足使用需求,可用性較高。

在電影推薦系統(tǒng)中可以綜合考慮新用戶的個(gè)人信息如性別、年齡、職業(yè)等,以及用戶在頁面的停留時(shí)間、點(diǎn)擊次數(shù)等隱式特征信息,提高系統(tǒng)推薦的準(zhǔn)確度。

猜你喜歡
離線日志矩陣
一名老黨員的工作日志
異步電機(jī)離線參數(shù)辨識(shí)方法
呼吸閥離線檢驗(yàn)工藝與評(píng)定探討
淺談ATC離線基礎(chǔ)數(shù)據(jù)的準(zhǔn)備
扶貧日志
心聲歌刊(2020年4期)2020-09-07 06:37:14
離線富集-HPLC法同時(shí)測定氨咖黃敏膠囊中5種合成色素
中成藥(2018年2期)2018-05-09 07:20:09
游學(xué)日志
初等行變換與初等列變換并用求逆矩陣
矩陣
南都周刊(2015年1期)2015-09-10 07:22:44
矩陣
南都周刊(2015年3期)2015-09-10 07:22:44
宽甸| 瓮安县| 台东市| 曲水县| 京山县| 丰台区| 马尔康县| 福建省| 银川市| 江阴市| 远安县| 昭通市| 乐都县| 杭州市| 绩溪县| 台州市| 岱山县| 依兰县| 乌兰县| 灵台县| 弥勒县| 那坡县| 宁阳县| 逊克县| 荣昌县| 凤阳县| 保山市| 平邑县| 顺义区| 荆州市| 华亭县| 故城县| 柘城县| 江川县| 阳原县| 长岛县| 枝江市| 昌乐县| 九江市| 乌兰浩特市| 信宜市|