【ASE模型组】Hint::neural 模型与case study
模型
基于搜索的提示系统
我们的系统用Pycee针对语法错误给出提示。然而,对于语法正确、结果错误的代码,我们需要另外的解决方式。因此,我们维护一些 (错误代码, 相应提示) 的数据,该数据可以由我们预先给定,也会在网站运行过程中请用户标注。当用户出现错误时,搜索与用户错误代码相似的已有错误代码,并给出相应提示。
为了计算代码之间的相似度,我们需要采用code embedding技术,即将一段代码编码为高维空间中的向量。
CodeSearchNet
今年,GitHub和Weights&Biases携手推出了一项新赛事 CodeSearchNet,旨在推动语义代码搜索的相关研究。CodeSearchNet语料库的数据取自GitHub上的开源项目,经过了充分的预处理。其中包含了约600万种函数,取自Go,Java,JavaScript,PHP,Python和Ruby这六种编程语言的开源代码,以及大量用于查询的自然语言及其标注。其中,用于查询的自然语言获取自Bing搜索引擎的常见搜索语句,标注由专家人工标注所得。
为了更好地评判不同的code searching方法,CodeSearchNet还公开了baseline模型代码 repo,并设立了leaderboard,其中包含大量预训练模型。因此,我们可以采用表现良好的预训练模型对代码计算embedding,从而计算相似度并进行匹配。
Baseline模型
Baseline模型包含code encoder \(E_c\)与query encoder \(E_q\)两部分,将代码与查询文本投射到同一个高维向量空间中。
训练过程中,训练数据包括大量code and text pair: \((c_i, q_i)\)。通过最大化\(E_c(c_i)\)与\(E_q(q_i)\)的余弦相似度,使得代码\(c_i\)与文本\(q_i\)的embedding尽可能相似。
Code Encoder
由于我们只使用code encoder部分,因此下面只讲解code encoder。
首先,模型将代码转换为token序列。为了避免空格、空白换行等问题对tokenize产生影响,模型利用parso]()解析代码的AST,并遍历AST、将各个叶子结点对应的值结合为token序列。如下列代码:
n = int(input())
d = dict()
for i in range(1, n + 1):
d[i] = i*i
print(d)
被tokenize为如下序列:'n', '=', 'int', '(', 'input', '(', ')', ')', 'd', '=', 'dict', '(', ')', 'for', 'i', 'in', 'range', '(', '1', ',', 'n', '+', '1', ')', ':', 'd', '[', 'i', ']', '=', 'i', '*', 'i', 'print', '(', 'd', ')';token序列经过BPE编码得到BPE code序列。
接着,模型对序列中的每个BPE code计算一个embedding。Embedding计算方法包括:
- Neural Bag of Words:每个BPE code被投影到一个embedding上
- Bidirectional RNN
- 1D Convolutional Neural Network
- Self-Attention:使用multi-head attention
最后,通过pooling方式将embedding序列合并为一个embedding;可用的pooling方法包括max / mean pooling与weighted sum pooling。
我们使用的模型为leaderboard第一个模型,即Neural Bag of Words + weighted sum pooling。我们用模型的code encoder计算用户错误代码embedding \(\vec{x}\)与已有错误代码的embedding \(\vec{c}_i, i=1,2,...,N\),选择与用户错误代码cosine similarity最大的已有错误代码,返回相应提示。
Case study
Code Embedding
模型的vocabulary大小为10000,其中包括5000个单词和5000个BPE code。计算vocabulary中,部分单词之间cosine similarity如下:
| word 1 | word 2 | cosine similarity |
|---|---|---|
| for | while | 0.1801 |
| try | except | 0.1785 |
| open | while | -0.2296 |
可以看出,含义相似的单词(如for和while都表示循环)embedding较为相似。而try、except虽然含义不相似,但功能十分相关,因此相似度也较高。而基本无关的单词(如open和while)相似度很低。
代码相似度计算
考虑以下四段代码,分别为题目的正确解法1、正确解法2、与解法2类似的错误3、与错误3相同的错误4.计算其两两cosine similarity:
def fact(x):
if x == 0:
return 1
return x * fact(x - 1)
x = int(input())
print(fact(x))
x = int(input())
out = 1
for xx in range(1, x + 1):
out *= xx
print(out)
x = input()
out = 1
for xx in range(1, x + 1):
out *= xx
print(out)
inp = input()
out = 1
for i in range(1, inp + 1):
out *= i
print(out)
计算得cosine similarity如下:
| code 1 | code 2 | code 3 | code 4 | |
|---|---|---|---|---|
| code 1 | - | 0.9854 | 0.9835 | 0.9716 |
| code 2 | - | - | 0.9995 | 0.9861 |
| code 3 | - | - | - | 0.9859 |
| code 4 | - | - | - | - |
由于各个代码片段较短,各个code embedding都比较相似。
【ASE模型组】Hint::neural 模型与case study的更多相关文章
- Detection of Glacier Calving Margins with Convolutional Neural Networks: A Case Study
利用Unet结构对landsat数据进行冰川裂缝提取,结构如下:训练集很小只有123张152*240图片
- 吴恩达《深度学习》-第五门课 序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks) -课程笔记
第一周 循环序列模型(Recurrent Neural Networks) 1.1 为什么选择序列模型?(Why Sequence Models?) 1.2 数学符号(Notation) 这个输入数据 ...
- 从信用卡欺诈模型看不平衡数据分类(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RF、xgboost、神经网络能够取得非常不错的效果。(2)模型层面:使用模型集成,样本不做处理,将各个模型进行特征选择、参数调优后进行集成,通常也能够取得不错的结果。(3)其他方法:偶尔可以使用异常检测技术,IF为主
总结:不平衡数据的分类,(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制.过采样后模型选择RF.xgboost.神经网络能够取得非常不错的效果.(2)模型层面:使用模型 ...
- 产生式模型(生成式模型)与判别式模型<转载>
转自http://dongzipnf.blog.sohu.com/189983746.html 产生式模型与判别式模型 产生式模型(Generative Model)与判别式模型(Discrimiti ...
- OSI模型与TCP/IP模型基础
一.OSI七层模型 OSI(Open System Interconnection),OSI是一个开放性的通行系统互连参考模型,是一个协议规范.OSI七层模型是一种框架性的设计方法 ,建立七层模型的主 ...
- 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?
Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...
- padding标准盒模型和怪异盒子模型
我们都知道padding是为块级元素设置内边距 但是在使用过程中,我们却会遇到一些问题.padding的标准盒模型和怪异盒模型 padding盒子模型 我们通过demo来讲这个问题,用文字干讲第一没意 ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- 标准盒模型与IE盒模型之间的转换
首先上图,这两张很明显可以看出IE盒模型和标准盒模型之间的差别. 当然今天不是去细细追究两种模型具体是怎么去计算布局的,那个很多文章已经已经有过了,不再重复.以前刚开始学习盒模型的时候,就学到的是IE ...
随机推荐
- PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)
1060 Are They Equal (25 分) If a machine can save only 3 significant digits, the float numbers 1230 ...
- 利用python批量修改word文件名的方法示例
利用python批量修改word文件名的方法示例 最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完 ...
- 利用windows任务计划备份sqlserver
sqlserver Express版不含agent service(虽然可以从“服务”里看到,但是无法启动),因此无法使用代理服务执行备份作业,如果代理作业服务正常,建议还是首先采用代理服务. 此备份 ...
- robot:生成随机的8为纯数字
1.引进random库 2.注意最后面的random为需要引入的包
- sql 索引【转】
T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...
- 在MAC上安装gitlab
转载引用:https://www.cnblogs.com/floodwater/p/10138265.html 1.安装docker 2.安装gitlab-ce 1.安装docker 下载地址: ht ...
- Edit Delete Mysql的主从复制
参考博客 https://www.cnblogs.com/zhoujie/p/mysql1.html Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上 ...
- python字典推导式 - python基础入门(17)
在昨天的文章中,我们介绍了关于python列表推导式 的使用,字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{}内部. ...
- ansible介绍、安装与配置
一.ansible简介 (1)简介: Ansible是近年越来越火的一款自动化运维工具,其主要的功能是帮助运维实现IT工作的自动化,降低人为操作失误.提高业务自动化率,常用于软件部署.配置自动化.管理 ...
- FAQ and discussed with adam
1. About permuter index. url: https://www.youtube.com/watch?v=j789k96g5aQ&list=PL0ZVw5-GryEkGAQ ...