该项目仅包含评审结果预测的算法部分,主要为src
文件夹下的内容。项目已上传至GitHub,可以fork到本地进行修改。已经删除了很多无用代码。
DLPP
front 主要为原型系统的前端代码,使用
vue.js
github 主要为原型系统的后端代码,使用Spring Boot
JAVA 利用WEKA
实现的gousios方法(已废弃)
spider 利用scrapy
实现的爬虫
src 核心代码部分anova 计算单方差检验时生成的数据文件(不重要)
ayonel PRPredict的核心代码feature_calculate 计算特征
1-cal_attributes.py 计算第一批属性,使用insert入库
1-cal_attributes_addition.py 计算另一批属性,使用update入库
1-cal_attributes_addition.py 计算相似度属性,使用update入库
feature_selection_data 存放特征选择后数据文件
tuning_deprecate 对xgboost和randomforest进行调参,将调参结果入库(可以视为废弃)
clf.py 核心分类文件 clf-parameter 特征选择文件 LoadData 数据加载文件
database 封装数据库相关代码
eval 封装评估工具方法
gousios GPredict相关代码,包括特征计算以及算法实现,算法部分与*clf.py*类似
preprocess 爬虫将数据入库后,做的一些预处理工作,包括添加月份字段,对文本分词等
stat 一些零碎的统计代码和数据 (不重要)
constants.py 一些常量定义
utils.py 封装一些工具
从上可看出最终要的PRPredict的实现最重要的两个核心文件分别为clf.py
、LoadData.py
整体流程为,先利用spider中的代码爬取相关数据,并存入本地MongoDB,接下来做一些清洗验证及预处理工作;之后进行属性计算,并把计算好的属性也存入MongoDB, PRPredict运行时,先从MongoDB中获取pr数据,并拿到计算好的特征数据,再进行分类计算。爬虫及预处理工作已经完成,可以不动。
如果要跑PRPredict,只需要运行clf.py
文件的main方法,并根据需求传入不同的参数,代码中已做了详细注释。main方法调用run_monthly方法,该方法为核心部分。
run_monthly一运行,首先会调用LoadData.py中的load_data_monthly方法加载整个数据集,并返回data_dict(这是一个字典,键是组织名,值为每个组织数据集的迭代器)以及pullinfo_list_dict(这也是一个字典,键为组织名,职位每个组织的所有pr列表)
之后对每个项目分别进行计算,并在计算完成后在console中打印结果。计算方法为,首先拿到第一轮的数据作为训练集,然后在迭代器中不断的生成下一批数据作为预测集,
并利用训练好的模型进行预测,预测完成后将测试集加入训练集,并重新训练模型。
ayonel_numerical_attr 是输入的数值特征,ayonel_boolean_attr是输入的所有bool特征,如果需要更改特征,只需要更改这两个列表,重新跑即可。
DLPP的MondoDB开在localhost的27017端口(默认端口),而决策者推荐(IREC)则开在localhost的27018端口。如果要开启DLPP的数据库,只需要以管理员权限运行cmd,
之后输入net start MongoDB
即可。如果要开启IREC的数据库,在cmd中输入mongod --dbpath=F:/mongodb2/data --port=27018
即可,为简单起见,我对
IREC的数据开启方法封装在了IREC的database中的dbutil的主方法中,只需要运行这个方法即可。MongoDB的管理工具使用robomongo
DLPP的每个项目为一个数据库,库名为组织名称,每个库中有12个表,描述如下:
- ayonel 为计算出的特征,每个pr的所有特征作为一条记录
- commit 为爬取的commit信息,每个commit作为一条记录
- commitfile 为爬取的commit的文件信息,每个文件作为一条记录,因此多条记录可能属于同一个commit
- gousios 为计算出的gousios的特征,每个pr的所有特征作为一条记录
- model 调参时保存的参数信息,每个轮次为一条记录,其中model字段代表是xgboost还是randomforest(可以视为废弃)
- pullcomment 为爬取的pr的评论信息,每条评论作为一条记录,因此多条记录可能属于同一个pr
- pullcommit 为爬取的pr的commit信息,每条commit作为一条记录,因此多条记录可能属于同一个pr
- pullfile 为爬取的pr的文件信息,每个文件作为一条记录,因此多条记录可能属于同一个pr
- pullinfo 为爬取的pr的基本信息,一条pr为一条记录
- result (可以视为废弃)
- reviewer 项目的决策者(核心成员),一个决策者为一条记录
- stat 项目的一些统计(可以视为废弃)
对于需要连接数据库的方法,我封装了mongo装饰器,只需要在需要的方法前加上@mongo注解即可,在方法定义时传入一个client变量,调用时可不用传。
对于要入库的代码,一定要检查仔细,确保入库的结果是正确的,否则会花费很大的精力修改
为了论文的写作规范,论文中的一些特征命名与库中不一致,主要是:
is_reviewer-----> is_reviewer_commit
file_changes-----> files_changes
history_author_pr_num----->history_commit_num
history_author_pass_pr_num----->history_pass_pr_num
history_author_passrate----->history_commit_passrate
history_author_review_time----->history_commit_review_time
ayonel表中的一些属性是由gousios表中迁移过来的,迁移的属性为gousios的输入