余建芳
(廣西民族師范學(xué)院,廣西崇左 532200)
當(dāng)今世界,隨著信息技術(shù)的飛速發(fā)展,互聯(lián)網(wǎng)的廣泛普及,產(chǎn)生了海量的數(shù)據(jù)。用戶為了找到對(duì)自己有用的信息,越來越感到迷茫。以Baidu為代表的搜索引擎等系統(tǒng)的出現(xiàn),對(duì)于海量信息帶來的超載問題困擾是有一定程度的緩解。但搜索引擎只是信息檢索中的一種,當(dāng)用戶輸入查詢關(guān)鍵字時(shí),往往返回的信息都是千篇一律的內(nèi)容,缺乏個(gè)性化和多元化。作為用戶,往往希望得到符合當(dāng)下場(chǎng)景的結(jié)果。在這種背景情況的驅(qū)動(dòng)下,個(gè)性化閱讀推薦系統(tǒng)及時(shí)出現(xiàn)了。個(gè)性化閱讀推薦系統(tǒng)可以通過用戶的興趣愛好以及個(gè)人在互聯(lián)網(wǎng)上的瀏覽足跡等行為為用戶推薦自己的資源需求。本文就如何在現(xiàn)有高校圖書館中使用個(gè)性化推薦服務(wù),結(jié)合當(dāng)前個(gè)別高校的現(xiàn)狀,設(shè)計(jì)出了符合當(dāng)下實(shí)際的個(gè)性化閱讀推薦系統(tǒng)。
對(duì)于高校圖書館,一般都會(huì)有作者圖書書目查詢的圖書館門戶。可以視為一個(gè)圖書館書目檢索系統(tǒng)或用戶界面系統(tǒng)(UI系統(tǒng))。以下稱UI系統(tǒng)。UI系統(tǒng)可以將每位讀者的不同閱覽行為記錄到用戶相對(duì)應(yīng)的行為日志中。個(gè)性化閱讀推薦系統(tǒng)會(huì)根據(jù)這些用戶日志進(jìn)行分析,推薦給用戶所對(duì)應(yīng)的圖書和相應(yīng)資源。
基于一般高校圖書館的現(xiàn)有需求,在這里我們采用Mahout來創(chuàng)建屬于我們自己的個(gè)性化閱讀服務(wù)系統(tǒng)。
Apache Mahout是Apache Software Foundation旗下開源項(xiàng)目,該項(xiàng)目可以幫助開發(fā)人員很快的搭建智能應(yīng)用系統(tǒng),還可以提供一些相關(guān)經(jīng)典算法,主要是機(jī)器學(xué)習(xí)領(lǐng)域方面的。在最新的Mahout項(xiàng)目中增加了對(duì)Apache Hadoop的支持,使得這些算法可以在大數(shù)據(jù)乃至云計(jì)算環(huán)境中運(yùn)行。
Taste是一個(gè)用Java語(yǔ)言編寫的協(xié)同過濾算法庫(kù),可用來搭建可擴(kuò)展的,高效的推薦系統(tǒng)。Taste庫(kù)屬于Apache Mahout的一部分。Taste庫(kù)不但實(shí)現(xiàn)了基于內(nèi)容的推薦算法,還實(shí)現(xiàn)了基于用戶的推薦算法,提供了對(duì)應(yīng)的擴(kuò)展接口,用戶可以實(shí)現(xiàn)和定義自己的推薦算法。Taste被設(shè)計(jì)成了一個(gè)組件,該組件不僅對(duì)Java應(yīng)用程序是適用的,而且對(duì)于服務(wù)器內(nèi)部而言,它可以充當(dāng)一個(gè)服務(wù)組件,可以以Web Service及HTTP的方式提供個(gè)性化推薦服務(wù)。綜上所述,Taste可以同時(shí)滿足在開發(fā)推薦引擎時(shí)的靈活性、對(duì)性能以及可擴(kuò)展性等各個(gè)方面的需求。
Taste主要由以下幾部分組成:
數(shù)據(jù)模型(DataModel):它是生成用戶興趣、愛好的抽象接口,在具體應(yīng)用時(shí),可根據(jù)具體的數(shù)據(jù)類型來具體實(shí)現(xiàn)。Taste默認(rèn)提供兩種數(shù)據(jù)模型,是JDBCDataModel和FileDataModel。
用戶相似度計(jì)算和物品相似度計(jì)算模塊:User Similarity用于計(jì)算兩個(gè)用戶間的相似程度。在基于協(xié)同過濾算法的推薦系統(tǒng)中,可以用來計(jì)算用戶興趣愛好相似的其他用戶(鄰居)。ItemSimilarity是類似的,用以計(jì)算物品或者內(nèi)容之間的相似度。這兩個(gè)模塊是推薦系統(tǒng)中的核心模塊。
用戶鄰居計(jì)算模塊(User Neighborhood):該模塊的主要作用是找到有相同興趣愛好的用戶,在這個(gè)模塊中確定如何尋找“鄰居用戶”的方法。由于是基于User Similarity模塊的,因此一般用于基于用戶興趣愛好相似度的推薦方法中,比如我們要給某個(gè)用戶推薦和他喜歡同一類物品的“鄰居用戶”感興趣的物品。
推薦模塊(Recommender):該模塊是推薦系統(tǒng)的抽象接口也是Taste中最為核心的模塊。在實(shí)際開發(fā)推薦系統(tǒng)時(shí),我們可以基于它實(shí)現(xiàn)Generic User Based Recommender類,此時(shí)該推薦系統(tǒng)是基于用戶相似度的。若我們實(shí)現(xiàn)的是GenericItem Based Recommender則推薦系統(tǒng)是基于內(nèi)容相似度的。
第一,抽取Taste工具包在構(gòu)建推薦引擎時(shí),我們需要將Taste工具包從Mahout工程中提取出來單獨(dú)使用。這樣就避免了使用Ant或者M(jìn)aven對(duì)Mahout工程進(jìn)行編譯。
第二,通過分析個(gè)性化閱讀推薦服務(wù)中涉及的主要實(shí)體以及實(shí)體間的關(guān)系,得到數(shù)據(jù)模型。然后依據(jù)該數(shù)據(jù)模型,設(shè)計(jì)數(shù)據(jù)庫(kù)的結(jié)構(gòu)以及規(guī)劃程序中的類。
第三,實(shí)現(xiàn)推薦引擎,推薦引擎是個(gè)性化閱讀推薦服務(wù)的核心部件。由于Taste工具包既實(shí)現(xiàn)了最基本的基于用戶的和基于內(nèi)容的推薦算法,同時(shí)也提供了擴(kuò)展接口。因此我們可以通過擴(kuò)展以及實(shí)現(xiàn)自定義的一些方法完成推薦引擎的搭建,下面將進(jìn)行介紹。
圖書館的個(gè)性化閱讀推薦系統(tǒng)主要組成是由讀者的借還書行為日志來產(chǎn)生對(duì)應(yīng)基礎(chǔ)數(shù)據(jù)的,系統(tǒng)在此數(shù)據(jù)的基礎(chǔ)上經(jīng)過推薦系統(tǒng)的分析,產(chǎn)生對(duì)應(yīng)的推薦書目列表。系統(tǒng)在構(gòu)建的過程中,需要解決三個(gè)問題:(1)非結(jié)構(gòu)化數(shù)據(jù)分析問題;(2)如何存儲(chǔ)海量讀者日志;(3)構(gòu)建并行計(jì)算框架。
高校圖書館服務(wù)的主要對(duì)象是校內(nèi)的師生,一般約為1到2萬人。這類群體,每天產(chǎn)生的各類日志文件數(shù)據(jù)量是相當(dāng)大的。作為基本固定的讀者群體對(duì)圖書每日的查閱量基本都是固定的,并且頻率是很高的。每一學(xué)年到畢業(yè)論文開題,撰寫以及準(zhǔn)備要答辯時(shí),對(duì)相關(guān)文獻(xiàn)的查找量更是會(huì)急劇飆升。這樣信息日志每天都會(huì)大量產(chǎn)生。這時(shí),非關(guān)系型數(shù)據(jù)庫(kù)就是我們拿來應(yīng)對(duì)這些存儲(chǔ)需求增加的問題。
在這里,我們選擇的是NoSql的Redis進(jìn)行大批量的讀者日志存儲(chǔ)。
結(jié)構(gòu)化的數(shù)據(jù)具有固定的格式,對(duì)于設(shè)計(jì)者而言,處理相對(duì)比較容易。與讀者興趣關(guān)聯(lián)密切是待處理的非結(jié)構(gòu)化的數(shù)據(jù),通過對(duì)讀者隱性、顯性行為的分析,為讀者提供一個(gè)適合讀者自己的個(gè)性化推薦系統(tǒng)。
協(xié)同過濾推薦和基于內(nèi)容的推薦方法是目前應(yīng)用最為廣泛的兩種推薦方法。協(xié)同過濾方法與內(nèi)容推薦方法最大的不同是克服了后者不能為讀者發(fā)現(xiàn)新的與讀者興趣愛好相關(guān)的資源的缺點(diǎn)。但它依然存在讀者數(shù)據(jù)稀疏性,讀者興趣變化的差異性等問題?;趦?nèi)容的推薦方法是根據(jù)讀者以往的閱讀歷史,向讀者推薦讀者在此之前沒有接觸過的對(duì)應(yīng)推薦項(xiàng)[1]。
為解決上述問題,結(jié)合協(xié)同過濾算法的思想,基于讀者行為,根據(jù)讀者的相關(guān)信息來創(chuàng)建個(gè)性化行為模型,再用Apriori算法,挖掘模型中存在的規(guī)則,產(chǎn)生相應(yīng)的個(gè)性化圖書推薦目錄列表。
如果用戶產(chǎn)生的日志,它是分別存放于不同的服務(wù)器的,那么對(duì)于用戶興趣模型的計(jì)算就必須從不同的服務(wù)器獲取所需信息,這時(shí)就需要并行計(jì)算。但由于高校圖書館的讀者相對(duì)是比較固定的,對(duì)于并行計(jì)算的要求相對(duì)來說就比較低。
數(shù)據(jù)模型是推薦系統(tǒng)的基礎(chǔ),在構(gòu)建個(gè)性化閱讀推薦服務(wù)時(shí),我們需要針對(duì)圖書館的讀者群體進(jìn)行數(shù)據(jù)建模。一方面通過線下調(diào)研來獲取數(shù)據(jù),另一方面可以通過開發(fā)讀者中心,使得讀者在使用圖書館的各項(xiàng)服務(wù)時(shí)貢獻(xiàn)數(shù)據(jù)。簡(jiǎn)單的來說,單個(gè)高校圖書館的讀者數(shù)據(jù)模型并不是十分復(fù)雜,可按照如下形式進(jìn)行存儲(chǔ)。
數(shù)據(jù)模型中存在以下實(shí)體:
Book:表示書籍信息。
User:表示讀者,含讀者的基本信息。
Book Reference:表示某個(gè)讀者對(duì)某本書或者某篇文獻(xiàn)的喜好程度。
Book Similarity:表示兩個(gè)書籍或文獻(xiàn)的相似度,兩個(gè)書籍之間的相似度可以通過各自的基本信息按照最為簡(jiǎn)單的余弦公式計(jì)算得到[2]。
在考慮系統(tǒng)架構(gòu)時(shí),如果要在一個(gè)單一的推薦系統(tǒng)中將圖書信息的特征和推薦服務(wù)的任務(wù)都全部實(shí)現(xiàn),那么該系統(tǒng)會(huì)無比復(fù)雜,后期的維護(hù)也會(huì)困難。當(dāng)我們想通過配置文件,對(duì)某個(gè)特征進(jìn)行加權(quán)或者降權(quán)處理時(shí),由于系統(tǒng)的高度耦合性,使得該項(xiàng)工作十分困難。因此,將個(gè)性化閱讀推薦系統(tǒng)按不同的推薦模型分成若干個(gè)子模塊。每個(gè)子模塊是一個(gè)相對(duì)獨(dú)立的推薦引擎,一類任務(wù)和一類特征由每個(gè)獨(dú)立的推薦引擎負(fù)責(zé)。最終將所有推薦引擎的結(jié)果按照有關(guān)的規(guī)則返回給用戶由整個(gè)推薦系統(tǒng)負(fù)責(zé)[3]。
下圖即為個(gè)性化閱讀推薦服務(wù)的整體設(shè)計(jì)。首先通過數(shù)據(jù)挖掘,機(jī)器學(xué)習(xí)等技術(shù)把從圖書館資源到推薦引擎,將讀者對(duì)應(yīng)的特征庫(kù)建立起來,然后提供給推薦引擎。根據(jù)不同特征庫(kù)的推薦引擎,根據(jù)聚類、協(xié)同等推薦模式得到初始的推薦結(jié)果。最后按順序,經(jīng)過結(jié)果排名與過濾推薦結(jié)果,最終生成推薦結(jié)果,如圖1所示。

圖1 個(gè)性化閱讀推薦整體架構(gòu)Fig.1 Overall architecture of personalized reading recommendation
由于個(gè)性化閱讀推薦主要是根據(jù)用戶的個(gè)人行為,即在圖書資源檢索系統(tǒng)上檢索自己所需要文獻(xiàn)而運(yùn)轉(zhuǎn)的。所以針對(duì)需求,分別在兩個(gè)部分添加了推薦服務(wù)于檢索系統(tǒng)上。
第一種情況對(duì)于首次進(jìn)入檢索系統(tǒng)時(shí)的讀者適用。系統(tǒng)會(huì)根據(jù)用戶之前的檢索、瀏覽行為以及已有的興趣模型給讀者推薦自己喜歡的閱讀書籍。分為兩種:
一是根據(jù)用戶的喜好建立的模型進(jìn)行的推薦,名為“您可能想閱讀這些書籍”。
二是根據(jù)用戶的好友關(guān)系進(jìn)行的推薦,名為“您的好友也在讀”。
第二種情況適用于讀者進(jìn)行檢索后出現(xiàn)自然檢索結(jié)果的頁(yè)面,主要是根據(jù)當(dāng)前作者檢索對(duì)應(yīng)的內(nèi)容進(jìn)行的相關(guān)推薦。這時(shí)主要推薦的是與用戶檢索結(jié)果相似的書目,這樣減小用戶盲目的查找,縮短用戶找到有用文獻(xiàn)的時(shí)間,名為“相關(guān)書籍”[4]。
該模塊的主要是根據(jù)讀者的日常行為、瀏覽足跡等建立用戶行為數(shù)據(jù)庫(kù),根據(jù)讀者的標(biāo)簽姓名等屬性建立讀者信息庫(kù)。最后根據(jù)這兩個(gè)與讀者密切相關(guān)的數(shù)據(jù)庫(kù),對(duì)讀者的喜好特征向量進(jìn)行分析,提取有用的、關(guān)鍵的信息,得到讀者的特征向量庫(kù)。
該模塊的作用是生成特定的書目特征向量庫(kù),它的核心作用對(duì)于書籍文獻(xiàn)之間的相關(guān)性進(jìn)行計(jì)算。此處采用了內(nèi)容相似度和協(xié)同過濾算法進(jìn)行計(jì)算。針對(duì)不同的文獻(xiàn)在計(jì)算權(quán)重時(shí),均考慮了與該文獻(xiàn)所涉及到的讀者的借閱、檢索、預(yù)約等行為。
該模塊是根據(jù)書目與讀者行為特征,首先生成最初的推薦列表。其次對(duì)此列表進(jìn)行排序、過濾、推薦理由映射,最終生成推薦結(jié)果。
在如何實(shí)現(xiàn)個(gè)性化閱讀推薦系統(tǒng)與圖書館先有系統(tǒng)的對(duì)接上,由于我們之前在設(shè)計(jì)時(shí)采用了松耦合的設(shè)計(jì)思路,使得推薦系統(tǒng)可以無縫的接入圖書館現(xiàn)有的文獻(xiàn)檢索系統(tǒng)中,只是增加了一套推薦服務(wù)而已。當(dāng)用戶搜索某個(gè)文獻(xiàn)時(shí),得到的不僅僅是檢索服務(wù)所提供的資源列表,在其右側(cè)亦可看到由推薦系統(tǒng)所提供的閱讀建議清單。
首先創(chuàng)建MySQL數(shù)據(jù)庫(kù)存儲(chǔ)書籍文獻(xiàn)信息和讀者的信息、讀者的興趣愛好、書籍的相似度;其次是實(shí)現(xiàn)推薦引擎所需的DataModel;再次是推薦引擎核心部分實(shí)現(xiàn);最后是推薦引擎提供給信息檢索系統(tǒng)的API的實(shí)現(xiàn)。
根據(jù)推薦引擎的基本結(jié)構(gòu),要實(shí)現(xiàn)推薦引擎首先必須實(shí)現(xiàn)Recommender接口。一般情況下,Recommender接口是對(duì)Taste工具庫(kù)中提供的基本推薦引擎的接口類。在這里我們主要是針對(duì)Generic User Based Recommender進(jìn)行的擴(kuò)展。Java語(yǔ)言中,繼承接口類后必須實(shí)現(xiàn)其中的所有方法。這其中最為重要的就是用該接口中的推薦引擎的構(gòu)造函數(shù)實(shí)例化一個(gè)推薦引擎對(duì)象。這個(gè)過程一般包括以下步驟:
(1)基于之前建立好的用戶數(shù)據(jù)模型(Data Model)來計(jì)算用戶的相似程度,可以采用Pearson Correlation算法。
(2)采用Averaging Preference Inferrer類來實(shí)現(xiàn)計(jì)算用戶相似度的推理算法。這里,我們規(guī)定在基于用戶相似度計(jì)算過程中,若某個(gè)用戶與該用戶的最近距離為2,則將其稱之為“鄰居用戶”。
(3)使用以上得到的用戶相似度對(duì)象和鄰居用戶的計(jì)算方法對(duì)象創(chuàng)建一個(gè)Generic User Based Recommender的實(shí)例。一般情況下,這時(shí)都采用Caching Recommender為RecommendationItem進(jìn)行緩存,從而提高訪問速度。
在實(shí)現(xiàn)基于內(nèi)容相似度的推薦引擎,我們對(duì)原始的書籍和文獻(xiàn)信息進(jìn)行了預(yù)處理。這些預(yù)處理主要包括:事先計(jì)算出書籍文獻(xiàn)的相似度并存入數(shù)據(jù)庫(kù)的book_similarity表中;根據(jù)從數(shù)據(jù)庫(kù)中讀取得到的書籍相似度信息創(chuàng)建相似書籍的集合;基于相似書籍的集合生成內(nèi)容相似度Item Similarity。完成這些預(yù)處理后,我們就可以創(chuàng)建一個(gè)Embeded Item Based Recommender類的實(shí)例對(duì)象。它是一個(gè)內(nèi)部類,包含一個(gè)Generic Item Based Recommender實(shí)例。
該推薦引擎的工作流程大致是:首先從數(shù)據(jù)模型(Data Model)中得到含有讀者評(píng)分書籍列表,然后調(diào)用Generic Item Based Recommender中的most Similar Items方法計(jì)算出最符合該讀者興趣愛好和關(guān)注點(diǎn)的書籍或文獻(xiàn)推薦給該讀者。
完成了推薦引擎的設(shè)計(jì)與實(shí)現(xiàn),下面需要設(shè)計(jì)一些REST API,向外暴露推薦功能。這樣也是為了將個(gè)性化閱讀推薦服務(wù)與學(xué)?,F(xiàn)有的信息檢索系統(tǒng)整合在一起。為了提高推薦引擎的處理效率,這里采用單例(Singleton)模式實(shí)現(xiàn)一個(gè)推薦引擎的Book Recommender Singleton。在Servlet啟動(dòng)的時(shí)候初始化推薦引擎的單例,以后每次調(diào)用推薦方法。
截止現(xiàn)在,個(gè)性化閱讀推薦系統(tǒng)在高等院校圖書館中的應(yīng)用還不夠成熟,本文作者只是針對(duì)目前高校圖書館的實(shí)際設(shè)計(jì)符合當(dāng)下情況的個(gè)性化閱讀推薦系統(tǒng)。且由于現(xiàn)有用戶的基數(shù)較小,致使現(xiàn)在個(gè)性化閱讀推薦所得到的用戶興趣模型還不是非常準(zhǔn)確和完善的。因此需要不斷的完善相關(guān)的信息,提高相應(yīng)的技術(shù),為將來讀者使用個(gè)性化的閱讀推薦提供更好的服務(wù)。