code2vec的初步应用

最近想使用code2vec这种词向量工具将代码转化为词向量,我在网上只看到了文章讲到在github上的code2vec工具的使用
文章地址
https://blog.csdn.net/qysh123/article/details/106309967#comments_15034857

基本内容如下:

code2vec(项目GitHub:https://github.com/tech-srl/code2vec)是发表在POPL 2019上的论文:

Alon, Uri, Meital Zilberstein, Omer Levy, and Eran Yahav. “code2vec: Learning distributed representations of code.” Proceedings of the ACM on Programming Languages 3, no. POPL (2019): 1-29.

发表以来也确实受到了很多关注,例如ASE 2019上就至少有两篇论文做的是follow up的工作(虽然都是在一定程度上批评,但也说明了其影响力):

Jiang, Lin, Hui Liu, and He Jiang. “Machine Learning Based Recommendation of Method Names: How Far are We.” In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE), pp. 602-614. IEEE, 2019.

Kang, Hong Jin, Tegawendé F. Bissyandé, and David Lo. “Assessing the Generalizability of Code2vec Token Embeddings.” In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE), pp. 1-12. IEEE, 2019.

今天简单总结一下怎么用现有工具来生成code2vec的输入数据,用的是astminer这个工具:

https://github.com/JetBrains-Research/astminer

这个工具实际上也有对应的论文,之前的名字还是叫PathMiner:

Kovalenko, Vladimir, Egor Bogomolov, Timofey Bryksin, and Alberto Bacchelli. “PathMiner: a library for mining of path-based representations of code.” In 2019 IEEE/ACM 16th International Conference on Mining Software Repositories (MSR), pp. 13-17. IEEE, 2019.

个人感觉改了的名字还是好一些。我这里总结一下在Windows上的运行方法:

下载其Zip或者git clone后,在其目录下运行:

gradle shadowJar

注意这里Gradle的版本需要在5.5以上。然后我们在build\shadow目录下可以看到生成了一个lib-0.5.jar的jar包(有可能由于版本号不同,名字稍有差别),实际上我们直接运行这个jar包就可以得到输出了。

不过由于astminer的ReadMe.md里写的是运行sh脚本,我这里再简单说说在Windows下运行sh脚本的方法,其实有很多朋友也总结过了:

https://blog.csdn.net/weixin_42376686/article/details/82391410

我们在git的bin目录下找到sh.exe,例如我的是在这里:D:\Program Files\Git\bin

双击运行,然后定位到astminer的目录,这里有个小问题需要注意一下,例如我的astminer目录在这里:D:\Projects\astminer,如果我直接输入:

cd D:\Projects\astminer

就会报:bash: cd: D:Projectsastminer: No such file or directory
可以看到原因很简单,没有识别Windows下的分隔符,所以应该输入的是:
cd D:\Projects\astminer
然后就可以按照github上的说明运行:

./gradlew shadowJar

然后再运行:

./cli.sh code2vec

以及必要参数就可以生成code2vec需要的数据了。看到这里似乎一定要在Linux下运行,但实际上我们看看cli.sh的内容,发现它只是运行了上面那个jar包:

#!/bin/bash
 
java -jar build/shadow/lib-0.5.jar "$@"

所以我们其实直接运行上面的jar包也能得到一样的结果,所以我们直接在windows cmd中运行:

java -jar lib-0.5.jar code2vec --lang cpp --project %源代码的目录% --output %需要生成的code2vec的输入数据的目录%

java -jar lib-0.5.jar code2vec --lang cpp --project %源代码的目录% --output %需要生成的code2vec的输入

材料

1.code2vec作者的开源codevec实现代码网址:https://github.com/tech-srl/code2vec
2.将code2vec应用到多种语言github上的开源网址:https://github.com/JetBrains-Research/astminer
3.关于code2vec应用到多种语言github上的开源使用的博客:https://blog.csdn.net/qysh123/article/details/106309967

实践过程

1.gradle安装

首先根据上面博客操作我我们要生成一个lib-0.5.jar的文件需要执行gradle shadowJar 所以我们需要先安装gradle,我是在wiindows系统下安装的,具体安装步骤见文章:https://blog.csdn.net/lockhou/article/details/113817827

2.运行./gradlew shadowJar语句

我们要打开git下bin文件夹中的sh.exe文件点击运行,并在运行的工具中的路径定位到astminer的目录下。(我的sh.exe所在地址为:C:\Program Files\Git\bin\sh.exe)

3.使用模型语句

我们如果使用上面博客所给的语句,我们需要将git下的sh.exe所运行的命令行定位到astminer目录下的build文件下的shadow目录(astminer-master-dev\build\shadow\lib-0.6.jar )
然后运行语句

java -jar lib-0.5.jar code2vec --lang cpp --project 源代码的目录 --output 需要生成的code2vec的输入数据的目录

我的运行语句为:

java -jar lib-0.6.jar code2vec --lang c --project ../../../9_projects_Functions/Asterisk/Vulnerable_functions --output out1

–project …/…/…/9_projects_Functions/Asterisk/Vulnerable_functions 代表的是我们在当前定位地址到达我们放置c语言文件的目录下的相对路径,在这里我把所有.c文件放在Vulnerable_functions文件夹下

–output out1 代表我把这些c语言文件输入到code2vec模型当中得到的输出结果存在文件加out1下
输出格式
对于基于路径的表示形式,astminer支持两种输出格式。在这两个.csv文件中,我们存储4个文件:
存储文件结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
node_types.csv包含数字ID和带有方向的相应节点类型(如纸张所述,向上/向下);
tokens.csv 包含数字ID和相应的标记;
paths.csv 以空格分隔的节点类型ID序列形式包含数字ID和AST路径
path_contexts.csv 包含路径上下文的标签和序列(两个标记的三元组以及它们之间的路径)
如果使用code2vec格式的副本,则每行path_contexts.csv以一个标签开头,然后它包含一系列以空格分隔的三元组。每个三元组包含开始令牌ID,路径ID,结束令牌ID,以逗号分隔。
如果使用csv格式,则其中的每一行都path_contexts.csv包含标签,然后是逗号,然后是-;分隔的三元组序列。每个三元组包含开始令牌ID,路径ID,结束令牌ID,以空格分隔。

–lang 代表你要识别项目的语言,并且结果不同语言会存在以该种语言运行文件后缀命名的文件夹之下

3.也可以直接使用开源项目中提供的语句
预处理

在C / C ++项目上运行预处理以展开#define指令。在其他任务中,如果为C / C ++文件提供了宏,则它们以及它们在代码中的外观都会被删除。

./cli.sh preprocess --project path/to/project --output path/to/preprocessedProject
解析

从所有文件中以受支持的语言提取AST。

./cli.sh parse --lang py,java,c,cpp --project path/to/project --output path/to/result --storage dot
路径上下文

从所有文件中以受支持的语言提取路径上下文,并以形式存储fileName triplesOfPathContexts。

./cli.sh pathContexts --lang py,java,c,cpp --project path/to/project --output path/to/results --maxL L --maxW W --maxContexts C --maxTokens T --maxPaths P
Code2vec

提取适合作为code2vec模型输入的数据。将以指定语言编写的所有文件解析为AST,分成方法并以form形式存储method|name triplesOfPathContexts。

./cli.sh code2vec --lang py,java,c,cpp --project path/to/project --output path/to/results --maxL L --maxW W --maxContexts C --maxTokens T --maxPaths P  --split-tokens --granularity method

我按照github上的开源工具分别尝试了code2vec模型,该模型语句仍在git下的sh.exe所运行的命令行中运行并且定位到astminer,指令如下:

./cli.sh code2vec --lang c --project ../9_projects_Functions/Asterisk/Vulnerable_functions --output out

运行结果如图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

并且查看了各个表格中的文件经过粗略比较,当处理相同一批文件时,上面两种使用code2vec模型得到的结果相同

出于好奇,又实践了一下生成ast的工具,路径和上述一致,直接输入下列指令即可,所得到的结果存在ast文件夹之下

./cli.sh parse --lang c --project ../9_projects_Functions/Asterisk/Vulnerable_functions --output ast  

暂时结果

1.两种使用code2vec方法得到的效果基本一致
2.我们暂时只得到了词表,节点表基于此使用书表示一个.c文件并将结果存在path_contexts.csv文件夹之下,并未得到我们想要的词向量表示还不可以直接应用到神经网络上去解决实际文问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值