【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 ...
随机推荐
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_05-SpringSecurityOauth2研究-搭建认证服务器
3 Spring Security Oauth2研究 3.1 目标 本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定 义了用 ...
- TrippleDESCSPEncrypt 加密解密试试看
public class TrippleDESCSPEncrypt { //12个字符 private static string customIV = "4vHKRj3yfzU=" ...
- iOS从App跳转至系统设置菜单各功能项
跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...
- iOS-MMDrawerController第三方库的使用(转)
链接:https://github.com/mutualmobile/MMDrawerController ,根据导航item+滚动条progressView实现的手势滑动切换视图的 MMDrawer ...
- 【VS开发】TCP服务端如何判断客户端断开连接
原文出自:http://www.cnblogs.com/youxin/p/4056041.html 一篇文章: 最近在做一个服务器端程序,C/S结构.功能方面比较简单就是client端与serve ...
- 高级UI-RecyclerView间隔线添加
上文讲到了RecyclerView的简单使用,知道RecycleView是怎么使用的了,那么这一节将基于上一届的内容继续改进,在ListView中很轻松就能实现的间隔线,在RecycleView中也需 ...
- mvp设计模式
一.设计模式的简单介绍 MVP的 V 层是由UIViewController 和UIView 共同组成view 将委托presenter 对它自己的操作,(简单来说就是presenter发命令来控制v ...
- springboot和solr结合测试使用
首先新建springboot项目 新建webapp目录 springboot没有webapp目录——手动添加 web.xml <?xml version="1.0" enco ...
- vue+element-ui 实现table单元格点击编辑,并且按上下左右键单元格之间切换
通过我的测试我发现两个两种方法来编辑单元格的内容 第一种点击编辑: 我是给td里添加一个input,将值赋值给input,当失去焦点的时候将input的值付给td原来的内容,然后将input删除, 代 ...
- 20190621-N皇后
N皇后 难度分类 困难 题目描述 n皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n ...