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
******************************************/