使用这个工具是为了响应Reviewer的建议,另外我也看到一些新的arXiv论文中用到了这个工具,例如这篇:
Buratti, Luca, Saurabh Pujar, Mihaela Bornea, Scott McCarley, Yunhui Zheng, Gaetano Rossiello, Alessandro Morari et al. "Exploring Software Naturalness throughNeural Language Models." arXiv preprint arXiv:2006.12641 (2020).
不得不说,Reviewer们有时候也很与时俱进啊!这个工具对应的论文是这篇:
Allamanis, Miltiadis. "The adverse effects of code duplication in machine learning models of code." In Proceedings of the 2019 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software, pp. 143-153. 2019.
按照论文中的介绍,在进行machine learning或deep learning相关的源码分析的时候,应该去掉重复的源码corpus。工具的链接是:https://github.com/Microsoft/near-duplicate-code-detector
其实工具的使用还是很简单的,按照其README.md中的介绍,首先应该对源代码进行tokenize,可以使用tokenizers目录下的各种语言对应的工具,由于我需要处理的是Java,所以简单试了一下Java工具。可以看到:https://github.com/microsoft/near-duplicate-code-detector/tree/master/tokenizers/java,Java工具也是用Java写的,并且是个maven项目。所以在eclipse中:import——Existing Maven Projects——然后定位到含有pom.xml文件的目录下,就可以正常导入了。
README.md中并没有写怎么运行这个tokenizer,但其源代码里很清楚写了:"Usage <projectsFolder> <outputFolder> true|false",所以运行的时候,需要设置如下参数:
%源代码目录% %Tokenize输出目录% true或者false
最后一个boolean变量对应onlyIdentifiers,具体含义大家可以看看源码。运行完之后就可以在指定的输出目录生成一个类似于org.jsonl.gz的压缩文件,把这个压缩文件拷贝到:near-duplicate-code-detector-master\DuplicateCodeDetector目录下,并放在某个目录中,例如我放在了Ant-1.7这个目录下。然后cmd定位到这个目录下,运行:
dotnet run DuplicateCodeDetector.csproj --dir=Ant-1.7
需要注意的是,这里首先需要安装dotnet SDK 2.1,我在这一步又踩了一个坑:https://blog.csdn.net/qysh123/article/details/107910328,另外需要注意的是,如果安装新版本,如.NET core SDK 3.1,也是不能正常运行的(看来向下兼容还是有问题啊),会报类似于下面这样的错:
It was not possible to find any compatible framework version
The framework 'Microsoft.NETCore.App', version '2.1.0' was not found.
- The following frameworks were found:
3.1.6 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
成功运行后就会生成:DuplicateCodeDetector.csproj.json 这个文件,具体含义大家一看便知。
就简单总结这么多。