基于協(xié)同過濾算法的圖書個性化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于協(xié)同過濾算法的圖書個性化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于協(xié)同過濾算法的圖書個性化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于協(xié)同過濾算法的圖書個性化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于協(xié)同過濾算法的圖書個性化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第1章緒論1.1課題研究的背景和現(xiàn)狀我們身處“5G降至,4G漫布”的網(wǎng)絡(luò)中,我們的生活也越來越離不開網(wǎng)絡(luò),互聯(lián)網(wǎng)是座無形的橋梁,連接著上億上億的人們,以飛秒之速傳播著無以計(jì)數(shù)的信息,這是信息大爆炸的時代,人們獲取信息不再像以前的緩慢和困難,相反,面對著網(wǎng)絡(luò)中的海量信息數(shù)據(jù),我們經(jīng)常應(yīng)顧不暇,反應(yīng)速度遠(yuǎn)遠(yuǎn)無法跟上信息的傳播速度,大量冗余信息影響人們準(zhǔn)確地抉擇。面對過載信息,如何從中知識發(fā)現(xiàn)[4]以及如何篩選出有用的信息成為人們普遍關(guān)注的問題,因此,信息過濾成為時代不可或缺的重要機(jī)制,搜索引擎的出現(xiàn)一定程度上解決了信息過載的問題,可以針對用戶輸入的關(guān)鍵字從海量的信息中進(jìn)行篩選。但如何篩選?如何排序?這些問題被“商業(yè)機(jī)密”包圍,百度公司曾長期將搜索結(jié)果以競價(jià)排名形式呈現(xiàn),造成極差的用戶體驗(yàn),另外當(dāng)用戶無法準(zhǔn)確描述需求時,搜索結(jié)果顯得不如人意[5]。在此背景下,個性化推薦系統(tǒng)應(yīng)運(yùn)而生。個性化推薦系統(tǒng)能良好的解決上述問題,它能收集用戶特征資料并根據(jù)用戶特征,如興趣偏好,為用戶主動作出個性化的推薦。而且,系統(tǒng)給出的推薦是可以實(shí)時更新的,即當(dāng)系統(tǒng)中的商品庫或用戶特征庫發(fā)生改變時,給出的推薦序列會自動改變。個性化推薦系統(tǒng)主要算法有:基于關(guān)系型規(guī)則的推薦、基于內(nèi)容的推薦[6]、人口統(tǒng)計(jì)時的推薦、協(xié)同過濾式的推薦[7],本文主要基于協(xié)同過濾算法設(shè)計(jì)與實(shí)現(xiàn)圖書的分析與個性化推薦系統(tǒng)。與傳統(tǒng)推薦算法相比協(xié)同過濾算法推薦可以達(dá)到個性化推薦[8],不需要對內(nèi)容進(jìn)行分析,可以發(fā)現(xiàn)用戶新的興趣點(diǎn),自動化程度高,推薦更具有新穎性。1.2課題研究的目標(biāo)與意義1.2.1目標(biāo)(1)根據(jù)圖書信息可以呈現(xiàn)有效的可視化數(shù)據(jù)分析結(jié)果,當(dāng)用戶輸入的信息可以有效的推薦用戶感興趣的圖書信息,以及由圖書信息可以尋求更多的志同道合和發(fā)現(xiàn)興趣點(diǎn)。(2)鞏固Python、Spark、數(shù)據(jù)分析、數(shù)據(jù)處理等已學(xué)知識的實(shí)踐,加深對協(xié)同過濾算法的認(rèn)識,鍛煉自己動手搭建推薦系統(tǒng)的能力。1.2.2意義基于上面的背景可知,推薦系統(tǒng)是人們?nèi)藗優(yōu)g覽網(wǎng)絡(luò)信息必不可少的一部分,一方面幫助用戶發(fā)現(xiàn)對自己有價(jià)值的信息,另一方面讓信息能夠展現(xiàn)在對他感興趣的人群中,從而實(shí)現(xiàn)信息提供商與用戶的雙贏。本推薦系統(tǒng)可以為用戶提供方便,可以讓用戶看到圖書數(shù)據(jù)的可視化結(jié)果,可以根據(jù)用戶推薦針對他們胃口的圖書信息,可以根據(jù)他們提供的圖書信息,展現(xiàn)出志同道合的用戶以及發(fā)現(xiàn)更多興趣。除此之外,本推薦系統(tǒng)界面用戶體驗(yàn)好,操作易上手。1.3本文的主要工作在此項(xiàng)目中,本人根據(jù)下載的圖書數(shù)據(jù),進(jìn)行了數(shù)據(jù)處理,數(shù)據(jù)清洗,數(shù)據(jù)分析,實(shí)現(xiàn)了可視化數(shù)據(jù)分析結(jié)果,通過Qtdesigner完成了推薦系統(tǒng)界面及功能的設(shè)計(jì)與實(shí)現(xiàn),完成了登錄模塊、注冊模塊、個性推薦模塊、志同道合模塊等功能模塊的設(shè)計(jì)與實(shí)現(xiàn),使用協(xié)同過濾推薦算法使推薦結(jié)果和界面控件相結(jié)合。1.4論文結(jié)構(gòu)本論文主要包括以下幾個部分:第一部分:項(xiàng)目背景和研究意義;第二部分:系統(tǒng)開發(fā)所采用的技術(shù)以及開發(fā)環(huán)境;第三部分:圖書個性化推薦系統(tǒng)需求分析;第四部分:個性化推薦系統(tǒng)設(shè)計(jì);第五部分:系統(tǒng)實(shí)現(xiàn)與測試;第六部分:工作總結(jié)和展望。第2章相關(guān)技術(shù)概論第2章相關(guān)技術(shù)概述2.1圖書個性化推薦系統(tǒng)開發(fā)技術(shù)2.1.1前臺(1)PyQtPyQt是一個創(chuàng)建GUI應(yīng)用程序的工具包。它是Python編程語言和Qt庫的成功融合,Qt庫是目前最強(qiáng)大的庫之一。PyQt是由PhilThompson開發(fā)。安裝前提需要實(shí)現(xiàn)安裝Pycharm,下載SIP、PyQt5、Qt,配置Qtdesigner、PyUIC。設(shè)計(jì)前端的過程中先使用可視化Qt控件拖拉設(shè)計(jì)UI,在配合Pycharm實(shí)現(xiàn)信號和槽的連接和綁定。(2)PandasPandas是Python的數(shù)據(jù)處理包,全名:PythonDataAnalysisLibrary,Pandas是非常著名的開源數(shù)據(jù)處理庫,我們可以通過它完成對數(shù)據(jù)集進(jìn)行快速讀取、轉(zhuǎn)換、過濾、分析等一系列操作。Pandas庫是基于Numpy庫來創(chuàng)建的,Numpy主要用于矩陣操作,而Pandas主要用于數(shù)據(jù)處理。Pandas支持多種數(shù)據(jù)格式,以及Excel和SQL數(shù)據(jù)庫,對數(shù)據(jù)對齊,缺失數(shù)據(jù)處理,數(shù)據(jù)排序等常規(guī)數(shù)據(jù)整理操作尤為便利。圖2.1Python數(shù)據(jù)分析包(3)MatplotlibMatplotlib是提供數(shù)據(jù)繪圖功能的python第三方2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質(zhì)量級別的圖形。通過Matplotlib,開發(fā)者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點(diǎn)圖等。(4)Pyecharts

ECharts是EnterpriseCharts的縮寫,商業(yè)級數(shù)據(jù)圖表,一個純Javascript的圖表庫,可以流暢的運(yùn)行在PC和移動設(shè)備上,兼容當(dāng)前絕大部分瀏覽器,提供直觀,生動,可交互,可高度個性化定制的數(shù)據(jù)可視化圖表。創(chuàng)新的拖拽重計(jì)算、數(shù)據(jù)視圖、值域漫游等特性大大增強(qiáng)了用戶體驗(yàn),賦予了用戶對數(shù)據(jù)進(jìn)行挖掘、整合的能力。

支持地圖等12類圖表,同時提供標(biāo)題,詳情氣泡、圖例、值域、數(shù)據(jù)區(qū)域、時間軸、工具箱等7個可交互組件,支持多圖表、組件的聯(lián)動和混搭展現(xiàn)。pyecharts,可以實(shí)現(xiàn)用python調(diào)用echatrs。pyecharts是一個用于生成Echarts圖表的類庫。2.1.2后臺(1)SparkMLlibSpark的核心是RDD(ResilientDistributedDataset)彈性分布式數(shù)據(jù)集,由AMPLab實(shí)驗(yàn)室所提出的概念,屬于一種分布式的內(nèi)容,目標(biāo)是將批處理、交互式處理、流式處理、各種機(jī)器學(xué)習(xí)算法、圖形計(jì)算、SQL查詢等全部融合在一個軟件棧中。Spark主要的優(yōu)勢來自RDD本身的特性,提供以RDD為基礎(chǔ)的機(jī)器學(xué)習(xí)模塊,發(fā)揮in-memory與分布式運(yùn)算,大幅提升需要迭代的機(jī)器學(xué)習(xí)模塊的執(zhí)行效率,功能強(qiáng)大。圖2.2SparrkMLlib(2)SQLiteSQLite進(jìn)行數(shù)據(jù)的存儲。SQLite是一種小型的數(shù)據(jù)庫,占用資源少,效率良好,比較輕便,易學(xué)上手快,可以直接在pycharm中操作,數(shù)據(jù)的存儲和取數(shù)據(jù)速度都比較快,性能比較好。2.2圖書個性化推薦系統(tǒng)開發(fā)及運(yùn)行環(huán)境該系統(tǒng)是在Window10操作系統(tǒng)中,利用Pycharm、JupyterNotebook、Qtdesigner工具進(jìn)行開發(fā),結(jié)合SQLite數(shù)據(jù)庫,Spark大數(shù)據(jù)處理技術(shù)實(shí)現(xiàn)協(xié)同過濾算法推薦功能。1、硬件環(huán)境(1)CPU:i5或更高(2)硬盤:40G或更高(3)內(nèi)存:2G或更高2、軟件環(huán)境(1)操作系統(tǒng):Windows10(2)開發(fā)環(huán)境:PyCharm2018.3.2、spark-2.3.0-bin-hadoop2.6(3)數(shù)據(jù)庫:SQLite(4)開發(fā)語言:Python3.5.2、Scala-2.12.8(5)其他輔助軟件:MicrosoftWord、StarUML第3章系統(tǒng)需求分析第3章圖書個性化推薦系統(tǒng)需求分析3.1系統(tǒng)的功能需求3.1.1系統(tǒng)功能模塊需求分析本推薦系統(tǒng)的運(yùn)行環(huán)境為微軟的Window操作系統(tǒng),用戶界面比較友好,操作容易,和用戶的交互性非常的好,適合各種人群的使用。表3.1用戶業(yè)務(wù)分析業(yè)務(wù)功能模塊功能描述注冊游客注冊成為普通用戶登錄用戶通過用戶名和密碼登錄推薦系統(tǒng)地區(qū)分布游客可查看全球范圍內(nèi)讀者地區(qū)分布的數(shù)據(jù)分析讀者年齡游客可查看讀者年齡分布的數(shù)據(jù)分析趨勢圖書評分游客可查看全球范圍內(nèi)讀者圖書評分的數(shù)據(jù)分析猜你想看系統(tǒng)為用戶推薦圖書評分為10的6部圖書信息志同道合根據(jù)用戶提供的圖書信息推薦6位相似用戶信息個性推薦根據(jù)用戶信息個性推薦6部圖書信息3.1.2系統(tǒng)業(yè)務(wù)流程分析圖書分析以及個性話題推薦系統(tǒng)的客戶主要包括游客和用戶。推薦系統(tǒng)的圖3.1推薦系統(tǒng)業(yè)務(wù)用例圖業(yè)務(wù)是面向游客和用戶服務(wù)的。3.1.3系統(tǒng)業(yè)務(wù)流程描述每個業(yè)務(wù)用例的細(xì)節(jié),可以進(jìn)一步用活動圖進(jìn)行描述?;顒訄D中的活動是展示整個業(yè)務(wù)用力的控制流(及其操作數(shù)),執(zhí)行的步驟可以是并發(fā)的或順序的。推薦系統(tǒng)業(yè)務(wù)用例圖中共有9種業(yè)務(wù)用例,3種業(yè)務(wù)角色,系統(tǒng)游客可以瀏覽圖書數(shù)據(jù)分析可視化結(jié)果,系統(tǒng)用戶可以根據(jù)輸入信息查看個性化推薦圖書的內(nèi)容。下面是主要業(yè)務(wù)用例的描述:注冊用戶圖3.2注冊活動圖用戶登錄地區(qū)分布圖3.3志同道合活動圖讀者年齡讀書評分志同道合圖3.4志同道合活動圖3.1.4系統(tǒng)狀態(tài)圖狀態(tài)圖通過建立類對象的生存周期模型來描述一個實(shí)體基于事件反應(yīng)的動態(tài)行為,顯示了該實(shí)體如何根據(jù)當(dāng)前所處的狀態(tài)對不同的事件做出反應(yīng)的。所有對象都有狀態(tài),推薦系統(tǒng)游客“訪問”系統(tǒng)頁面后輸入用戶名以及密碼“注冊”成為用戶,輸入用戶名及密碼“登錄”訪問推薦界面。如圖3.6所示。圖3.5系統(tǒng)狀態(tài)圖3.2數(shù)據(jù)需求經(jīng)過分析后得知系統(tǒng)中所需的類和各類之間的關(guān)系,利用概念類圖進(jìn)行描述。在根據(jù)已定義的對象累及其聯(lián)系,以及對象類的多重性、角色、導(dǎo)航等性質(zhì),可以畫出對象類土,適用對象圖的目的是分析系統(tǒng)的瞬間狀態(tài),以便進(jìn)一步了解系統(tǒng)的結(jié)構(gòu)和行為。圖中系統(tǒng)主頁類提供對地區(qū)分布、讀者年齡、圖書評分的各類操作。推薦界面類提供對個性推薦、志同道合、猜你想看的各類操作。如下圖所示:圖3.6系統(tǒng)分析類圖3.3系統(tǒng)非功能性需求3.3.1spark大數(shù)據(jù)處理技術(shù)Spark使用彈性分布式數(shù)據(jù)集RDD實(shí)現(xiàn)數(shù)據(jù)存儲。RDD是spark的核心數(shù)據(jù)結(jié)構(gòu),用戶可以使用RDD將一部分?jǐn)?shù)據(jù)集緩存在內(nèi)存中,使其能在并行操作中被有效的重復(fù)使用。Spark為RDD提供了一系列豐富操作的函數(shù)。用于對RDD中的數(shù)據(jù)進(jìn)行操作和轉(zhuǎn)換。更好的幫助用戶分析系統(tǒng)有哪些功能,以及讓用戶明確系統(tǒng)內(nèi)部和系統(tǒng)外部(也就是角色)之間是如何交互的。第4章系統(tǒng)設(shè)計(jì)第4章個性化推薦系統(tǒng)設(shè)計(jì)4.1個性化推薦系統(tǒng)的概念個性化推薦系統(tǒng)應(yīng)用廣泛,主要用于電子商務(wù)領(lǐng)域,根據(jù)用戶的興趣點(diǎn)和購買行為向用戶提供推薦感興趣的商品和信息。本系統(tǒng)主要根據(jù)圖書信息可以呈現(xiàn)有效的可視化數(shù)據(jù)分析結(jié)果,當(dāng)用戶輸入的信息可以有效的推薦用戶感興趣的圖書信息,以及由圖書信息可以尋求更多的志同道合和發(fā)現(xiàn)興趣點(diǎn)。如圖4.1是推薦系統(tǒng)通用模型。圖4.1推薦系統(tǒng)通用模型4.2個性化推薦系統(tǒng)算法的分類常見的推薦算法如下:基于關(guān)系型規(guī)則的推薦基于內(nèi)容的推薦人口統(tǒng)計(jì)式的推薦協(xié)同過濾式的推薦4.3推薦系統(tǒng)的模塊設(shè)計(jì)4.3.1總體功能模塊設(shè)計(jì)系統(tǒng)的總體功能模塊圖,如圖4.2所示,整個系統(tǒng)包括系統(tǒng)主頁和推薦界面,系統(tǒng)主頁有用戶登錄注冊,查看地區(qū)分布,讀者年齡,圖書評分的可視化數(shù)據(jù)分析結(jié)果;推薦界面包括對用戶輸入圖書信息及用戶信息的個性推薦、志同道合以及猜你想看模塊。圖4.2系統(tǒng)總功能模塊結(jié)構(gòu)圖(1)登錄注冊的主要流程圖,如圖4.3所示,用戶進(jìn)入主頁面點(diǎn)擊注冊/登錄,如果注冊則輸入用戶名密碼后判斷是否合法注冊,然后跳轉(zhuǎn)登錄界面,如果是登錄,則輸入用戶名以及密碼審核是否匹配,正確則進(jìn)入推薦界面。圖4.3系統(tǒng)登錄注冊流程圖(2)地區(qū)分布流程圖,如圖4.4所示,游客可直接點(diǎn)擊地區(qū)分布按鈕查看地區(qū)分布數(shù)據(jù)化分析可視化結(jié)果。圖4.4地區(qū)分布流程圖(3)個性推薦流程圖,如圖4.5所示,先判斷用戶是否登錄成功,如果未成功登錄則先登錄或注冊,若登錄成功則判斷輸入的信息是否有效,如果是則輸出個性推薦結(jié)果,推薦成功,否則重新輸入相關(guān)信息。圖4.5個性推薦流程圖4.3.2游客功能模塊游客在本推薦系統(tǒng)可以瀏覽圖書數(shù)據(jù)分析可視化結(jié)果,有如下幾個功能模塊:首頁、地區(qū)分布、讀者年齡、圖書評分,如表4.1所示:表4.1前臺用戶功能表功能列表功能說明首頁查看首頁圖書信息地區(qū)分布查看讀者地區(qū)分布可視化結(jié)果讀者年齡瀏覽讀者年齡趨勢分布圖圖書評分圖書評分情況可視化結(jié)果4.3.3用戶功能模塊用戶登錄系統(tǒng)后進(jìn)入推薦界面,用戶在推薦界面享有如下幾個功能模塊:個性推薦、志同道合、猜你想看;如表4.2所示:表4.2后臺管理員功能表功能列表功能說明個性推薦根據(jù)輸入信息,推薦用戶感興趣的書籍志同道合根據(jù)輸入信息,推薦同樣對該圖書感興趣的用戶猜你想看書荒時,推薦給用戶圖書評分高的圖書信息4.4推薦算法設(shè)計(jì)4.4.1相似矩陣相似度是比較兩個事物之間的相似程度。相似矩陣[9]由事物所代表的數(shù)據(jù)點(diǎn)之間的相似性評分表示。一般通過計(jì)算兩個事物特征之間的距離,距離越大,相似度越低,距離越小,相似度越高。以下是常用的相似度計(jì)算方法。歐幾里得距離(EuclideanDistance)歐氏距離是最常用的距離計(jì)算公式,衡量的是多維空間中兩點(diǎn)的真實(shí)距離。歐氏距離是向量元素之間平方差之和的平方根:歐氏距離標(biāo)準(zhǔn)化:皮爾遜相關(guān)系數(shù)(PearsonCorrelationCoefficient)皮爾遜相關(guān)系數(shù)度量的是兩個向量之間的線性關(guān)系。皮爾遜相關(guān)系數(shù)是兩個變量之間的協(xié)方差與標(biāo)準(zhǔn)差之商:皮爾遜相關(guān)系數(shù)范圍從-1到1。值為1時表示X和Y之間數(shù)據(jù)變化同向而且之間具有完美的線性關(guān)系,-1表示X和Y之間的數(shù)據(jù)變化為反向關(guān)系,0表示X和Y之間無明顯的線性關(guān)系。余弦相似度(CosineSimilarity)余弦相似度是度量向量空間中兩個向量夾角的余弦值作為相似度的大?。浩渲校嘞抑翟酱?,說明兩向量夾角越小,則兩向量越相似;值為負(fù),兩向量負(fù)相關(guān)。另外,余弦距離更注重兩向量在方向上的差異。4.4.2常用的協(xié)同過濾算法(1)基于用戶的協(xié)同過濾算法基于用戶的協(xié)同過濾算法基本原理是根據(jù)所有用戶對物品或者信息的偏好,發(fā)現(xiàn)與當(dāng)前用戶口味和偏好相似的其他用戶,一般采用K-近鄰算法;然后基于這K個用戶的歷史偏好信息,為當(dāng)前用戶進(jìn)行推薦物品。基于用戶協(xié)同過濾算法的基本原理如下圖4.6給用戶A進(jìn)行個性化推薦,假如用戶A喜歡物品W和物品X,用戶B喜歡物品Y,用戶C喜歡物品W,物品X和物品Z。從用戶的偏好信息可以看出,用戶A和用戶C具有相似的偏好信息,又知道用戶C還喜歡物品Z,所以將物品Z推薦給用戶A。圖4.6基于用戶協(xié)同過濾算法基于物品的協(xié)同過濾算法基于物品協(xié)同過濾算法基本原理是根據(jù)用戶過去喜歡的物品,為用戶推薦與他過去喜歡的物品相似的物品?;谖锲穮f(xié)同過濾算法的基本原理如下圖4.7給用戶A進(jìn)行個性化推薦,用戶A喜歡圖書W,用戶B喜歡物圖書Y,用戶C喜歡圖書W假如,圖書X和圖書Z。要想實(shí)現(xiàn)對用戶A的推薦,首先對圖書的元數(shù)據(jù)建模,然后通過元數(shù)據(jù)發(fā)現(xiàn)圖書間的相似度,發(fā)現(xiàn)圖書W和圖書Y都屬于算法類書籍相似度最高,最后實(shí)現(xiàn)推薦,對于用戶A,他喜歡看圖書W,那么系統(tǒng)就可以給他推薦類似的圖書Y。圖4.7基于用戶協(xié)同過濾算法4.4.3數(shù)據(jù)收集在海量數(shù)據(jù)中挑選出合適的數(shù)據(jù)集是完成項(xiàng)目的先決條件。下載數(shù)據(jù)根據(jù)項(xiàng)目圖書分析以及個性化推薦系統(tǒng)的要求,項(xiàng)目中使用的數(shù)據(jù)可以訪問rmatik.uni-freiburg.de/~cziegler/BX/下載。文件經(jīng)過壓縮處理,需要解壓使用。了解數(shù)據(jù) 兩個壓縮文件中分別有三個CSV和SQL文件。分別為BX-Book-Ratings、BX-Books、BX-Users;其中CSV文件中每個文件均被逗號分隔符拆分。評分文件共有1048576行,逗號分隔符將其拆分為三列:User-ID;"ISBN";"Book-Rat-ing",即第一列為用戶ID,第二列為圖書ISBN,第三列為對應(yīng)的評分。圖書文件共有271380行,其中主要為圖書相關(guān)信息的數(shù)據(jù),逗號分隔符將其拆分為以下八列:ISBN;"Book-Title";"Book-Author";"Year-Of-Publication";"Publisher";"Image-URL-S";"Image-URL-M";"Image-URL-L",即圖書的ISBN,圖書名,圖書作者,出版年份,出版設(shè),圖書封面。用戶文件共有276272行,其中主要為用戶相關(guān)信息數(shù)據(jù),逗號分隔符將其拆分為三列:User-ID;"Location";"Age",即用戶ID,用戶注冊地,用戶年齡。4.4.4數(shù)據(jù)預(yù)處理把錯誤的數(shù)據(jù)放進(jìn)算法中,永遠(yuǎn)無法得到正確的答案。數(shù)據(jù)預(yù)處理主要防止“錯進(jìn),錯出”的問題。數(shù)據(jù)預(yù)處理一般包括三個步驟:格式化數(shù)據(jù)一般需要指定格式呈現(xiàn)。使用行業(yè)標(biāo)準(zhǔn)格式可以避免一些不必要的問題,例如本項(xiàng)目中主要使用CSV格式文件,所以不需要進(jìn)行格式轉(zhuǎn)換。清洗數(shù)據(jù)數(shù)據(jù)清洗[10]一般指去除、替換、修復(fù)損失或丟失的數(shù)據(jù)來對數(shù)據(jù)進(jìn)行清洗。本步驟主要借助jupter工具,如下python關(guān)鍵語句腳本進(jìn)行清洗數(shù)據(jù)。去除不合法數(shù)據(jù)處理用戶數(shù)據(jù):df=pd.read_csv("BX-Users",sep=";",header=None,names=["user_id","location","age"],encoding='gbk')df[(df.age=='41"')].index.tolist()#找出不合法數(shù)值所在行df=df.drop([1305])#刪除那一行替換臟數(shù)據(jù)處理評分?jǐn)?shù)據(jù):csv1=open("BX-Book-Ratings.csv","r").read()forlinein'",,,.。??,': csv1=csv1.replace(line,'') forlinein'X': csv1=csv1.replace(line,'0')file1=open("rating.csv","w")#'w'覆蓋寫模式,文件不存在則創(chuàng)建,存在則完全覆蓋file1.write(str(csv1))file1.close()處理數(shù)據(jù)處理數(shù)據(jù)以便ALS算法訓(xùn)練數(shù)據(jù),因?yàn)锳LS訓(xùn)練數(shù)據(jù)格式是RatingRDD數(shù)據(jù)類型,所以需先利用map運(yùn)算以分號切分?jǐn)?shù)據(jù),再轉(zhuǎn)換為相應(yīng)的訓(xùn)練數(shù)據(jù)。ratings=rdd.map(lambdaline:line.split(";"))ratingsRDD=ratings.map(lambdax:(x[0],x[1],x[2]))數(shù)據(jù)采樣4.4.5數(shù)據(jù)分析經(jīng)過數(shù)據(jù)預(yù)處理,數(shù)據(jù)分析和可視化顯示就顯得容易得多。讀者地區(qū)分布分析根據(jù)用戶文件,通過以下python語言中pyecharts模塊,可以呈現(xiàn)用戶在世界地圖中的地區(qū)分布可視化結(jié)果。frompyechartsimportMap圖4.8讀者地區(qū)分布根據(jù)熱點(diǎn)圖可以看出,加拿大、美國、澳大利亞以及歐洲地區(qū)的讀者群體比較大,相對而言俄羅斯、以及亞洲讀者群體比較小,非洲幾乎沒有讀者群體。讀者年齡段分析根據(jù)用戶文件,通過python語言中matplotlib模塊,呈現(xiàn)讀者年齡可視化結(jié)果,python腳本如下:importmatplotlib.pyplotaspltdefage_pie():plt.rcParams['font.family']='SimHei'df=pd.read_csv("user.csv",sep=";",header=None,names=["user_id","location","age"],encoding='gbk')df[(df.age=='41"')].index.tolist()#找出不合法數(shù)值所在行df=df.drop([1305])#刪除那一行df[['age']]=df[['age']].astype(float)labels=['10-20','20-30','30-40','40-50','50-60']sizes=[len(df[(df.age>=10)&(df.age<20)]),\len(df[(df.age>=20)&(df.age<30)]),\len(df[(df.age>=30)&(df.age<40)]),\len(df[(df.age>=40)&(df.age<50)]),\len(df[(df.age>=50)&(df.age<60)])]explode=(0,0.05,0,0,0)#0.1為第二個元素凸出距離colors=['tomato','lightskyblue','goldenrod','green','y']#餅圖繪制函數(shù)plt.pie(sizes,explode=explode,labels=labels,colors=colors,\autopct='%1.1f%%',shadow=False,pctdistance=0.8,\startangle=90,textprops={'fontsize':16,'color':'w'})plt.title('讀者年齡分布圖')plt.axis('equal')plt.legend(loc='upperright')plt.show()圖4.9讀者年齡分布圖誠如李大釗說“青年之文明,奮斗之文明,也是境遇奮斗,與時代奮斗,與經(jīng)驗(yàn)奮斗。故青年者,人生之玉,人生之春,人生之華也。”根據(jù)餅狀圖可以看出年齡段在20-40歲的讀者所占比例最高,高達(dá)64.3%,由此可見,讀書充電的年齡,大家都在努力奮斗不斷學(xué)習(xí)。讀者圖書評分情況分析圖書評分為10的圖書信息使用以下python腳本,找出圖書評分為10的圖書信息,可作為新用戶初始登錄圖書推薦系統(tǒng)時猜你想看功能模塊進(jìn)行圖書信息推薦。importpandasaspddf=pd.read_csv("rating.csv",sep=";",header=None,names=["user","book","rating"],encoding='gbk')df=df[(df.rating>9)]print(df.head())結(jié)果顯示評分為10的圖書ISBN以及用戶ID信息。userbookrating92767453423105381030276760844068269710612767723499230933106227677235961514651085276788055310666010圖書評分圖根據(jù)評分文件,通過python語言中pandas以及matplotlib模塊,生成圖書評分柱狀圖。Python腳本如下:importpandasaspdimportmatplotlib.pyplotaspltplt.rcParams['font.family']='SimHei'df=pd.read_csv("rating.csv",sep=";",header=None,names=["user","book","rating"],encoding='gbk')df=df[(df.rating>=1)&(df.rating<=10)]#print(df.head())city=df.groupby('user').count()rating=df.groupby('rating').count()value=list(rating['user'])attr=list(rating.index)plt.bar(attr,value,color='g',alpha=0.7)plt.xticks(attr,rotation=0)plt.title('用戶圖書評分圖')plt.xlabel("rating")plt.ylabel("book_number")plt.savefig('rating.png',dpi=600)plt.show()圖4.10推薦系統(tǒng)冰心曾說“讀書好,好讀書,讀好書?!备鶕?jù)評分柱狀圖,圖書評分多為7-10分,可看出圖書滿足大多數(shù)人心理評估水平,相對圖書而言,圖書多為大家心目中的“好書”。4.4.6訓(xùn)練評分模型導(dǎo)入ALS模塊frompyspark.mllib.recommendationimportALS#導(dǎo)入ALS訓(xùn)練模型使用ALS.train命令進(jìn)行訓(xùn)練model=ALS.train(ratings,5,5,0.01)#使用ALS.train進(jìn)行訓(xùn)練訓(xùn)練時會執(zhí)行矩陣分解(MatrixFactorization),完成后會將原本矩陣分解成X(m*rank)矩陣與Y(rank*n)矩陣。<pyspark.mllib.recommendation.MatrixFactorizationModelobjectat0x0000023FFDF6AD30>4.4.7推薦系統(tǒng)建立推薦系統(tǒng)先是數(shù)據(jù)準(zhǔn)備階段,讀取數(shù)據(jù),經(jīng)過處理后產(chǎn)生評分?jǐn)?shù)據(jù)ratingsRDD,接著評分?jǐn)?shù)據(jù)ratingsRDD經(jīng)過ALS.train訓(xùn)練后產(chǎn)生模型Model,再存儲模型Model在本地中,以便后續(xù)推薦信息使用,載入之前的存儲模型Model后使用模型Model進(jìn)行推薦,最后將推薦結(jié)果外部輸出在推薦界面上。推薦系統(tǒng)的建立如圖4.8所示:圖4.11推薦系統(tǒng)4.5系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)4.5.1系統(tǒng)的E-R圖E-R模型能夠抽象化現(xiàn)實(shí)世界中的物質(zhì),E-R模型主要由實(shí)體、聯(lián)系和屬性組成。很多的應(yīng)用環(huán)境都是建立在這三種成分的基礎(chǔ)上的。本系統(tǒng)的實(shí)體和屬性的有下面這些:用戶表的實(shí)體屬性如圖4.9所示,包括主鍵ID、昵稱、密碼等等。圖4.12用戶表實(shí)體圖4.5.2數(shù)據(jù)庫邏輯及物理結(jié)構(gòu)的設(shè)計(jì)在系統(tǒng)的開發(fā)過程中,數(shù)據(jù)庫設(shè)計(jì)是十分重要的一個環(huán)節(jié)。數(shù)據(jù)庫設(shè)計(jì)了系統(tǒng)數(shù)據(jù)的存儲形式、用戶數(shù)據(jù)訪問形式。設(shè)計(jì)系統(tǒng)時應(yīng)合理設(shè)計(jì)數(shù)據(jù)庫,減少數(shù)據(jù)庫的信息冗余,盡量避免重復(fù)的數(shù)據(jù),并考慮效率和優(yōu)化的問題。通過對論壇系統(tǒng)的業(yè)務(wù)及數(shù)據(jù)的分析,設(shè)計(jì)數(shù)據(jù)庫表,如用戶表:用戶表主要用于存放用戶的基本信息,包括登錄的密碼,用戶ID等等;用戶表的詳細(xì)字段如表4.3所示:表4.3用戶表(t_user)字段名數(shù)據(jù)類型長度允許NULL注釋userIdSTRING20主鍵IDpasswordVARCHAR20密碼sexVARCHAR10√性別emailVARCHAR20郵箱telVARCHAR11√手機(jī)regTimeDATETIME注冊時間第5章系統(tǒng)實(shí)現(xiàn)第5章系統(tǒng)實(shí)現(xiàn)5.1系統(tǒng)功能模塊的實(shí)現(xiàn)5.1.1登錄注冊功能實(shí)現(xiàn)(1)系統(tǒng)主頁,用戶可以通過登錄/注冊進(jìn)入登錄注冊界面。系統(tǒng)主頁界面的效果如圖5.1所示:圖5.1系統(tǒng)主頁圖(2)注冊界面,用戶只有注冊后才能登錄推薦系統(tǒng)界面,注冊后直接跳轉(zhuǎn)到系統(tǒng)的登錄界面,注冊的界面效如圖5.2所示:圖5.2注冊界面圖核心代碼該代碼是三個跟登錄注冊有關(guān)的函數(shù),user_register(self)函數(shù)為注冊成功跳轉(zhuǎn)到登錄界面,jump_to_login1(self)函數(shù)是跳轉(zhuǎn)到登錄界面的相,vert_register(self)函數(shù)是判斷注冊的用戶賬號和密碼是否合法的方法。self.pushButton.clicked.connect(self.user_register)#點(diǎn)擊信號槽觸發(fā)函數(shù)

defuser_register(self):#注冊成功跳轉(zhuǎn)到登錄界面

user_name=self.lineEdit.text()

user_pass=self.lineEdit_5.text()

user_pass2=self.lineEdit_4.text()#重新輸入密碼

if(self.vert_register()):

c.execute('insertintouser_loginvalues((user_name,user_pass,user_pass2));')

mit()

defvert_register(self):#注冊驗(yàn)證

user_name=self.lineEdit.text()

user_pass=self.lineEdit_5.text()

user_pass2=self.lineEdit_4.text()#重新輸入密碼

if(user_name==""):

self.label_10.setText('用戶名不能為空')

returnFalse

else:

if(len(user_pass)<3):

self.label_10.setText('')

self.label_5.setText('密碼太簡單')

elif(user_pass!=user_pass2):

self.label_7.setText("兩次密碼不一致")

else:

self.jump_to_login1()

self.exit()

returnFalse

returnTrue

defjump_to_login1(self):#跳轉(zhuǎn)到登錄界面

self.dialog.hide()

dialog1=QtWidgets.QDialog()

ui=BOOK_login1.Ui_Dialog()

ui.setupUi(dialog1)

dialog1.show()

dialog1.exec_()

self.dialog.show()

defexit(self):#退出該界面

self.dialog.close()

if__name__=='__main__':

importsys

app=QtWidgets.QApplication(sys.argv)

widget=QtWidgets.QWidget()

ui=Ui_Dialog()

ui.setupUi(widget)

widget.setWindowTitle('BOOK幫')

widget.show()

sys.exit(app.exec_())登錄注冊界面圖5.3注冊界面圖核心代碼該代碼是三個跟登錄注冊有關(guān)的方法,jump_to_BOOK_1()方法跳轉(zhuǎn)到登錄界面和jump_to_register()方法跳轉(zhuǎn)到注冊假面,user_login()方法用來判斷登錄的用戶賬號密碼是否正確的。

defuser_login(self):#用戶登錄

str_name=self.lineEdit.text()

str_pass=self.lineEdit_2.text()

c=cnn.cursor()

sql=c.execute('select*fromuser_loginwhereuser_name=?anduser_password=?',(str_name,str_pass))

if(len(sql.fetchall())):

self.jump_to_BOOK_1()

self.exit()

else:

self.lineEdit.setText('')

self.lineEdit_2.setText('')

self.label_5.setText("賬號和密碼錯誤")

defjump_to_BOOK_1(self):#跳轉(zhuǎn)到登錄后的主界面

self.dialog.hide()

dialog1=QtWidgets.QDialog()

ui=BOOK_1.Ui_Dialog()

ui.setupUi(dialog1)

dialog1.show()

dialog1.exec()

self.dialog.show()

defjump_to_register(self):#跳轉(zhuǎn)到注冊界面

self.dialog.hide()

dialog1=QtWidgets.QDialog()

ui=BOOK_register.Ui_Dialog()

ui.setupUi(dialog1)

dialog1.show()

dialog1.exec_()

self.dialog.show()5.1.2推薦功能實(shí)現(xiàn)(1)推薦界面,有個性推薦,志同道合,猜你想看如圖5.3所示。圖5.4志同道合核心代碼該代碼是實(shí)現(xiàn)個性推薦,志同道合,猜你想看的三個方法。方法user()實(shí)現(xiàn)個性推薦,方法實(shí)現(xiàn)book()志同道合,方法rating()實(shí)現(xiàn)猜你想看

defuser(self):#個性推薦

self.label_8.setText('')

self.label_9.setText('')

self.label_10.setText('')

self.label_11.setText('')

self.label_15.setText('')

self.label_16.setText('')

id_user=self.lineEdit.text()

try:

sc.stop()

except:

pass

frompysparkimportSparkContext

sc=SparkContext()

rdd=sc.textFile("rating2.csv")

ratings=rdd.map(lambdaline:line.split(";"))

#ratingsRDD=ratings.map(lambdax:(x[0],x[1],x[2]))

ratings.persist()

frompyspark.mllib.recommendationimportALS

model=ALS.train(ratings,5,5,0.01)

user_com=model.recommendProducts(int(id_user),6)

self.label_8.setText(str(user_com[0][1]))

self.label_9.setText(str(user_com[1][1]))

self.label_10.setText(str(user_com[2][1]))

self.label_11.setText(str(user_com[3][1]))

self.label_15.setText(str(user_com[4][1]))

self.label_16.setText(str(user_com[5][1]))

defbook(self):#志同道合

self.label_8.setText('')

self.label_9.setText('')

self.label_10.setText('')

self.label_11.setText('')

self.label_15.setText('')

self.label_16.setText('')

id_book=self.lineEdit.text()

try:

sc.stop()

except:

pass

frompysparkimportSparkContext

sc=SparkContext()

#sc.master

rdd=sc.textFile("rating2.csv")

ratings=rdd.map(lambdaline:line.split(";"))

ratingsRDD=ratings.map(lambdax:(x[0],x[1],x[2]))

ratings.persist()

##訓(xùn)練模型

frompyspark.mllib.recommendationimportALS

model=ALS.train(ratings,5,5,0.01)

#基于book推薦

user_com=model.recommendUsers(int(id_book),6)

self.label_8.setText(str(user_com[0][0]))

self.label_9.setText(str(user_com[1][0]))

self.label_10.setText(str(user_com[2][0]))

self.label_11.setText(str(user_com[3][0]))

self.label_15.setText(str(user_com[4][0]))

self.label_16.setText(str(user_com[5][0]))

defrating(self):#猜你想看

self.label_8.setText('')

self.label_9.setText('')

self.label_10.setText('')

self.label_11.setText('')

self.label_15.setText('')

self.label_16.setText('')

#id_book=self.lineEdit.text()

importpandasaspd

df=pd.read_csv("rating.csv",sep=";",header=None,names=["user","book","rating"],encoding='gbk')

df=df.sort(["rating"],ascending=False)

df=df.head(6)

df=df.values

self.label_8.setText(str(df[0]))

self.label_9.setText(str(df[1]))

self.label_10.setText(str(df[2]))

self.label_11.setText(str(df[3]))

self.label_15.setText(str(df[4]))

self.label_16.setText(str(df[5]))5.2系統(tǒng)測試5.2.1系統(tǒng)數(shù)據(jù)完整性測試在開發(fā)過程中和開發(fā)完成以后對系統(tǒng)進(jìn)行了嚴(yán)格的測試。數(shù)據(jù)和數(shù)據(jù)庫完整性測試目標(biāo):確保數(shù)據(jù)庫訪問方法和進(jìn)程正常運(yùn)行,數(shù)據(jù)不會遭到損壞。測試方法:調(diào)用各個數(shù)據(jù)庫訪問方法和進(jìn)程,并在其中填充有效的和無效的數(shù)據(jù)或?qū)?shù)據(jù)的請求。檢查數(shù)據(jù)庫,確保數(shù)據(jù)已按預(yù)期的方式填充,并且所有數(shù)據(jù)庫事件都按正常方式出現(xiàn);或者檢查所返回的數(shù)據(jù),確保為正當(dāng)?shù)睦碛蓹z索到了正確的數(shù)據(jù)。測試完成標(biāo)準(zhǔn):所有數(shù)據(jù)庫訪問方法和進(jìn)程都按照設(shè)計(jì)的方式運(yùn)行,部分無效數(shù)據(jù)已刪除。5.2.2系統(tǒng)功能測試系統(tǒng)功能測試目標(biāo):確保數(shù)據(jù)庫訪問方法和進(jìn)程正常運(yùn)行,數(shù)據(jù)不會遭到損壞。測試方法:利用有效的和無效的數(shù)據(jù)來執(zhí)行各個用例、用例流或功能,以核實(shí):在使用有效數(shù)據(jù)時得到預(yù)期的結(jié)果;在使用無效數(shù)據(jù)時顯示相應(yīng)的錯誤消息或警告消息;各業(yè)務(wù)規(guī)則都得到了正確的應(yīng)用。測試完成標(biāo)準(zhǔn):所計(jì)劃的測試已全部執(zhí)行;所發(fā)現(xiàn)的缺陷部分已解決。5.2.4測試報(bào)告測試完項(xiàng)目后,根據(jù)測試的過程寫好了測試報(bào)告,測試報(bào)告包括以下內(nèi)容:測試項(xiàng)目、測試的目的、測試的結(jié)果、原因、以及解決問題的進(jìn)展和情況。測試的項(xiàng)目包括了用戶的登錄,用戶的注冊,個性推薦,志同道合,猜你想看。根據(jù)測試生成了一些測試結(jié)果,找到原因后開始解決,解決情況和測試的詳細(xì)情況如表5.3所示:表5.3測試報(bào)告表測試項(xiàng)目測試目的測試結(jié)果原因解決情況用戶登錄確保系統(tǒng)的安全性安全存在其它因素仍在解決用戶注冊確保注冊信息添加成功添加不成功SQL語句有問題已解決個性推薦確保個性推薦圖書成功推薦推薦不成功工具包有問題已解決志同道合確保對相似用戶的成功推薦程序運(yùn)行正常猜你想看確保對圖書成功推薦程序運(yùn)行正??偨Y(jié)與展望第6章總結(jié)與展望6.1系統(tǒng)總結(jié)通過本次圖書推薦系統(tǒng)的實(shí)現(xiàn),從網(wǎng)站數(shù)據(jù)的查找與下載,到Python數(shù)據(jù)處理,數(shù)據(jù)分析,數(shù)據(jù)庫建立與連接,然后spark協(xié)同過濾推薦算法的使用實(shí)現(xiàn)推薦功能,到pycharm、Qtcreator界面設(shè)計(jì),最后合項(xiàng)目,我們收獲很多。同樣,本系統(tǒng)還有一些功能不太健全,使用起來不是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論