何鍇琦, 馬宇驍, 張 炎, 劉華虓
(1. 吉林大學(xué) 研究生院, 長(zhǎng)春 130012; 2. 美國(guó)東北大學(xué) 工程學(xué)院, 美國(guó) 波士頓 02115;3. 吉林大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院, 長(zhǎng)春 130012)
GitHub是目前知名的軟件項(xiàng)目托管平臺(tái)之一, 在該平臺(tái)上開發(fā)人員可通過賬戶共享自己創(chuàng)建(Create)的項(xiàng)目、 派生(Fork)他人的項(xiàng)目或關(guān)注(Watch)其他開發(fā)者的項(xiàng)目. 其提供了搜索功能, 在不提供任何自動(dòng)建議的情形下允許用戶對(duì)平臺(tái)中的項(xiàng)目進(jìn)行手動(dòng)檢索. 傳統(tǒng)的搜索引擎通常側(cè)重于對(duì)檢索內(nèi)容的文本匹配, 但對(duì)于開源軟件代碼庫的用戶, 搜索合適的項(xiàng)目是一項(xiàng)困難的任務(wù): 一方面, 用戶通常很難用幾個(gè)關(guān)鍵詞準(zhǔn)確地描述軟件項(xiàng)目的特征, 導(dǎo)致難以獲得理想結(jié)果,此外, 由于搜索結(jié)果較多, 待選項(xiàng)目的質(zhì)量通常參差不齊, 只能依靠星級(jí)等有限評(píng)價(jià)體系; 另一方面, 由于不同項(xiàng)目的參與難度不同, 會(huì)導(dǎo)致缺乏經(jīng)驗(yàn)的新用戶無從下手. 因此, 如何利用數(shù)據(jù)分析方法, 根據(jù)不同用戶的專業(yè)方向和專業(yè)水平的差異, 提供個(gè)性化項(xiàng)目推薦方法研究已成為目前的熱門問題[1].
本文基于內(nèi)存的協(xié)同過濾方法, 提出一種基于數(shù)據(jù)的面向領(lǐng)域入門的GitHub項(xiàng)目個(gè)性化混合推薦方法, 通過將基于用戶和基于項(xiàng)目的協(xié)同過濾方法進(jìn)行混合, 并利用倒排表和K均值分類方法, 在一定程度上解決了傳統(tǒng)方法在面對(duì)GitHub用戶及項(xiàng)目數(shù)量級(jí)較大但交叉度較低的數(shù)據(jù)集時(shí)數(shù)據(jù)稀疏和冷啟動(dòng)問題, 并通過對(duì)比實(shí)驗(yàn)驗(yàn)證了本文方法的有效性.
協(xié)同過濾方法是一組用于推薦系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)的方法, 具有實(shí)現(xiàn)簡(jiǎn)單且推薦結(jié)果準(zhǔn)確的特征. Tapestry[2]作為第一個(gè)手動(dòng)協(xié)作過濾系統(tǒng), 允許用戶通過參考其他用戶的操作查詢信息域中的項(xiàng)目. 文獻(xiàn)[3]提出了自動(dòng)協(xié)作過濾系統(tǒng)GroupLens, 其能自動(dòng)定位具有相關(guān)性的信息, 并聚合為目標(biāo)用戶提供建議. 用戶只需執(zhí)行可觀察到的操作, 系統(tǒng)將收集到的信息與其他用戶的相關(guān)操作結(jié)合, 提供個(gè)性化的結(jié)果. 協(xié)同過濾技術(shù)中最常見的是基于內(nèi)存的技術(shù), 基于內(nèi)存的技術(shù)使用已有的評(píng)價(jià)數(shù)據(jù)計(jì)算用戶或項(xiàng)目之間的相似度[4], 根據(jù)計(jì)算出的相似度值做出推薦, 其又可分為基于用戶的方法和基于項(xiàng)目的方法兩種.
基于用戶的協(xié)同過濾算法(user-based collaborative filtering)是目前應(yīng)用較多的算法. 該算法通過計(jì)算目標(biāo)用戶與鄰居用戶之間的相似性, 根據(jù)鄰居用戶對(duì)某個(gè)資源的評(píng)分, 預(yù)測(cè)目標(biāo)用戶的評(píng)分, 預(yù)測(cè)評(píng)分最高的若干項(xiàng)目作為對(duì)用戶的推薦呈現(xiàn)給目標(biāo)用戶. 其核心思想是計(jì)算用戶間的相似性, 尋找與用戶相似度最高的鄰居. 而基于項(xiàng)目的協(xié)同過濾算法(item-based collaborative filtering)則關(guān)注目標(biāo)用戶評(píng)分的項(xiàng)目與其鄰居項(xiàng)目的相似性, 將預(yù)測(cè)評(píng)分高的若干項(xiàng)目作為對(duì)用戶的推薦呈現(xiàn)給目標(biāo)用戶.
對(duì)于目標(biāo)用戶u, 基于用戶的協(xié)同過濾方法首先在用戶群中找到與用戶u存在相似性的用戶, 然后通過對(duì)其感興趣的項(xiàng)目進(jìn)行篩選, 結(jié)合他們對(duì)某一項(xiàng)目r的評(píng)分預(yù)測(cè)用戶u對(duì)該項(xiàng)目的評(píng)分, 從而得到用戶u對(duì)未知項(xiàng)目的評(píng)分排序列表, 進(jìn)而達(dá)到推薦目的. 算法步驟如下.
1) 將獲取的數(shù)據(jù)集進(jìn)行預(yù)處理, 為不同操作賦予不同的分?jǐn)?shù)權(quán)重, 然后利用處理好的數(shù)據(jù)集構(gòu)建用戶-項(xiàng)目矩陣. 結(jié)果表示為一個(gè)m×n的用戶評(píng)價(jià)矩陣M, 其中m是用戶數(shù),n是項(xiàng)目數(shù),M[i,j]表示第i個(gè)用戶對(duì)第j個(gè)項(xiàng)目的操作; 若用戶未對(duì)某個(gè)項(xiàng)目進(jìn)行過操作, 則記為0分. 表1為用戶-項(xiàng)目矩陣的一個(gè)示例.
表1 用戶-項(xiàng)目矩陣示例
2) 得到用戶-項(xiàng)目矩陣后, 要完成對(duì)目標(biāo)用戶最近鄰居的查找. 通過計(jì)算目標(biāo)用戶與其他用戶之間的相似度, 得到與目標(biāo)用戶最近的鄰居集. 假設(shè)R(u)為用戶u進(jìn)行過操作的項(xiàng)目集合,R(v)為用戶v進(jìn)行過操作的項(xiàng)目集合, 如果將用戶-項(xiàng)目矩陣中的每行記錄視為一個(gè)向量, 則在推薦問題中計(jì)算u與v的相似度常用Jaccard相似度算法[5]和余弦相似度算法[6], 計(jì)算公式分別為
(1)
(2)
Jaccard相似度算法用于計(jì)算兩個(gè)集合之間的相似程度, 但集合中的元素取值是二元的, 只能是0或1; 而余弦相似度算法在這方面則沒有限制.
3) 先從已計(jì)算完相似度的用戶集中篩選出與目標(biāo)用戶u最相似的k個(gè)用戶, 用集合S(u,k)表示, 其中k是預(yù)設(shè)的相似用戶窗口尺寸. 然后提取S中用戶的所有評(píng)分項(xiàng)目, 并刪除目標(biāo)用戶u進(jìn)行過評(píng)分的項(xiàng)目, 將保留下的項(xiàng)目視為候選項(xiàng)目, 對(duì)每個(gè)候選項(xiàng)目r, 用戶對(duì)其預(yù)測(cè)評(píng)分(感興趣程度)為
(3)
其中RTv,r表示用戶v對(duì)項(xiàng)目r的評(píng)分. 最后根據(jù)預(yù)測(cè)的目標(biāo)用戶評(píng)分結(jié)果進(jìn)行排序, 取前N個(gè)作為最終的推薦結(jié)果.
與基于用戶的協(xié)同過濾方法相反, 基于項(xiàng)目的協(xié)同過濾方法[7]通過計(jì)算項(xiàng)目之間的相似度找到最相似的項(xiàng)目, 直接執(zhí)行協(xié)同過濾. 該算法步驟如下:
1) 對(duì)于每個(gè)項(xiàng)目, 算法通過使用余弦相似度計(jì)算相似度, 得到k個(gè)與其最相似的項(xiàng)目,k也稱為鄰居數(shù);
2) 該算法從k個(gè)最相似的項(xiàng)目中刪除待推薦用戶已評(píng)分(進(jìn)行過操作)的項(xiàng)目集合R, 即刪除用戶已經(jīng)創(chuàng)建、 派生或關(guān)注的所有存儲(chǔ)庫, 將結(jié)果保存在集合U中;
3) 計(jì)算集合U和集合R中每個(gè)項(xiàng)目之間的相似度, 即計(jì)算用戶已評(píng)分的項(xiàng)目與其k個(gè)最相似項(xiàng)目之間的相似度, 結(jié)果是一個(gè)按相似度遞減排序的項(xiàng)目列表.
通過對(duì)兩種基于內(nèi)存的協(xié)同過濾方法比較可見: 基于用戶的協(xié)同過濾方法具有易實(shí)現(xiàn)、 準(zhǔn)確率高、 移植性強(qiáng)等特點(diǎn), 但隨著用戶量的增加, 推薦過程的計(jì)算量呈線性增加, 對(duì)于千萬級(jí)的用戶和項(xiàng)目, 存在嚴(yán)重的可擴(kuò)展性問題; 而基于項(xiàng)目的協(xié)同過濾方法則可通過建立以項(xiàng)目為基礎(chǔ)的推薦模型, 解決高計(jì)算成本的問題, 且在多數(shù)情形下推薦結(jié)果甚至優(yōu)于傳統(tǒng)的基于用戶的協(xié)同過濾方法. 但這兩種方法也存在數(shù)據(jù)稀疏、 高維度、 冷啟動(dòng)等問題; 此外, 在推薦結(jié)果上, 基于用戶的方法偏向于推薦流行度高的項(xiàng)目, 而基于項(xiàng)目的方法則偏向于推薦更具個(gè)性化的項(xiàng)目.
基于上述分析, 本文將兩種基于內(nèi)存的協(xié)同過濾方法相結(jié)合, 提出一種混合推薦方法, 不僅可動(dòng)態(tài)計(jì)算相似用戶以保證推薦的個(gè)性化, 而且只用很小規(guī)模的相似用戶便可得到與基于項(xiàng)目方法相近似的推薦質(zhì)量. 本文混合推薦方法如下:
1) 利用基于用戶協(xié)同過濾方法中計(jì)算用戶相似度的方法, 計(jì)算目標(biāo)用戶u與其他所有用戶的相似性, 確定u的鄰居用戶. 可采用兩種方法: 一是預(yù)先確定相似度閾值, 與目標(biāo)用戶相似度大于該閾值的用戶作為其鄰居; 二是預(yù)先確定鄰居數(shù)k, 選擇相似度最高的前k個(gè)用戶作為鄰居. 本文使用第二種方法確定目標(biāo)用戶的鄰居.
2) 根據(jù)上述確定的鄰居用戶, 利用基于項(xiàng)目協(xié)同過濾的方法進(jìn)行預(yù)測(cè)評(píng)分及項(xiàng)目推薦, 即通過計(jì)算項(xiàng)目之間的相似度, 找出與目標(biāo)用戶及其鄰居已評(píng)分項(xiàng)目中的相似項(xiàng)目, 并根據(jù)相似度順序進(jìn)行Top-N推薦.
通過對(duì)兩種推薦方法的結(jié)合, 使推薦結(jié)果的流行度與個(gè)性化兼?zhèn)? 且降低了推薦成本, 提高了推薦效率.
在協(xié)作過濾技術(shù)中, 通常需要構(gòu)建用戶-項(xiàng)目矩陣, 其中每個(gè)條目都是未知值或用戶對(duì)項(xiàng)目的評(píng)分. 本文在構(gòu)建用戶-項(xiàng)目矩陣中的用戶評(píng)分建模時(shí)考慮用戶對(duì)項(xiàng)目的Create,Fork和Watch三個(gè)操作, 并根據(jù)操作中所隱含的用戶與項(xiàng)目的關(guān)聯(lián)程度, 為三種操作指定評(píng)分值5,3和1, 即如果開發(fā)人員是該代碼庫的創(chuàng)建者, 則其評(píng)分值為5; 如果開發(fā)人員派生了該代碼庫, 則其評(píng)分值為3; 如果開發(fā)人員關(guān)注了該代碼庫, 則其評(píng)分值為1, 否則為0(未知評(píng)分).
定義1設(shè)U={u1,u2,…,un}是所有用戶的集合,R={R1,R2,…,Rn}是所有項(xiàng)目的集合, 則用戶-項(xiàng)目矩陣(開發(fā)人員-代碼庫矩陣)為Mn×m, 其中,
圖1 用戶與項(xiàng)目的關(guān)系Fig.1 Relationship between users and items
圖2 項(xiàng)目-用戶倒排表Fig.2 Inverse table of item-user
設(shè)相似度矩陣為C[u][v], 令C[u][v]=R(u)∩R(v), 即在倒排表中假設(shè)用戶u和用戶v同時(shí)屬于倒排表中K個(gè)項(xiàng)目對(duì)應(yīng)的用戶列表, 則有C[u][v]=K. 如圖1所示, 只有在項(xiàng)目a對(duì)應(yīng)的用戶列表中同時(shí)出現(xiàn)了用戶A和用戶B, 則在矩陣中將C[A][B]賦值為1. 綜合圖2的項(xiàng)目-用戶倒排表, 相似度矩陣賦值如圖3所示. 用余弦相似度算法對(duì)相似度矩陣進(jìn)行優(yōu)化處理, 可得如圖4所示的相似度矩陣, 從而降低了數(shù)據(jù)的稀疏性.
圖3 相似度矩陣賦值Fig.3 Similarity matrix assignment
圖4 余弦相似度計(jì)算后的相似度矩陣Fig.4 Similarity matrix after cosine similarity calculation
當(dāng)期望以用戶或項(xiàng)目的歷史行為作為研究對(duì)象時(shí), 不可避免地會(huì)遇到冷啟動(dòng)問題, 即當(dāng)用戶或項(xiàng)目作為新數(shù)據(jù)進(jìn)入數(shù)據(jù)庫時(shí), 其歷史行為集為空集, 使得研究方法無法應(yīng)用. 在推薦問題上, 冷啟動(dòng)問題表現(xiàn)為: 對(duì)新用戶推薦結(jié)果的合理性和有效性無法得到保障, 以及新項(xiàng)目無法被推薦給用戶. 本文對(duì)前者進(jìn)行一定程度的緩解, 將分類結(jié)果作為項(xiàng)目的一個(gè)屬性留存, 在系統(tǒng)對(duì)領(lǐng)域入門的用戶進(jìn)行推薦時(shí), 將參考該屬性對(duì)其做出推薦, 步驟如下:
1) 將項(xiàng)目的文本信息矢量化, 將其轉(zhuǎn)換為高維度向量, 同時(shí), 利用詞頻-逆文件(TF-IDF)頻率方法, 在矢量化過程中計(jì)算各詞語的TF-IDF值, 以便后續(xù)分析與處理;
2) 按照提前設(shè)置好的類別數(shù)K, 將K均值聚類算法應(yīng)用到步驟1)中的矢量結(jié)果中, 不斷運(yùn)行直至聚類結(jié)束;
3) 輸出每個(gè)項(xiàng)目的所屬類別結(jié)果, 并輸出每個(gè)類的關(guān)鍵詞信息.
本文改進(jìn)方法的思想: 當(dāng)用戶在GitHub中擁有一定量對(duì)項(xiàng)目的操作歷史后, 推薦系統(tǒng)可根據(jù)行為歷史對(duì)用戶作出推薦; 但當(dāng)用戶行為歷史不足時(shí), 如領(lǐng)域入門的開發(fā)者, 期望通過對(duì)其僅有的行為歷史得到一些項(xiàng)目信息, 并為其推薦擁有相似信息的項(xiàng)目, 使推薦結(jié)果盡可能合理、 有效, 從而在一定程度上緩解協(xié)同過濾方法的冷啟動(dòng)問題.
本文選取的項(xiàng)目信息是項(xiàng)目文本信息. 在GitHub中項(xiàng)目具有多種文本信息, 如名稱、 簡(jiǎn)介、 代碼、 ReadMe文件等, 從中選取最能快速區(qū)分項(xiàng)目間差異的項(xiàng)目名稱、 項(xiàng)目簡(jiǎn)介, 并遵循用戶友好的原則, 同時(shí)考慮項(xiàng)目的編程語言種類因素. 本文用K均值聚類算法對(duì)項(xiàng)目文本信息進(jìn)行分析, 確定其之間的相似關(guān)系. 在將文本信息矢量化的同時(shí), 直接利用詞頻-逆文件頻率方法[8]對(duì)矩陣進(jìn)行優(yōu)化.
為方便研究人員對(duì)GitHub進(jìn)行研究, 平臺(tái)開放了GitHub rest API, 用以提供GitHub的用戶及項(xiàng)目數(shù)據(jù). 但GitHub的數(shù)據(jù)量非常龐大, 且5 000個(gè)/h請(qǐng)求的API速率限制使完整下載數(shù)據(jù)幾乎是不可能的. 為鼓勵(lì)研究者對(duì)GitHub數(shù)據(jù)進(jìn)行更深入地挖掘, Gousios等[9-11]創(chuàng)建了GHTorrent, 本質(zhì)上是GitHub rest API所提供數(shù)據(jù)的一個(gè)可伸縮、 可查詢的離線鏡像.
本文選擇最新的完整數(shù)據(jù)包, 該數(shù)據(jù)包中包含了目前GitHub各類數(shù)據(jù), 包括用戶、 項(xiàng)目、 提交等. 然后將整個(gè)數(shù)據(jù)包導(dǎo)入到MySql數(shù)據(jù)庫系統(tǒng)中, 并對(duì)其進(jìn)行如下預(yù)處理:
1) 數(shù)據(jù)集中共有121 725 743個(gè)項(xiàng)目, 將其均勻分為50檔, 每檔隨機(jī)抽取100個(gè)項(xiàng)目, 共得到5 000個(gè)項(xiàng)目;
2) 從2019-01-01—2019-05-31的相關(guān)數(shù)據(jù)中截取5 000個(gè)項(xiàng)目, 對(duì)這些項(xiàng)目最近5個(gè)月的數(shù)據(jù)進(jìn)行研究;
3) 從數(shù)據(jù)集中提取出所有對(duì)5 000個(gè)項(xiàng)目進(jìn)行過創(chuàng)建(Create)、 派生(Fork)或關(guān)注(Watch)操作的用戶;
4) 對(duì)項(xiàng)目和用戶進(jìn)行真實(shí)性和存在性的篩選, 以確保所有項(xiàng)目和用戶是真實(shí)的且未注銷或刪除;
5) 以用戶的操作量作為篩選條件, 以10作為篩選閾值, 刪除對(duì)項(xiàng)目操作數(shù)低于10次的用戶;
6) 最后將用戶和項(xiàng)目的行為關(guān)系進(jìn)行格式化, 使其能被推薦系統(tǒng)成功讀取.
經(jīng)過上述預(yù)處理, 本文共獲得10 742名GitHub用戶面向4 879個(gè)GitHub項(xiàng)目的創(chuàng)建、 派生和關(guān)注操作數(shù)據(jù)共計(jì)195 850條. 此外, 本文還從GHTorrent數(shù)據(jù)集中獲取到實(shí)驗(yàn)所用項(xiàng)目的文本信息, 包括項(xiàng)目名稱、 項(xiàng)目簡(jiǎn)介和編程語言等, 并對(duì)其進(jìn)行如下預(yù)處理:
1) 分別得到4 879個(gè)候選項(xiàng)目的名稱、 簡(jiǎn)介和所用編程語言(占最大比例), 并將三者在文本層面上進(jìn)行連接;
2) 刪除文本中的標(biāo)點(diǎn)符號(hào)、 特殊字符及亂碼等干擾信息;
3) 將項(xiàng)目編號(hào)與對(duì)應(yīng)文本進(jìn)行格式化, 使其能被推薦系統(tǒng)成功讀取.
圖5 K值對(duì)數(shù)據(jù)畸變程度的影響Fig.5 Influence of K values on degree of data distortion
下面通過控制變量對(duì)比性實(shí)驗(yàn)的方法對(duì)改進(jìn)方法的參數(shù)進(jìn)行優(yōu)化. 首先對(duì)混合推薦方法的鄰居用戶數(shù)、 鄰居項(xiàng)目數(shù)和推薦項(xiàng)目數(shù)分別進(jìn)行對(duì)比實(shí)驗(yàn). 選取推薦項(xiàng)目數(shù)為5, 鄰居項(xiàng)目數(shù)為15, 取鄰居用戶數(shù)10~20, 觀察精確率和召回率指標(biāo)的變化, 結(jié)果列于表2. 由表2可見, 指標(biāo)隨鄰居用戶數(shù)的增多而提高, 為了兼顧推薦效率、 覆蓋率和流行度等其他變量, 本文將鄰居用戶數(shù)設(shè)為15. 選取推薦項(xiàng)目數(shù)為5, 鄰居用戶數(shù)為15, 取鄰居項(xiàng)目數(shù)10~20, 觀察其各項(xiàng)指標(biāo)變化, 結(jié)果列于表3. 觀察結(jié)果與鄰居用戶數(shù)類似, 因此同理將鄰居項(xiàng)目數(shù)設(shè)為15. 選取鄰居用戶數(shù)為15, 鄰居項(xiàng)目數(shù)為15, 取推薦項(xiàng)目1~11, 觀察其各項(xiàng)指標(biāo)的變化, 結(jié)果列于表4. 由表4可見, 隨著推薦項(xiàng)目數(shù)的增加, 精確率迅速下降, 而召回率迅速提升, 因此本文取均值, 將推薦項(xiàng)目數(shù)設(shè)為5.
下面對(duì)緩解冷啟動(dòng)問題時(shí)K均值聚類算法的K值進(jìn)行優(yōu)化. 將K值取1~10, 并分別計(jì)算每個(gè)K值對(duì)應(yīng)的畸變程度, 即每個(gè)類心與其內(nèi)部數(shù)據(jù)成員位置距離平方和的平均值, 若類內(nèi)成員彼此間越緊湊則類的畸變程度越小, 反之, 若類內(nèi)成員彼此間越分散則類的畸變程度越大, 實(shí)驗(yàn)結(jié)果如圖5所示. 由圖5可見, 畸變程度隨聚類數(shù)K的增大而降低, 但若K值過小, 聚類則失去了實(shí)際意義, 無法為用戶推薦個(gè)性化強(qiáng)的項(xiàng)目, 因此本文取K=6, 期望能兼顧項(xiàng)目的相似性與獨(dú)特性.
表2 鄰居用戶數(shù)對(duì)精確率和召回率的影響
表3 鄰居項(xiàng)目數(shù)對(duì)精確率和召回率的影響
表4 推薦項(xiàng)目數(shù)對(duì)精確率和召回率的影響
圖6 不同推薦方法在4個(gè)評(píng)價(jià)指標(biāo)上的對(duì)比Fig.6 Comparison of different recommended methods on four evaluation indexes
將上述參數(shù)應(yīng)用到改進(jìn)后的推薦方法中, 并將改進(jìn)方法與傳統(tǒng)的兩種基于內(nèi)存的協(xié)同過濾方法進(jìn)行對(duì)比, 以驗(yàn)證本文方法的可行性. 本文對(duì)基于改進(jìn)后的推薦系統(tǒng)進(jìn)行了實(shí)際操作, 針對(duì)某個(gè)真實(shí)用戶進(jìn)行推薦結(jié)果分析, 使實(shí)驗(yàn)結(jié)果更直觀.
首先將改進(jìn)方法與傳統(tǒng)方法應(yīng)用到經(jīng)過預(yù)處理的GitHub數(shù)據(jù)集上進(jìn)行評(píng)估, 實(shí)驗(yàn)結(jié)果如圖6所示. 由圖6可見: 改進(jìn)方法在精確率和召回率指標(biāo)上均高于兩種傳統(tǒng)方法, 改進(jìn)方法的覆蓋率和流行度指標(biāo)均介于二者之間; 改進(jìn)方法解決了數(shù)據(jù)稀疏性問題, 并在一定程度上緩解了冷啟動(dòng)問題, 提高了整體推薦性能.
下面針對(duì)實(shí)驗(yàn)數(shù)據(jù)集中的8088號(hào)用戶“Ajeo”從推薦系統(tǒng)中獲取的推薦結(jié)果進(jìn)行分析, 其GitHub主頁如圖7所示. “Ajeo”在本文實(shí)驗(yàn)數(shù)據(jù)集中共有14條評(píng)分?jǐn)?shù)據(jù), 其中包括派生了自然語言處理課程“oxford-cs-deepnlp-2017/lectures”, 關(guān)注了數(shù)據(jù)科學(xué)手冊(cè)“jakevdp/PythonDataScience Handbook”、 著名的自然語言處理工具“google-research/bert”和深度學(xué)習(xí)論文“terryum/awesome-deep-learning-papers”等; 本文推薦系統(tǒng)根據(jù)其項(xiàng)目操作歷史, 為其個(gè)性化推薦5個(gè)項(xiàng)目, 結(jié)果列于表5.
圖7 “Ajeo” GitHub主頁Fig.7 GitHub homepage of “Ajeo”
表5 用戶“Ajeo”獲得的推薦結(jié)果
由表5可見, 在Top-5推薦列表中, 排在第一位的是一個(gè)設(shè)計(jì)工具的插件集, 這是計(jì)算機(jī)從業(yè)者常用的工具, 具有較高的流行度. 可以合理推測(cè), 與其相似的開發(fā)者可能很多人都在使用這個(gè)工具集. 而剩下的4個(gè)項(xiàng)目都與他在GitHub上的項(xiàng)目操作歷史緊密相關(guān), 涉及到機(jī)器學(xué)習(xí)、 自然語言處理等內(nèi)容. 通過對(duì)用戶“Ajeo”所得推薦結(jié)果的分析, 可認(rèn)為本文推薦系統(tǒng)具有較合理、 有效的推薦能力.
下面在數(shù)據(jù)集中新加入一名用戶“ILOVEJLU”, 并令其派生一個(gè)Android UI庫“wasabeef/awesome-android-ui”, 然后使用推薦系統(tǒng)為其提供推薦結(jié)果, 得到推薦結(jié)果列于表6.
表6 用戶“ILOVEJLU”獲得的推薦結(jié)果
由表6可見, 系統(tǒng)提供的推薦結(jié)果在文本信息層面與“ILOVEJLU”的項(xiàng)目操作歷史相似度很高, 因而內(nèi)容上也具有很強(qiáng)的相關(guān)性, 對(duì)于新用戶或領(lǐng)域入門的開發(fā)者具有一定的指導(dǎo)意義.
綜上所述, 針對(duì)GitHub平臺(tái)現(xiàn)有項(xiàng)目推薦功能的缺陷, 本文提出了一種基于數(shù)據(jù)的GitHub項(xiàng)目個(gè)性化混合推薦方法. 首先, 對(duì)現(xiàn)有協(xié)同過濾方法進(jìn)行了改進(jìn)和優(yōu)化, 通過建立倒排表的方式大幅度降低了基于用戶的協(xié)同過濾方法在計(jì)算用戶相似度時(shí)的計(jì)算成本, 并提高了運(yùn)行效率, 克服了協(xié)同過濾方法存在的數(shù)據(jù)稀疏性問題; 其次, 通過利用基于用戶的協(xié)同過濾方法進(jìn)行用戶相似度計(jì)算, 并利用基于項(xiàng)目的協(xié)同過濾方法進(jìn)行項(xiàng)目推薦的方式, 將兩種基于內(nèi)存的協(xié)同過濾方法相結(jié)合成為混合推薦方法, 優(yōu)化了推薦結(jié)果, 兼顧了推薦結(jié)果的流行度與個(gè)性化, 并保持了協(xié)同過濾推薦方法的優(yōu)越性; 再次, 基于項(xiàng)目文本信息進(jìn)行聚類, 使評(píng)分歷史不足的用戶能利用僅有的項(xiàng)目歷史獲得較合理、 有效的推薦, 在一定程度上緩解了協(xié)同過濾方法存在的冷啟動(dòng)問題; 最后對(duì)該推薦方法進(jìn)行實(shí)證研究, 將其應(yīng)用到從GHTorrent獲取的真實(shí)GitHub數(shù)據(jù)上, 并通過實(shí)驗(yàn)對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行評(píng)估. 實(shí)驗(yàn)結(jié)果表明, 在常見的幾個(gè)評(píng)估推薦系統(tǒng)的評(píng)價(jià)指標(biāo)上, 本文方法與兩種傳統(tǒng)基于內(nèi)存的協(xié)同過濾方法相比, 都有較優(yōu)越的表現(xiàn), 證實(shí)了該方法在面向領(lǐng)域入門的GitHub項(xiàng)目推薦問題上的可行性.