首页 > 代码库 > Ospaf项目-commits词频统计模块

Ospaf项目-commits词频统计模块

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

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