什么是JPlag
最近写毕设接近尾声了,出现了一些小小的问题。我毕设涉及到一些计算代码相似度的东西,本来想试一试SIM和MOSS,但是在优秀的正爸爸的实验下发现似乎并不是很靠谱(详情点这里)。于是决定试试往指令层面去靠一下。正好搜论文的时候搜到了一篇,里面略微提到了一下JPlag,就想试试看效果如何。
JPlag是一种基于词法的文本相似度计算工具,由德国卡尔斯鲁厄大学开发,他的GitHub在这里。
预备工作
首先你需要把JPlag下下来,截至2019年4月15日,JPlag的最新版为v2.12.1-SNAPSHOT,下载地址点我。下那个jar就可以了,别下成了source code。
然后要把java的版本更新一下,1.8是肯定不行的,我用的是11。
更新完之后,所有准备工作就完成了。
使用方法
进入你刚刚下好的jar的目录,然后建一个名字叫exercise1的文件夹(其实叫什么都可以),文件夹结构如下:
exercise1
|
├─ student1
| └─1.c
|
└─ student2
└─2.c
这里的1.c和2.c就是要测试相似度的两个文件,当然不仅限于c/c++,JPlag支持很多语言,具体看他的Github。
以正爸爸的实验为例,1.c代码如下(正爸爸实验中的sample1.c):
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int ans = 0;
for(int i = 1; i <= n; ++i)
{
int b;
scanf("%d", &b);
ans += b;
}
printf("%d\n", ans);
return 0;
}
2.c的代码如下(正爸爸实验中的sample6.c):
#include <stdio.h>
int main()
{
int a, b;
scanf("%d", &a);
b = 0;
for(int c = 1; c <= a; ++c)
{
int d;
scanf("%d", &d);
b = b + d;
}
printf("%d\n", b);
return 0;
}
接下来打开你的控制台,进入JPlag的jar的文件夹(注意这个jar包和exercise1在同一个文件夹中),输入java -jar jplag-2.12.1-SNAPSHOT-jar-with-dependencies.jar -l c/c++ -r tmp -s exercise1即可。解释一下:
- -l后面的参数用于指代语言
- -r后面的参数用于指代检测结果存放的目录
- -s后面的参数用于指代检测的源文件夹
经过这么一番操作,你可以看到和jar包、exercise1同级的地方多出了一个tmp文件夹,这就是检测结果,打开tmp/match0.html就能看到相似度了。我这里检测结果相似度为82.7%,比SIM/MOSS还是正经很多的。