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
******************************************/
Ospaf项目-commits词频统计模块,布布扣,bubuko.com
时间: 2024-10-09 11:08:14