code embedding研究系列一-基于token的embedding

本文介绍了两篇应用token embedding的论文。一篇是用机器学习进行自动化软件漏洞检测,结合build - based和source - based方法,对C/C++代码做二分类;另一篇是腾讯安全科恩实验室提出的二进制代码/源代码端到端匹配算法,将源代码和二进制代码向量化后计算Triplet Loss。

NLPembedding无处不在,embedding将大型稀疏向量转换为保留语义关系的低维空间。在源代码研究领域(源代码分类,源代码克隆检测,变量,方法等重命名等)也会需要用到embedding,即code embedding

code embedding可以分成很多种:
1.把源代码文本当成纯文本进行embedding (text embedding)
2.把源代码经过词法分析过后生成的token序列进行embedding (token embedding)
3.利用源代码解析成的抽象语法树**(AST), 从AST上提取信息进行embedding
4.利用源代码的控制流图
(CFG)**和数据依赖图(PDG)进行embedding (基于graph的embedding)

这里Zimin Chen等人做了一个关于code embedding的统计研究

这里列举一些应用了token embedding的论文:

1.Automated software vulnerability detection with machine learning

这篇文章结局的问题是c/c++代码的bug检测,任务则是二分类,代码分为GoodBuggy,检测的粒度是function (即分析代码中的某个functionGood还是Buggy)

采用的方法结合了build-based(先编译C代码)和source-based(直接分析源代码文本),build-based分析了编译后的代码的CFG(控制流图),source-based则是基于token embedding的分析,这里重点讨论source-based (数据集中有一部分不能编译成功)

数据集来源

数据集来自2部分:
1.Debian包
2.Github

数据集的统计信息如下:

项目 Debian Github Source
Train Good 429807 250436 754150
Train Buggy 14616 9556 31790
Test Good 66100 38500 94268
Test Buggy 1878 1220 3724
Val Good 55102 32109 94268
val Buggy 1857 1203 3724

其中Source为Debian和Github的总和

数据集预处理

1.数据下下来后首先要去除重复的function**(长得一模一样)**
2.用Clangstatic analyzer (SA) 分析,将分析的输出去除和漏洞,bug无关的警告。去除过后没有警告信息的被标记为Good,有信息的被标记为Buggy。

分类方法

获取token

将源代码文本用自定义文法分析器解析成token序列,比如:

for (int i = 0; i <= 10; ++i){
   
   
	arr[i] += i;
}

生成的token序列如下:

for int i = 0 ; i <= 10 ; ++ i {
   
    arr [ i ] += i ; }

生成的token分类为:字符串值, 单字符值, 字符数组, 数值, 操作符, names等, names又细分为key(if for等等),系统调用(malloc),类型(bool, int, char),变量名。变量名又会被都映射为同一个标识符(具体参考论文),string值,float值都会被映射。

向量化表示

上述映射过程后会生成一个token序列,之后便是要对每个token进行向量化,用到的方法有:
1.词袋模型
2.word2vec

这样便可以生成非监督下的embedding表示,一个word2vec的token表示二维化后如下:
在这里插入图片描述

分类模型

论文设计的如下:

### 代码嵌入的概念 代码嵌入指的是将源代码转换成向量表示的过程,这些向量能够捕捉代码的语义特征。通过这种方式,机器学习模型可以理解和处理编程语言中的结构化信息。 #### 实现方法 种常见的实现方式是利用预训练的语言模型来生成代码片段的嵌入。这种方法依赖于Transformer架构的强大能力,该架构已经在大规模代码库上进行了充分训练[^1]。具体来说: - **Tokenization**: 首先对输入代码进行分词操作,将其分解为系列有意义的标记。 - **Embedding Layer**: 接着使用预训练好的权重矩阵将各个token映射到高维空间内的稠密向量中去。 - **Contextual Representation**: Transformer会基于上下文关系进步调整每个位置上的初始embedding值,从而获得更加精准的context-aware representation。 ```python from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained('microsoft/codebert-base') model = AutoModel.from_pretrained('microsoft/CodeBERT') def get_code_embedding(code_snippet): inputs = tokenizer(code_snippet, return_tensors='pt', truncation=True, padding=True) outputs = model(**inputs) # 取最后层隐藏状态作为最终编码结果 embeddings = outputs.last_hidden_state.mean(dim=1).detach().numpy() return embeddings ``` 此Python函数展示了如何借助Hugging Face Transformers库加载预先训练完成的`CodeBERT`模型,并获取给定代码段对应的固定长度向量表达形式。 #### 应用场景 - **自动补全建议**:根据当前编辑环境下的部分代码预测可能后续编写的指令序列。 - **缺陷检测工具**:识别潜在错误模式并提供修复指导。 - **相似度比较**:衡量不同版本之间变更程度或是查找重复逻辑块。 - **文档自动生成**:依据程序功能概述来自动生成API说明文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值