【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 ...
随机推荐
- ehcache的heap、off-heap、desk浅谈
ehcache的heap.off-heap.desk浅谈 答: 从读取速度上比较:heap > off-heap > disk heap堆内内存: heap表示使用堆内内存,heap( ...
- VM12_pro+Ubuntu16_64+Qt5.12.2环境搭建
1.准备软件[已经存网盘] 2.安装Vm 3.安装Ubuntu 4.进入linux,修改Qt安装包权限 5.运行Qt 6.第五步会弹出Qt安装的界面,默认安装就行了 7.修改环境变量 sudo ged ...
- 一百四十三:CMS系统之评论布局和功能一
模型 class CommentModel(db.Model): """ 评论 """ __tablename__ = 'comment' ...
- Kafka——副本(Replica)机制
副本定义 Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区.副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本. 所谓副本(Replica),本质就是一个只能追加写消息的提交 ...
- (十七)super关键字(转)
--本文摘自孤傲苍狼博客. 一.super关键字
- Linux - Linux命令行常用快捷键
Common Shortcut Key 用途 快捷键 说明 光标移动 Ctrl + a 把光标移到行首 Ctrl + e 把光标移到行尾 Ctrl + x 在 EOL 和当前位置移动光标 输入编辑 C ...
- iCMSv7.0.15后台database.admincp文件仍存在SQL注入漏洞
闲着无聊,国庆时间没事做,又在Q群看到这种公告,只好下个icms慢慢玩.(PS:医院和学校居然都关网站了) 无奈自己太菜,审不出问题.只好上网百度icms之前的漏洞.然后居然成功在iCMSv7.0.1 ...
- 【ARM-Linux开发】TI 关于Gstreamer使用的几个参考
http://processors.wiki.ti.com/index.php/Example_GStreamer_Pipelines#H.264_RTP_Streaming http://proce ...
- eNSP——配置基于地址池的DHCP
原理: 实验案例: 拓扑图: 实验编址: 1.基础配置 根据实验编址进行实验的基础配置. 2.基于接口配置DHCP Server功能 在R1上开启dhcp 功能,在接口上开启dhcp服务功能,指定从接 ...
- java Files 和 Path对文件操作
1.拷贝文件 /** * 拷贝文件,生成新的文件名 * @param pathUpload * @return */ private String converUploadFileName(Strin ...