JPlag的使用

一种基于Token的文本相似度计算工具

Posted by canjuly on April 15, 2019

什么是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还是正经很多的。