个人项目:论文查重

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

这个作业属于哪个课程软件工程2024这个作业要求在哪里个人项目这个作业的目的了解软件项目开发的整体流程,实现自己的个人项目,学习单位测试、性能优化和 git 操作,学会使用 PSP 表格 
Github地点点击此处,进入我的堆栈
一、项目需求

题目:论文查重
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
 

  • 原文示例:本日是星期天,气候晴,本日晚上我要去看影戏。
  • 抄袭版示例:本日是周天,气候清朗,我晚上要去看影戏。
 
要求输入输出接纳文件输入输出,规范如下:

  • 从命令行参数给出:论文原文的文件的绝对路径。
  • 从命令行参数给出:抄袭版论文的文件的绝对路径。
  • 从命令行参数给出:输出的答案文件的绝对路径。
 
提供的样例:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。样例下载地点
 
答案文件中输出的答案为浮点型,精确到小数点后两位
 
二、设计和实现

1、整体流程


2、类和函数

类方法描述Mainmain()主程序入口TxtUtilsreadFile(String filePath)
writeFile(double fileElem, String filePath)从目的文件路径中读取文件内容
将结果写入指定文件HashUtilsgetHash(String str)
getSimHash(String str)传入 String ,计算出它的 hash 值,并以字符串形式输出
传入  String ,计算出它的 simHash 值HammingUtilscalculateHammingDistance(String simHash1, String simHash2)
calculateSimilarity(String simHash1, String simHash2)计算两个 SimHash 值的海明距离
输入两个 simHash 值,输出相似度ExceptionUtilsExceptionUtils(String message)处置惩罚文本过短异常3、关键算法

simHash算法和海明距离实现论文查重
三、性能改进

性能分析图:

 
Memory占用图:

byte类、String类和HashMap类占用较,byte类、String类主要来自于simHash值和海明距离的计算,HashMap类主要来自于使用分词器分词需要用到Map举行词频映射,可从此处改进。
四、单位测试

1. 读写 txt 文件的模块测试
思路:测试读取成功、读取失败、写入成功、写入失败的情况
代码:
  1. public class TxtUtilsTest {
  2.     @Test
  3.     public void readTest() {
  4.         // 路径存在 读取成功
  5.         String str = TxtUtils.readFile("D:/test/orig.txt");
  6.         String[] strings = str.split(" ");
  7.         for (String string : strings) {
  8.             System.out.println(string);
  9.         }
  10.     }
  11.     @Test
  12.     public void readTestErr() {
  13.         // 路径不存在 读取失败
  14.         String str = TxtUtils.readFile("D:/test/orig111.txt");
  15.         String[] strings = str.split(" ");
  16.         for (String string : strings) {
  17.             System.out.println(string);
  18.         }
  19.     }
  20.     @Test
  21.     public void writeTest() {
  22.         // 路径存在 写入成功
  23.         double[] elem = {0.12, 0.23, 0.34, 0.45, 0.56,0.99,0.88};
  24.         for (double v : elem) {
  25.             TxtUtils.writeFile(v, "D:/test/answer.txt");
  26.         }
  27.     }
  28.     @Test
  29.     public void writeTestErr() {
  30.         //路径错误 写入失败
  31.         double[] elem = {0.12, 0.23, 0.34, 0.45, 0.56,0.99,0.88};
  32.         for (double v : elem) {
  33.             TxtUtils.writeFile(v, "QQ:/test//answer.txt");
  34.         }
  35.     }
  36. }
复制代码
测试结果:

代码覆盖率:

 
2. hash 模块测试
代码:
  1. public class HashUtilsTest {
  2.     @Test
  3.     public void getHashTest() {
  4.         // 短文本
  5.         String[] strings = {"画画" , "多大" , "GG" , "火" , "阿凡达ya" , "版"};
  6.         for (String string : strings) {
  7.             String strHash = HashUtils.getHash(string);
  8.             if (strHash != null) {
  9.                 System.out.println(strHash.length());
  10.             }
  11.             System.out.println(strHash);
  12.         }
  13.     }
  14.     @Test
  15.     public void getSimHashTest0() {
  16.         // 短文本
  17.         String str = "好";
  18.         System.out.println(HashUtils.getSimHash(str));
  19.     }
  20.     @Test
  21.     public void getSimHashTest() {
  22.         // 长文本
  23.         String str0 = TxtUtils.readFile("D:/test/orig.txt");
  24.         String str1 = TxtUtils.readFile("D:/test/orig_0.8_add.txt");
  25.         System.out.println(HashUtils.getSimHash(str0));
  26.         System.out.println(HashUtils.getSimHash(str1));
  27.     }
  28. }
复制代码
测试结果:

代码覆盖率:

 
3. 计算海明距离模块测试
代码:
  1. public class HammingUtilsTest {
  2.     @Test
  3.     public void hammingDistanceTest0() {
  4.         String str0 = "10101100";
  5.         String str1 = "11001111";
  6.         int distance = HammingUtils.calculateHammingDistance(str0,str1);
  7.         double similarity = HammingUtils.calculateSimilarity(str0,str1);
  8.         System.out.println("海明距离为:" + distance);
  9.         System.out.println("相似度为:" + similarity);
  10.     }
  11.     @Test
  12.     public void hammingDistanceTest1() {
  13.         // 长度不等
  14.         String str0 = "10101100";
  15.         String str1 = "110011";
  16.         int distance = HammingUtils.calculateHammingDistance(str0,str1);
  17. //        double similarity = HammingUtils.calculateSimilarity(str0,str1);
  18.         System.out.println("海明距离为:" + distance);
  19. //        System.out.println("相似度为:" + similarity );
  20.     }
  21.     @Test
  22.     public void hammingDistanceTest2() {
  23.         String str0 = TxtUtils.readFile("D:/test/orig.txt");
  24.         String str1 = TxtUtils.readFile("D:/test/orig_0.8_add.txt");
  25.         int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
  26.         double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
  27.         System.out.println("海明距离为:" + distance);
  28.         System.out.println("相似度为:" + similarity);
  29.     }
  30.     @Test
  31.     public void hammingDistanceTest3() {
  32.         String str0 = TxtUtils.readFile("D:/test/orig.txt");
  33.         String str1 = TxtUtils.readFile("D:/test/orig_0.8_del.txt");
  34.         int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
  35.         double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
  36.         System.out.println("海明距离为:" + distance);
  37.         System.out.println("相似度为:" + similarity);
  38.     }
  39.     @Test
  40.     public void hammingDistanceTest4() {
  41.         String str0 = TxtUtils.readFile("D:/test/orig.txt");
  42.         String str1 = TxtUtils.readFile("D:/test/orig_0.8_dis_1.txt");
  43.         int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
  44.         double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
  45.         System.out.println("海明距离为:" + distance);
  46.         System.out.println("相似度为:" + similarity);
  47.     }
  48. }
复制代码
测试结果:

代码覆盖率:

 
4.主测试 MainTest
代码:
  1. public class MainTest {
  2.     @Test
  3.     public void mainTestAll() {
  4.         String[] args = new String[6];
  5.         args[0] = "D:/test/orig.txt";
  6.         args[1] = "D:/test/orig_0.8_add.txt";
  7.         args[2] = "D:/test/orig_0.8_del.txt";
  8.         args[3] = "D:/test/orig_0.8_dis_1.txt";
  9.         args[4] = "D:/test/orig_0.8_dis_10.txt";
  10.         args[5] = "D:/test/orig_0.8_dis_15.txt";
  11.         String answerPath = "D:/test/answerAll.txt";
  12.         for (int i=1; i< args.length;i++){
  13.             double answer = HammingUtils.calculateSimilarity(HashUtils.getSimHash(TxtUtils.readFile(args[0])),HashUtils.getSimHash(TxtUtils.readFile(args[i])));
  14.             TxtUtils.writeFile(answer, answerPath);
  15.         }
  16.     }
  17.     @Test
  18.     public void mainTeatSame() {
  19.         String str = "D:/test/orig.txt";
  20.         String answerPath = "D:/test/answerSame.txt";
  21.         double answer = HammingUtils.calculateSimilarity(HashUtils.getSimHash(TxtUtils.readFile(str)),HashUtils.getSimHash(TxtUtils.readFile(str)));
  22.         TxtUtils.writeFile(answer,answerPath);
  23.     }
  24. }
复制代码
测试结果:

代码覆盖率:

结果文件:



 
五、异常处置惩罚


  • 文本长度太短时,HanLp无法取得关键字,需要抛出异常。
  1. // 文本长度太短  HanLp无法取关键字
  2.         try{
  3.             if(str.length() < 200) throw new ExceptionUtils("文本过短!");
  4.         }catch (ExceptionUtils e){
  5.             e.printStackTrace();
  6.             return null;
  7.         }
复制代码
  1. public class ExceptionUtils extends RuntimeException {
  2.         // 构造函数:仅带消息参数
  3.         public ExceptionUtils(String message) {
  4.             super(message);
  5.         }
  6. }
复制代码
测试:
[code]public class ExceptionUtilsTest {    @Test    public void exceptionTest(){        //str.length()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表