趙佳斌,趙海燕,曹 健,陳慶奎
1(上海理工大學(xué) 光電信息與計(jì)算機(jī)工程學(xué)院 上海市現(xiàn)代光學(xué)系統(tǒng)重點(diǎn)實(shí)驗(yàn)室光學(xué)儀器與系統(tǒng)教育部工程研究中心,上海 200093) 2(上海交通大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,上海 200030)
開(kāi)源軟件已經(jīng)成為軟件開(kāi)發(fā)與應(yīng)用中的重要模式.隨著開(kāi)源項(xiàng)目托管系統(tǒng)如GitHub等的發(fā)展和普及,使得開(kāi)源項(xiàng)目的數(shù)量大幅增加,開(kāi)源社區(qū)也隨之受益.在開(kāi)源項(xiàng)目托管系統(tǒng)中,開(kāi)發(fā)者可以對(duì)感興趣的項(xiàng)目關(guān)注、分叉[1],在完成了一個(gè)功能的開(kāi)發(fā)或者漏洞的修復(fù)后可進(jìn)行提交.開(kāi)源社區(qū)通過(guò)分叉和pull-request將項(xiàng)目的修改與整合功能分開(kāi),這樣的模式吸引了大量的開(kāi)發(fā)者,也便于他們參與貢獻(xiàn)[2,3].開(kāi)發(fā)者也可以創(chuàng)建自己的公共倉(cāng)庫(kù),吸引其他的開(kāi)發(fā)者參與貢獻(xiàn).因此,開(kāi)發(fā)者的積極參與造就了許多繁榮的開(kāi)源社區(qū).
開(kāi)發(fā)者參與開(kāi)源項(xiàng)目有著不同的需求和目的,例如專業(yè)的軟件開(kāi)發(fā)人員會(huì)尋找新的編程挑戰(zhàn)或者是商業(yè)機(jī)會(huì),而初學(xué)者會(huì)利用社區(qū)中的優(yōu)質(zhì)資源來(lái)學(xué)習(xí)新的技能、提高能力等[4].為了尋找適合自己并有興趣的項(xiàng)目,開(kāi)發(fā)者需要花費(fèi)時(shí)間在大量的項(xiàng)目中進(jìn)行尋找和決策.為了給這些開(kāi)發(fā)者提供幫助,開(kāi)源項(xiàng)目推薦系統(tǒng),它能幫助開(kāi)發(fā)人員有效地發(fā)現(xiàn)那些潛在的、他們感興趣的開(kāi)源項(xiàng)目.近年來(lái),不少研究者提出了針對(duì)開(kāi)源項(xiàng)目的推薦方法,如基于協(xié)同過(guò)濾的方法[6].然而,區(qū)別于傳統(tǒng)的電子商務(wù)推薦系統(tǒng),開(kāi)發(fā)者通常不會(huì)對(duì)大量的開(kāi)源項(xiàng)目貢獻(xiàn),這就使得開(kāi)發(fā)者-項(xiàng)目的關(guān)聯(lián)矩陣較為稀疏.因此,研究者提出了根據(jù)開(kāi)發(fā)者的行為對(duì)開(kāi)發(fā)者的興趣進(jìn)行建模的方法[7,8],考慮項(xiàng)目的編程語(yǔ)言、主題等對(duì)開(kāi)發(fā)者興趣建模的方法[9,10]等.這些方法的核心是基于開(kāi)發(fā)者的歷史項(xiàng)目來(lái)對(duì)開(kāi)發(fā)者進(jìn)行興趣建模.
然而,開(kāi)發(fā)者在開(kāi)源社區(qū)中的興趣是發(fā)生變化的.例如,出于能力拓展的需要,開(kāi)發(fā)者可能會(huì)在小規(guī)模的開(kāi)源項(xiàng)目中得到鍛煉后,切換到更大規(guī)模的項(xiàng)目.又如,新的編程語(yǔ)言出現(xiàn)后,開(kāi)發(fā)者可能會(huì)進(jìn)入該語(yǔ)言的開(kāi)源項(xiàng)目.目前提出的方法通過(guò)對(duì)一個(gè)開(kāi)發(fā)者的歷史項(xiàng)目進(jìn)行分析難以反映其興趣遷移.
本文提出了一種混合方法來(lái)揭示開(kāi)發(fā)者群體中存在的興趣遷移,首先對(duì)開(kāi)源項(xiàng)目采用概率主題模型的方法進(jìn)行主題建模,其次對(duì)其中存在的主題順序模式進(jìn)行挖掘從而形成開(kāi)發(fā)者群體的興趣遷移模式.在此基礎(chǔ)上,可以根據(jù)開(kāi)發(fā)者的歷史項(xiàng)目信息預(yù)測(cè)其感興趣的項(xiàng)目,然后結(jié)合開(kāi)發(fā)者的社交關(guān)系及項(xiàng)目流行度這兩項(xiàng)特征對(duì)候選池中的項(xiàng)目做排序進(jìn)而實(shí)現(xiàn)最相關(guān)的前N個(gè)開(kāi)源項(xiàng)目的推薦.
推薦系統(tǒng)已經(jīng)存在了很長(zhǎng)一段時(shí)間了,軟件工程中的推薦系統(tǒng)近年來(lái)也逐漸得到了重視,為開(kāi)發(fā)者推薦開(kāi)源項(xiàng)目也引起了研究者的興趣.
協(xié)同過(guò)濾是推薦系統(tǒng)的重要算法之一,它基于如下假設(shè):如果兩個(gè)用戶執(zhí)行相似的操作,那么他們也更有可能以相同的方式執(zhí)行其他操作.文獻(xiàn)[5]就采用了協(xié)同過(guò)濾的推薦思想,他們根據(jù)開(kāi)發(fā)者行為構(gòu)建了用戶行為矩陣,如果開(kāi)發(fā)者參與過(guò)該項(xiàng)目則評(píng)分為1,否則為0.然后,基于項(xiàng)目協(xié)同過(guò)濾方法進(jìn)行TopN推薦.由于該矩陣的高度稀疏性,其實(shí)際性能不高.
為了揭示什么類型的行為數(shù)據(jù)適合用于項(xiàng)目推薦,文獻(xiàn)[6]中分析了在GitHub開(kāi)源社區(qū)中開(kāi)發(fā)者的多種不同行為,這些行為主要包括了分叉、關(guān)注、問(wèn)題評(píng)論、推拉請(qǐng)求、成員等.在經(jīng)定量和定性的實(shí)驗(yàn)分析后,他們發(fā)現(xiàn)分叉行為適合推薦相關(guān)項(xiàng)目.文獻(xiàn)[7]進(jìn)一步研究了開(kāi)發(fā)者的分叉行為.分叉行為主要用于對(duì)原項(xiàng)目進(jìn)行貢獻(xiàn),調(diào)查結(jié)果顯示42%的開(kāi)發(fā)者表示自動(dòng)化推薦功能能夠有效幫助他們選擇項(xiàng)目進(jìn)行分叉操作;分叉的主要原因是開(kāi)發(fā)者想要修改項(xiàng)目發(fā)起推拉請(qǐng)求并對(duì)項(xiàng)目做貢獻(xiàn);分叉行為不會(huì)產(chǎn)生不正當(dāng)競(jìng)爭(zhēng)以及版本兼容性問(wèn)題.他們的工作為開(kāi)源社區(qū)中的項(xiàng)目個(gè)性化推薦提供了新的見(jiàn)解.文獻(xiàn)[8]采用了一種結(jié)合開(kāi)發(fā)人員行為以及項(xiàng)目特征的推薦方法,從項(xiàng)目所包含的描述文件在內(nèi)的多種不同文件中提取項(xiàng)目特征進(jìn)而構(gòu)建項(xiàng)目相似矩陣,通過(guò)開(kāi)發(fā)者行為構(gòu)建開(kāi)發(fā)者項(xiàng)目關(guān)聯(lián)矩陣,同時(shí)還考慮了開(kāi)發(fā)者反饋來(lái)提高推薦的準(zhǔn)確率.
開(kāi)源項(xiàng)目的內(nèi)容特征也可以用于揭示開(kāi)發(fā)者的興趣.文獻(xiàn)[9]使用了協(xié)同主題回歸的方式即結(jié)合用戶矩陣的傳統(tǒng)協(xié)同過(guò)濾與文本語(yǔ)料庫(kù)上的概率主題建模.文中提到的方法還為開(kāi)發(fā)者和項(xiàng)目提供了高度可解釋的潛在結(jié)構(gòu).文獻(xiàn)[10]考慮了開(kāi)源項(xiàng)目中出現(xiàn)的編程語(yǔ)言、主題和自述文檔,提出了一種混合方法來(lái)生成開(kāi)源項(xiàng)目的推薦,最終的項(xiàng)目相似性為3種不同相似性的線性組合.具體做法是分別構(gòu)建語(yǔ)言向量、主題向量和項(xiàng)目自述文件向量,同時(shí)也為開(kāi)發(fā)者構(gòu)建在這3個(gè)特征上的向量,然后計(jì)算得到最終的項(xiàng)目排序.文獻(xiàn)[11,12]主要關(guān)注項(xiàng)目的描述及源代碼來(lái)推薦開(kāi)源項(xiàng)目,忽略了開(kāi)發(fā)者的個(gè)性化需求.文獻(xiàn)[13]則用到了關(guān)聯(lián)規(guī)則挖掘的思想并結(jié)合了協(xié)同過(guò)濾,使用關(guān)聯(lián)規(guī)則挖掘共同參與的項(xiàng)目,而協(xié)同過(guò)濾被用于確定相似的項(xiàng)目.文獻(xiàn)[14]提出了一種基于深度學(xué)習(xí)的項(xiàng)目推薦方法,采用自動(dòng)編碼器來(lái)學(xué)習(xí)開(kāi)發(fā)者與開(kāi)源項(xiàng)目的向量表示.
不同于上述的工作,本文關(guān)注開(kāi)發(fā)者在參與不同開(kāi)源項(xiàng)目中存在的興趣遷移模式,提出了一種基于項(xiàng)目主題遷移頻繁模式挖掘的推薦算法.
本文提出的算法關(guān)注了開(kāi)發(fā)者參與不同開(kāi)源項(xiàng)目的行為序列,在選擇項(xiàng)目的過(guò)程中會(huì)存在一定的規(guī)律和模式,通過(guò)主題建模的方式將開(kāi)發(fā)者所參與的開(kāi)源項(xiàng)目映射到不同的主題,由此開(kāi)發(fā)者參與的項(xiàng)目序列轉(zhuǎn)化為主題序列;對(duì)不同的主題序列進(jìn)行順序模式挖掘,找到社區(qū)中開(kāi)發(fā)者在選擇項(xiàng)目時(shí)的順序頻繁主題模式;然后用一種打分機(jī)制對(duì)產(chǎn)生的候選項(xiàng)目進(jìn)行打分,具體來(lái)說(shuō)就是融合開(kāi)發(fā)者社交關(guān)聯(lián)和項(xiàng)目流行度對(duì)項(xiàng)目進(jìn)行綜合打分,最后將得分最高的前N個(gè)項(xiàng)目作為最終的推薦結(jié)果.方法框架如圖1所示.
圖1 算法框架Fig.1 Algorithm framework
在該方法中,首先對(duì)開(kāi)源項(xiàng)目的主題進(jìn)行挖掘,將類似的項(xiàng)目映射到同一個(gè)主題.用到的方法是LDA(Latent Dirichlet Allocation)概率主題模型,它是對(duì)文本隱含主題的一種建模方法,其主要功能是將文檔-詞匯矩陣轉(zhuǎn)化成文檔-主題分布和主題-詞匯分布.3層貝葉斯主題模型通過(guò)無(wú)監(jiān)督的學(xué)習(xí)方法發(fā)現(xiàn)文本所含主題,其基本思想就是文檔可以表示成一系列主題的混合分布.LDA模型的生成過(guò)程如圖2所示:1)對(duì)每篇文檔,從主題分布中提取一個(gè)主題;2)從該主題所對(duì)應(yīng)的單詞分布中抽取一個(gè)單詞;3)重復(fù)上述操作,直至遍歷整篇文檔.算法的輸入:分詞后為文檔集,超參數(shù)α,η.算法的輸出為:1)文檔中每個(gè)詞被分配的主題編號(hào);2)文檔的概率概率主題分布;3)每個(gè)主題下詞的概率分布;4)每個(gè)主題下概率從高到低排序的特征詞.
圖2 LDA概率主題生成模型Fig.2 LDA probabilistic topic generation model
圖2中α,η為分布的超參數(shù),θd表示對(duì)于任意文檔d的主題分布,βk對(duì)任意主題k的詞分布,文檔主題的先驗(yàn)分布和主題中詞的先驗(yàn)分布均為Dirichlet分布.Zd,n表示對(duì)文檔d中的第n個(gè)詞在θd下得到的主題編號(hào),wd,n表示在Zd,n主題編號(hào)下詞的概率分布.其中的核心公式如公式(1)所示,公式中以主題t作為中間層,通過(guò)當(dāng)前的θd和βk給出了文檔d中出現(xiàn)單詞w的概率,用θd計(jì)算得到p(t|d),用βk計(jì)算得到p(w|t).
p(w|d)=p(w|t)*p(t|d)
(1)
為了抽取開(kāi)源項(xiàng)目的主題,對(duì)融合了開(kāi)源項(xiàng)目描述、標(biāo)簽和開(kāi)發(fā)語(yǔ)言的文本文檔做基于LDA的概率主題建模,從而將項(xiàng)目對(duì)應(yīng)的文本轉(zhuǎn)化成了若干主題的分布.首先對(duì)文本做預(yù)處理,包括分詞、去除標(biāo)點(diǎn)、去停用詞、詞干還原等;其次,將經(jīng)過(guò)預(yù)處理的文本用TF-IDF做文本向量化,然后進(jìn)行LDA主題建模,輸出項(xiàng)目對(duì)應(yīng)的概率主題分布.
LDA是一個(gè)概率主題模型,為了更多地保留項(xiàng)目的特征信息,本文在選出了每個(gè)項(xiàng)目最貼切的一個(gè)主題的基礎(chǔ)上,設(shè)置了一個(gè)閾值.具體做法是,將項(xiàng)目所對(duì)應(yīng)的多個(gè)主題分布按概率大小做排序保留大于該閾值的主題.如此,一個(gè)項(xiàng)目可能只對(duì)應(yīng)一個(gè)主題,也可能對(duì)應(yīng)多個(gè)主題.
數(shù)據(jù)集中頻繁出現(xiàn)的項(xiàng)集、序列或子結(jié)構(gòu)稱之為頻繁模式,經(jīng)常被用于購(gòu)物籃分析、網(wǎng)頁(yè)日志分析等.本文采用順序頻繁模式挖掘的方法對(duì)項(xiàng)目的主題的序列模式進(jìn)行挖掘.開(kāi)發(fā)者的偏好變化通過(guò)參與項(xiàng)目的行為序列來(lái)凸顯,通過(guò)對(duì)開(kāi)發(fā)者參與項(xiàng)目序列的主題的挖掘可以預(yù)計(jì)開(kāi)發(fā)者在參與了某一主題的項(xiàng)目后會(huì)接著參與哪個(gè)主題對(duì)應(yīng)的項(xiàng)目.
對(duì)開(kāi)源項(xiàng)目完成主題建模后,開(kāi)發(fā)者原本參與項(xiàng)目的行為序列由
圖3 GSP算法流程Fig.3 GSP algorithm flow
挖掘.順序頻繁模式挖掘的主要任務(wù)是找到數(shù)據(jù)庫(kù)中存在的所有順序模式,即在序列集合中出現(xiàn)頻率超過(guò)最小支持度的子序列.常用到的算法是GSP(Generalized Sequential Pattern mining algorithm)[16]算法,該算法增加了掃描過(guò)程中的條件約束包括時(shí)間、滑動(dòng)窗口和分類層次,是一種基于優(yōu)先級(jí)原則的算法,其中用來(lái)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)為哈希樹(shù).算法的輸入是主題序列數(shù)據(jù)、最小支持度閾值,輸出是順序頻繁模式.
GSP算法的主要流程如圖3所示.
但是,本文需要挖掘的序列是由數(shù)量不等的主題構(gòu)成的集合序列.因此,結(jié)合本文所涉及問(wèn)題的特點(diǎn),對(duì)GSP算法進(jìn)行修改.在其基礎(chǔ)上本文提出了GSP-SS(GSP for Set Sequences)算法.在主題建模的過(guò)程中,一個(gè)項(xiàng)目對(duì)應(yīng)了多個(gè)主題,例如項(xiàng)目i,在經(jīng)閾值篩選后它的第1主題為topic52,第2主題為topic16,第3主題為topic44,采用GSP-SS算法在得到順序頻繁模式的同時(shí)也會(huì)得到該頻繁模式所對(duì)應(yīng)的重要度.
GSP-SS算法偽代碼如下:
輸入:項(xiàng)目所對(duì)應(yīng)的主題序列數(shù)據(jù),最小支持度閾值;
輸出:主題順序模式Li及其重要度.
1.C1←init-pass(S);//遍歷輸入數(shù)據(jù)并產(chǎn)生1頻繁模式
2.topicSupportArray=[repo1:[0,0,…,0k1],repo2:[0,0, …,0k2], … ,repon:[0,0,…,0kn].]
//空數(shù)組topicSupportArray保存重要度
3.L1←{<{l}>|l∈C1,Count(l)/n≥min_sup};
//最小支持度閾值的判斷
4.for(i=2,Li-1≠Φ,i++)do
5.Ci←generate-candidate-SPM(Ci-1)
//產(chǎn)生k-頻繁序列模式
6.foreachs∈Sdo
7.foreachc∈Cido
8.ifcis contained insthen
9. Count(c)++;//c的支持度
10.fortopicinc:
11.topicSupportArray[s.index][c′sindexins]++ //每出現(xiàn)一次重要度計(jì)數(shù)加1
12.endfor
13.endfor
14.Li={c∈Ci|Count(c)≥min_sup};
15.endfor
16. sort(topicSupportArray[data sequence index:])
//交換key,value;key填回topic
函數(shù)generate-candidate-SPM(Ci-1)偽代碼如下:
To generateCk//產(chǎn)生大小為k的候選項(xiàng)
1. Join step.
si′=si-1st //-1st,表示去掉第一個(gè)元素項(xiàng)
sj′=sj-Last //-Last,表示去掉最后一個(gè)元素項(xiàng)
ifsi′==sj′do
s←Joinsi′ andsj′ // 做連接操作
2. Prune step
ifany subsequence ofck-1is not infrequent
deleteck-1//做剪枝操作
S為主題序列數(shù)據(jù),Ck為候選k-頻繁序列模式,Lk為候選k-頻繁序列模式.
GSP-SS算法說(shuō)明:對(duì)產(chǎn)生的主題序列S數(shù)據(jù)庫(kù)進(jìn)行掃描,得到長(zhǎng)為1-主題順序模式L1并做最小支持度判斷將其作為初始種子集;對(duì)L1做連接操作并判斷是否滿足最小支持度,產(chǎn)生2-主題順序模式;用L2做連接操作產(chǎn)生3-主題順序模式,其中會(huì)有剪枝操作和最小支持度判斷;然后用3-順序主題模式L3挖掘直到不產(chǎn)生候選項(xiàng).在挖掘的過(guò)程中設(shè)置了數(shù)組topicSupportArray來(lái)存放所挖掘出主題模式的重要度,最后在得到主題順序模式的同時(shí)附帶將其重要度一并輸出.其中完成連接操作和剪切操作的generate-candiate-SPM是該算法的核心.連接階段:對(duì)于兩個(gè)順序模式Si和Sj,如果刪除Si的第一個(gè)項(xiàng)目得到序列與刪掉Sj的最后一個(gè)項(xiàng)目所得序列相同.那么對(duì)Si和Sj做連接操作.剪切階段:對(duì)于任意一個(gè)序列模式,如若它的子序列不是序列模式,那么這個(gè)序列模式就不可能成為序列模式,將其剪切即刪除掉.
3.4.1 開(kāi)發(fā)者社交關(guān)聯(lián)
不同于企業(yè)有組織的軟件開(kāi)發(fā)團(tuán)隊(duì),開(kāi)源軟件團(tuán)隊(duì)具有多樣性和流動(dòng)性,通常以自組織[17]的方式參與到軟件項(xiàng)目開(kāi)發(fā)中.Github開(kāi)源社區(qū)提供了包括@、關(guān)注和評(píng)論等多種方式方便開(kāi)發(fā)人員溝通和交流.
通過(guò)使用關(guān)注功能,開(kāi)發(fā)者能關(guān)注自己感興趣的開(kāi)發(fā)者,關(guān)注開(kāi)發(fā)者能看到他們以往及近期的實(shí)踐工作,了解他們?cè)谙嚓P(guān)領(lǐng)域的貢獻(xiàn)以及研究.通過(guò)評(píng)論功能,開(kāi)發(fā)者們能夠在不同問(wèn)題下展開(kāi)討論進(jìn)而解決問(wèn)題.對(duì)自組織網(wǎng)絡(luò)的研究表明,相較于新的合作,人們更喜歡重復(fù)合作,因?yàn)樗麄冋J(rèn)為這樣的合作往往更有凝聚性.文獻(xiàn)[18]研究了社會(huì)化因素對(duì)GitHub這個(gè)新興生態(tài)系統(tǒng)的影響,包括開(kāi)發(fā)團(tuán)隊(duì)的形成已經(jīng)開(kāi)發(fā)人員的遷移等.其中社交關(guān)系的強(qiáng)度會(huì)影響開(kāi)發(fā)者的選擇,開(kāi)發(fā)人員會(huì)優(yōu)先加入存在社交聯(lián)系的項(xiàng)目.有社交關(guān)聯(lián)的開(kāi)發(fā)者們往往具有類似的興趣點(diǎn),同時(shí)基于先前的互動(dòng)或合作,開(kāi)發(fā)人員對(duì)彼此的技能和社交習(xí)慣都有更多地了解.因此,本文將開(kāi)發(fā)者的社交關(guān)系作為開(kāi)源項(xiàng)目推薦過(guò)程中考慮的因素之一.
GitHub中所提供的項(xiàng)目issue功能是一種輕量級(jí)的協(xié)作系統(tǒng),在issue comment下可以進(jìn)行內(nèi)容豐富的交流,主要針對(duì)問(wèn)題解決、項(xiàng)目存在的Bug和下一項(xiàng)功能的增加等展開(kāi)討論.GitHub定義了pull-request為一種通知機(jī)制即你修改了他人的代碼希望原作者能合并你的修改,用pull-request來(lái)通知作者.它是一種軟件開(kāi)發(fā)合作方式,將不同功能的代碼通過(guò)這一流程納入到項(xiàng)目主干.通過(guò)其自帶的評(píng)論功能對(duì)所提交的修改進(jìn)行討論、測(cè)試并決定是否將其合并.根據(jù)社區(qū)中的參與同一個(gè)issue問(wèn)題評(píng)論、同一個(gè)pull-request評(píng)論來(lái)構(gòu)建每位開(kāi)發(fā)者的社交關(guān)系.對(duì)于開(kāi)發(fā)者u,其候選項(xiàng)目池中的項(xiàng)目i的社交關(guān)系計(jì)算如公式(2)所示:
Social(u,i)=n(uinteract)
(2)
其中n(uinteract)表示在項(xiàng)目i中與之有過(guò)互動(dòng)的開(kāi)發(fā)者數(shù)量.
3.4.2 項(xiàng)目流行度
在開(kāi)源社區(qū)中,也存在“馬太效應(yīng)”,相比于那些冷門的項(xiàng)目,活躍的、受關(guān)注度高的開(kāi)源項(xiàng)目更容易吸引開(kāi)發(fā)者.在每個(gè)GitHub項(xiàng)目頁(yè)面的右上方有watch、star、fork這3個(gè)不同的按鈕.其中的star更像是“點(diǎn)贊”,因此本文選擇了關(guān)注和分叉的數(shù)量來(lái)評(píng)價(jià)一個(gè)項(xiàng)目的流行與否.
Watch(關(guān)注)的數(shù)量,對(duì)于他人的項(xiàng)目默認(rèn)都是Not watching的狀態(tài),當(dāng)開(kāi)發(fā)者對(duì)該項(xiàng)目感興趣時(shí)就能選擇關(guān)注該項(xiàng)目的所有動(dòng)態(tài),例如該項(xiàng)目有開(kāi)發(fā)者提交pull request、提出了issue等,便能從系統(tǒng)推送中了解該項(xiàng)目發(fā)生的一切動(dòng)態(tài)變化.所以項(xiàng)目擁有的關(guān)注者數(shù)量能反應(yīng)其受用戶關(guān)注程度.
Fork(分叉)的數(shù)量,當(dāng)你有了對(duì)一個(gè)項(xiàng)目做貢獻(xiàn)的想法包括增加新功能、漏洞修復(fù)或者在該項(xiàng)目的基礎(chǔ)上開(kāi)發(fā)一個(gè)自己的版本,可以點(diǎn)擊fork按鈕得到一份原項(xiàng)目的副本.
結(jié)合關(guān)注和分叉這兩者的數(shù)量來(lái)計(jì)算項(xiàng)目的流行度,對(duì)兩者者的數(shù)量歸一化后進(jìn)行求和.對(duì)于項(xiàng)目i的流行度,計(jì)算公式如公式(3)所示:
pop(i)=nor(n(iwatch))+nor(n(ifork))
(3)
其中n(iwatch)表示項(xiàng)目i關(guān)注者的數(shù)量,n(ifork)表示項(xiàng)目i分叉者的數(shù)量,nor()表示歸一化計(jì)算函數(shù).
通過(guò)概率主題建模的方法將開(kāi)發(fā)者參與的開(kāi)源項(xiàng)目映射成主題序列,將訓(xùn)練集中的開(kāi)發(fā)者參與主題序列事務(wù)集記作C={C1,C2,C3,…,Cu}其中u為開(kāi)發(fā)者人數(shù),Cu表示開(kāi)發(fā)者參與項(xiàng)目經(jīng)過(guò)主題泛化后得到的主題序列.將主題順序模式記作P,min_supp是最小支持度閾值,當(dāng)模式P的支持度大于min_supp則P為順序主題模式.采用GSP-SS算法對(duì)順序主題序列模式做挖掘,將開(kāi)發(fā)者參與的主題序列事物集作為GSP-SS算法的輸入,設(shè)置min_supp,運(yùn)行GSP-SS程序輸出主題頻繁順序模式項(xiàng),記作P={P1,P2,P3,…,Pj}其中j為產(chǎn)生的模式數(shù)量.
采用一個(gè)多叉樹(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)主題模式與模式庫(kù)中的模式項(xiàng)的對(duì)應(yīng)關(guān)系.將模式的候選集記作H={HP1,HP2,HP3, …,HPj}.
對(duì)于測(cè)試集中的數(shù)據(jù),給定開(kāi)發(fā)者參與的歷史項(xiàng)目
S(u,ri)=α*nor(pop(i))+(1-α)*nor(social(u,i))
(4)
其中pop(i)表示項(xiàng)目的流行度,social(u,i)表示社交關(guān)聯(lián)度,α表示權(quán)重參數(shù),nor()表示歸一化函數(shù).
算法描述如下:
輸入:開(kāi)發(fā)者參與的歷史項(xiàng)目集合X,順序模式P;
輸出:Top-N推薦項(xiàng)目列表.
1.使用LDA主題模型將X轉(zhuǎn)化為C={C1,C2,C3,…,Cu};
2.forj=1 tojdo
3.foreachCu∈Cdo
4.ifPjinCudo
5.Pj在Cu中的末尾位置記作l,從X中的第l+1個(gè)位置得到ri
6.endif
7.endfor
8.H←H∪HPj
9.endfor
10.用公式(4)為H中的項(xiàng)目打分并做降序排序
11.returnTop-N 推薦項(xiàng)目列表
本文使用的數(shù)據(jù)集是從GHTorrent[15]中轉(zhuǎn)儲(chǔ)得到的,GHTorrent項(xiàng)目提供了GitHub 的API數(shù)據(jù)的鏡像,可以離線查詢.它旨在用于與軟件存儲(chǔ)倉(cāng)庫(kù)有關(guān)的研究與發(fā)現(xiàn).本文選取了2016-2018年間的數(shù)據(jù),為了讓實(shí)驗(yàn)數(shù)據(jù)更具有代表性,篩選出的開(kāi)發(fā)者和開(kāi)源項(xiàng)目滿足如下條件:1)開(kāi)發(fā)者至少參與了5個(gè)不同的開(kāi)源項(xiàng)目;2)與其他開(kāi)發(fā)者有過(guò)互動(dòng)即在同一個(gè)問(wèn)題或推拉請(qǐng)求下有過(guò)討論;3)開(kāi)源項(xiàng)目為原始項(xiàng)目即不是從其他項(xiàng)目分叉而來(lái);4)開(kāi)源項(xiàng)目至少有5名開(kāi)發(fā)者參與過(guò).開(kāi)發(fā)者參與項(xiàng)目數(shù)據(jù)格式如:開(kāi)發(fā)者編號(hào)-項(xiàng)目編號(hào)-時(shí)間戳.開(kāi)源項(xiàng)目信息包含:項(xiàng)目編號(hào)、項(xiàng)目開(kāi)發(fā)語(yǔ)言、項(xiàng)目描述和項(xiàng)目標(biāo)簽.經(jīng)篩選后得到了開(kāi)發(fā)者數(shù)量18399個(gè),開(kāi)源項(xiàng)目數(shù)量23076個(gè).根據(jù)開(kāi)發(fā)者參與項(xiàng)目的時(shí)間戳的先后順序來(lái)創(chuàng)建開(kāi)發(fā)者參與項(xiàng)目序列數(shù)據(jù),根據(jù)項(xiàng)目開(kāi)發(fā)語(yǔ)言、項(xiàng)目描述和項(xiàng)目標(biāo)簽來(lái)創(chuàng)建項(xiàng)目文檔數(shù)據(jù)用作主題建模.
關(guān)于訓(xùn)練集和測(cè)試集的劃分.本文將開(kāi)發(fā)者近一年參與的項(xiàng)目作為測(cè)試集用作實(shí)驗(yàn)的預(yù)測(cè)數(shù)據(jù),剩余的其他數(shù)據(jù)用作實(shí)驗(yàn)?zāi)P偷挠?xùn)練數(shù)據(jù).
考慮到本文的推薦場(chǎng)景為Top-N的前N個(gè)項(xiàng)目的推薦即向開(kāi)發(fā)者提供一個(gè)推薦的列表讓其進(jìn)行選擇,故采用了召回率Recall來(lái)評(píng)價(jià)所提算法的推薦效果.召回率表示用戶感興趣的項(xiàng)目被推薦系統(tǒng)成功推薦的概率,計(jì)算公式如公式(5)所示:
(5)
其中R(u)為根據(jù)開(kāi)發(fā)者u在訓(xùn)練集上的表現(xiàn)向其推薦的項(xiàng)目集,T(u)為開(kāi)發(fā)者u在測(cè)試集上參與過(guò)的項(xiàng)目集.
本文選擇了3種常見(jiàn)的推薦算法作為對(duì)比方法.
1)基于項(xiàng)目流行度的推薦方法,該方法圍繞項(xiàng)目“熱度”展開(kāi),將對(duì)用戶有著強(qiáng)吸引力的項(xiàng)目推薦給其他開(kāi)發(fā)者.采用這一方法做推薦的主要工作就是計(jì)算每個(gè)項(xiàng)目的流行度,推薦列表為開(kāi)發(fā)者未曾參與過(guò)的流行的Top-N個(gè)開(kāi)源項(xiàng)目;
2)基于用戶的協(xié)同過(guò)濾推薦[19],這個(gè)算法通常分為兩個(gè)步驟,首先找到與目標(biāo)開(kāi)發(fā)者相似的若干開(kāi)發(fā)者,然后將這個(gè)集合中開(kāi)發(fā)者參與過(guò)的但目標(biāo)開(kāi)發(fā)者未曾參與的項(xiàng)目作為推薦列表.設(shè)置最相似的開(kāi)發(fā)者數(shù)量K=20,相似度計(jì)算采用余弦相似性;
3)基于內(nèi)容的推薦算法,根據(jù)開(kāi)發(fā)者做過(guò)的項(xiàng)目描述、開(kāi)發(fā)語(yǔ)言及標(biāo)簽來(lái)推薦類似的開(kāi)源項(xiàng)目,采用文本處理方法:詞頻-逆文檔頻率(TF-IDF)將文本向量化隨后計(jì)算項(xiàng)目之間的余弦相似度,推薦列為與其最相似的Top-N個(gè)項(xiàng)目.
本文所提推薦的推薦算法,將主題個(gè)數(shù)K設(shè)置為90,主題模式挖掘中的最小支持度min_supp設(shè)置為5.
不同推薦方法下實(shí)驗(yàn)結(jié)果如表1所示,采用的評(píng)價(jià)方法為召回率.
表1 實(shí)驗(yàn)結(jié)果表Table 1 Experiment resultTable
開(kāi)發(fā)者社交特征及項(xiàng)目流行度建模中的公式(4),不同α的取值對(duì)推薦結(jié)果的影響如圖4所示.實(shí)驗(yàn)中本文將α值設(shè)置為0.3.
圖4 α的取值對(duì)推薦結(jié)果的影響Fig.4 Value of α versus the recommended result
實(shí)驗(yàn)結(jié)果表明,當(dāng)推薦項(xiàng)目數(shù)量N值增大的時(shí)候,四種不同推薦方法的召回率均逐漸增大,說(shuō)明在推薦列表中開(kāi)發(fā)者感興趣的項(xiàng)目數(shù)量增多了.本文提出的基于主題模式挖掘的推薦方法在召回率上優(yōu)于其余3種對(duì)比方法,對(duì)項(xiàng)目的主題模式挖掘考慮到了開(kāi)源項(xiàng)目的內(nèi)容特征,引入的評(píng)分機(jī)制兼顧了開(kāi)發(fā)者的社交情況以及項(xiàng)目自身的流行度特點(diǎn),進(jìn)而提高了推薦效果.
近年來(lái),分布式軟件開(kāi)發(fā)與社交化編程得到了人們的廣泛認(rèn)可,GitHub開(kāi)源社區(qū)更是引領(lǐng)了新的開(kāi)源文化.GitHub“去中心化”的開(kāi)源模式,不斷彰顯和強(qiáng)調(diào)作為個(gè)體的開(kāi)發(fā)者的作用,鼓勵(lì)他們對(duì)他人的項(xiàng)目做修復(fù)和改進(jìn).開(kāi)源社區(qū)的壯大也使得開(kāi)源項(xiàng)目的數(shù)量大幅增加,開(kāi)源項(xiàng)目推薦系統(tǒng)能幫助開(kāi)發(fā)者找到他們有意愿參與的項(xiàng)目.
本文提出了一種基于項(xiàng)目主題模式挖掘的推薦方法,關(guān)注了開(kāi)發(fā)者在項(xiàng)目遷移過(guò)程中存在的規(guī)律,用開(kāi)源項(xiàng)目的內(nèi)容特征為項(xiàng)目進(jìn)行主題建模,開(kāi)發(fā)者參與項(xiàng)目的項(xiàng)目序列轉(zhuǎn)化為主題序列;隨后對(duì)其中存在的主題順序模式進(jìn)行挖掘;接著融合開(kāi)發(fā)者的社交關(guān)聯(lián)和項(xiàng)目自身的流行度這兩個(gè)特點(diǎn)實(shí)現(xiàn)了Top-N個(gè)開(kāi)源項(xiàng)目推薦;最后在實(shí)驗(yàn)數(shù)據(jù)集上與傳統(tǒng)推薦方法進(jìn)行對(duì)比,推薦效果得到了有效的提升.未來(lái)的工作可以關(guān)注對(duì)項(xiàng)目的主題建模和開(kāi)發(fā)者在項(xiàng)目遷移過(guò)程中是選擇下一個(gè)項(xiàng)目的其他因素,考慮更多的文本內(nèi)容比如代碼所蘊(yùn)含的注釋、函數(shù)名等,有助于提高項(xiàng)目與主題的契合程度.