AI基于深度学习的代码搜索案例(一)

1. 背景

近年来,人工智能逐渐进入各个领域并展现出了强大的能力。在计算机视觉领域,以ImageNet为例,计算机的图像分类水平已经超过了人类。在自然语言处理(NLP)领域,BERT、XLNet以及MASS也一遍遍的刷新着任务榜单。当人工智能进入游戏领域,也取得了惊人的成绩,在Atari系列游戏中,计算机很容易超过了大部分人类,在围棋比赛中,Alpha Go和Alpha Zero也已经超越了人类顶尖棋手。

随着近年来人工智能的自然语言处理(Natural Language Processing, NLP)技术在拼写检查、机器翻译、语义分析和问答方面的快速发展及广泛应用,人们期望可以从大型代码库(如GitHub)中发现类似于自然语言的模式,并利用相关技术来辅助程序员高效地编写无错代码。程序代码是一系列的语法记号,虽然看起来很像人类自然语言编写的文本,但是和人类文本有一些显著区别。比如程序代码是可执行的,在语义上常常很脆弱,很小的改动就能彻底改变代码的含义,而自然语言中如果出现个别错误可能也不会影响人们的理解。这些差异给我们直接应用现有的NLP技术带来了挑战,因此需要一些新的方法来处理程序代码。

人工智能在程序语言(Programming Language,PL)/软件工程(Software Engineering ,SE)领域可以有很多现实的应用,如语义搜索、代码补全(完形填空)、自动生成单元测试、代码翻译、代码缺陷检测、代码转文本、自然语言生成代码等。这里面有的方向是很有难度的,如自然语言自动产生代码,需要理解自然语言并按要求产生可用的代码,但是我们可以尝试先从简单的任务开始做些挑战。

我们选择“代码搜索(Code Search)”作为案例:接收用户的自然语言查询语句,在预定义代码集中找到符合用户需求的代码片段返回给用户。这个任务非常有意义。

当程序员遇到不熟悉的编程语言或问题时,通常会在网上查询相关的代码作为参考。

传统的代码搜索,比如GitHub,通常是以关键字进行匹配的,也就是说用户需要知道代码中用到了哪些API,或者明确的知道代码中写了哪些注释,才有可能搜索到理想的结果。

但是实际情况很可能是程序员知道要做一件什么事,但是不知道用哪些API,不知道怎么实现,这时,我们通常会使用通用搜索引擎(Google/Bing/百度等),它们是通过代码及其配对的说明(如网页中的介绍、注释中的文本、某些函数名或者库的名称)与搜索语句之间文本的匹配程度进行的。这样搜索到的结果比较局限,只能通过文本上的匹配来确定是否是相同的含义。另外,这些引擎返回的是一系列的网页,需要用户依次打开进行二次挖掘。

StackOverflow是专业性的网站,表现的比通用搜索引擎好一些,虽然可以使用自然语言进行查询,但问题的相关解答中可能并不包含程序员所需的代码信息,需要用户自已进行二次深挖。

我们期望的Code Search是一种新的代码搜索方式,首先获取自然语言的语义,与所有已经搜集到的代码的语义进行比较,找到语义上最接近的结果,这样就可以极大地提高程序员的生产效率。

2. 开发环境

本案例可以在WindowsUbuntu平台上运行,需要安装Python 3.6或以上的环境。

需要安装的依赖包在requirements.txt中,可以通过执行以下命令来安装

pip install -r src/requirements.txt

有的机器可能会提示torch安装失败,可以尝试下面的命令来安装

pip install torch===1.2.0 -f https://download.pytorch.org/whl/torch_stable.html

或者前往PyTorch官网,根据自己的环境定制合适的安装命令。

数据处理时用到了spacy库里的en_core_web_lg数据集,需要单独下载,可执行以下命令

python -m spacy download en_core_web_lg

部分安装包比较大,如果网速较慢,需要耐心等待。

训练时可以使用CPU来训练,但是速度太慢。

有条件的话尽量使用GPU来训练,也可以考虑付费使用Azure N系列 虚拟机,有多种规格GPU可以选择。在校学生还可以申请Azure学生账号,可按照如何申请Azure的学生账号来操作。

3. 准备数据

我们尝试在网上寻找现成的数据集,但是并没有找到合适的;同时,GitHub是世界上最大的开源社区,拥有庞大的源代码数据,因此我们决定自己写爬虫爬取GitHub上的源代码来准备训练数据。

Python是目前最火的语言,本案例也以Python语言的代码搜索为例进行介绍和实战。

3.1 确定要爬取的代码仓库

GitHub上的代码是按仓库进行存放的,而且代码的好坏可以由仓库的star数量直观的反映出来,所以我们考虑对 star数比较高的GitHub仓库列表爬取。

GitHub上可以按照代码star数对搜索结果进行排序,排序后爬取的结果最多只有1000个仓库(如果直接从网页上获取,是每页10个,一共100页;如果直接调用api,不论设置每页多少条总共只会返回前1000个)。

对GitHub高星仓库列表的爬取,可以有2种方法:

1. 爬GitHub仓库搜索页

直接用requests或者selenium发送请求的方式进行爬取GitHub搜索结果页面,GitHub搜索仓库的结果页面是:

https://github.com/search?l=Python&o=desc&p=1&q=python

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值