深度学习案例教程 教案8.5代码搜索数据预处理.docx
05代码搜索数据预处理
(p24)同学本大家好,本节课我们来学习代码搜索任务中的数据准备工作。
对于本任务,没有较好的现成数据集,所以需要自己来准备数据集,网上是有很多的开源代码,所以我们可以自己下载来准备数据集。而对应的描述,也就是自然语言对这个代码的表述,一般在编写函数的时候,开发者会在函数里面有注释,所以要我们也需要找一些开发的比较规范的代码。
GitHub是世界上最大的开源社区,拥有庞大的源代码数据,因此我们需要自己写爬虫爬取GitHub上的源代码来准备训练数据。Python是目前最火的语言,本案例也以Python语言的代码搜索为例进行介绍和实战。
GitHub上的代码是按仓库进行存放的,而且代码的好坏可以由仓库的star星星数量直观的反映出来,所以我们考虑对星星数比较高的GitHub仓库列表进行爬取。
GitHub上可以按照代码星星数对搜索结果进行排序,排序后爬取的结果最多只有1000个仓库。如果直接从网页上获取,是每页10个,一共100页;如果直接调用api,不论设置每页多少条总共只会返回前1000个。
对GitHub高星仓库列表的爬取,可以有2种方法
第一种:爬GitHub仓库搜索页。直接用requests模块发送请求的方式进行爬取GitHub搜索结果页面。我们看一下github网站上的搜索链接。
其中,l表示要查询的代码的语言,我们可以是Python或Java等
p指定显示第多少页的结果,当前等于1,就是在第一页
q表示要查询的内容,实际操作中发现,查询的内容直接填语言的名字时,效果比较好
S表示如何排序,这里s=star,表示按星星数从高向低排序
type指定要搜索的类型,这里表示搜索的类型是仓库
发送请求后返回的数据为html页面的内容,需要对页面进行分析,按照需要提取出仓库列表。同时,由于GitHub的反爬虫机制比较严格,我们在爬取时还要采取一些反爬虫的策略,如随机间隔一段时间后重新爬取
第二种方法是使用GitHub官方API,下面这个是查找代码仓库的API示例。
其中,q表示要查询的内容
language表示要查询的代码的语言,我们可以设置为Python
sort表示如何排序,我按照star排序,让他等于star
page指定显示第多少页的结果。
另外,除了直接在GitHub上搜索高星项目外,还可以通过对应语言的包管理器来查找质量比较好的仓库,如Python的numpy包、pandas包等,感兴趣的同学可以自己收集。
(p25)在收集到我们想要的GitHub仓库列表后,对数据进行下载和初步筛选是很重要的一步。
可以使用git工具进行直接进行克隆。操作步骤如下:
第一步将数据clone下来,这一步中可以设置--depth=1参数来指定不拉取历史记录,这样可以减小下载量。
使用checkout文件来配置需要保留哪些文件在本地,对Python来说,可以配置保留py文件即可。
下一步,获取仓库的commitid信息,并且将仓库中剩余的文件移动到以commitid为目录的路径下,保留commitid可以让我们更好的追溯到代码的来源。
注意:数据集越大,训练时间越长,如果没有GPU资源,可以适当删减一些代码仓库,减小数据集的大小以加速训练,当然这样也会影响到模型训练的精度。
(p26)下载完了数据以后,我们就需要对数据进行预处理。
我们需要将数据集处理成模型需要的格式,主要分为以下四步,
第一步抽取方法名、API序列、标识符、描述等信息,这一步主要借助astor包来处理Python代码,它可将代码解析为抽象语法树,这样程序可以直接访问结构化的数据,很方便的取到代码中的函数、描述、方法名等信息。然后将抽取到的每个函数的信息写入到CSV文件中,每行代表一个函数。每行都有函数所在的本地文件路径、GitHub链接、函数开始所在行号、方法名、API序列、标识符、描述等信息。
(p27)那第二步就是数据清洗,这一步我们进一步处理上一步得到的数据并做清洗。
首先,对于方法名,如果方法名过短(少于3个字母),我们认为这是无意义的数据,舍弃掉;一般函数取名都会相对较长,不然可能会重名了,就算是加法函数,add也是3个字母组成的,比3个字母少的函数,我们就不要了。还有些函数,比如初始化函数__init__,前后还带两个下划线的这一类函数,也舍弃掉,因为这一类是特殊函数,可能不会包含开发者定义的逻辑;另外,我们还需要对方法名按进行分割,得到一个类似于句子的序列,比如,一个读取文件的函数名可能会叫做readFile中间没有空格或read_file中间是下划线,需要处理为read空格file,因为python命名中,是不可以出现空格的,但是英文语句都是空格区分的,所以这一步是必须要做的。
然后,如果一个描述为多行文本,也就是函数里面开