Ospaf專案-commits詞頻統計模組

李博Garvin發表於2014-08-15

1.背景

         最近在搞得ospaf專案(可以移步ospaf中期報告來了解),對於commits資料進行特徵提取的時候發現,因為開源專案的commits的特點有以下兩個主要放面:1.動詞往往出現在第一個字,例如add、revert之類的。2.動詞相對固定,主要也就是那幾種,add、revert、update、merge、remove之類的。
         所以要做的工作就比較清晰了。
          步驟1.首先是提取每個commit第一個字母
          步驟2.因為每個專案有很多contributor,所以大家習慣的寫法也不一樣,如add,有的人會寫成Add、added、Added之類的。

2.演算法與程式碼

        1.同型單詞的識別

                   針對與上述的步驟2,也就是同形單詞的識別問題。我想到了一個演算法(大家有更好的請留言指教),比如單詞A和B。首先將A和B都轉換成小寫a、b,然後找到a和b中較短的單詞,這個較短的單詞長k=min(len(a,b)),如果k是偶數取distance=k/2,如果k是奇數distance=k/2+1。接著將a和b按字母分割,如果a和b的前distance個字母相同,說明A和B同型。這個演算法雖然不夠精準,但是在ospaf專案是夠用了。程式碼如下,如果a=b,返回1。否則返回0
def WordCompare(a,b):
    a_low=a.lower()
    b_low=b.lower()
    a_length=len(a_low)
    b_length=len(b_low)
    distance=min(a_length,b_length)   
    if distance%2 ==0:
        distance_cop=distance/2
    else:
        distance_cop=distance/2+1    
    for i in range(0,distance_cop):
        if a_low[i]==b_low[i]:
              continue
        else:
              return 0
              break   
    return 1

        2.記錄詞頻

                    首先有一個單詞庫KeyWords負責統計需要記錄的單詞,commit是樣例:
'''
compare the different word
@author: Garvin
'''
KeyWords=['add','remove','update']
commite=['Added testh ','removed fae gew','update cewf','add cek','get tawge']

def WordCompare(a,b):
    a_low=a.lower()
    b_low=b.lower()
    a_length=len(a_low)
    b_length=len(b_low)
    distance=min(a_length,b_length)   
    if distance%2 ==0:
        distance_cop=distance/2
    else:
        distance_cop=distance/2+1    
    for i in range(0,distance_cop):
        if a_low[i]==b_low[i]:
              continue
        else:
              return 0
              break   
    return 1

def GetKeyWordFreq(KeyWords,commits):
     WordFreqDic={}
     for i in KeyWords:
        WordFreqDic[i]=0
     for j in commite:
#         j.split()[0] 
        for key in WordFreqDic.keys():
            if  WordCompare(j.split()[0],key)==1:
                 WordFreqDic[key]=WordFreqDic[key]+1
     return WordFreqDic

          
    
if __name__=='__main__':
      print GetKeyWordFreq(KeyWords,commite)
#     print WordCompare('commited','commit')


結果如下:







/********************************

* 本文來自部落格  “李博Garvin“

* 轉載請標明出處:http://blog.csdn.net/buptgshengod

******************************************/







相關文章