第一次个人编程作业

java论文查重程序

这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业要求链接
这个作业的目标1 完成PSP表格记录
这个作业的目标2 使用软件进行性能分析
这个作业的目标3 熟悉使用GitHub、Markdown语法
这个作业的目标4 学习查重的主要算法和实现
这个作业的目标5 锻炼自己的写程序能力

一、Github地址

Github:https://github.com/wangzr123/3119005475.git
可执行的jar文件放在release里面

二、PSP表格

三、计算模块接口的设计与实现过程

  • 共有五个类:
  1. chachong(主方法类):此类主要是实现接收键盘的值和调用其他函数的类
  2. Algorithm:算法类,此类包含了四个函数,四个函数之间存在调用关系,来实现对重复率的计算
  3. TxtDemo:文件输入输出类,此类实现的功能是文件的写入和提取
  4. testUnit:测试类,对全部文件的测试,不用从键盘中输入
  5. testMain:测试全部的文件(自己写程序的时候测试的)
  • 关键算法
  1. 分词:将文本分割成关键词的特征向量,分词方法有很多,我用了hanlp分词来实现
  2. hash:通过hash函数对每一个词向量进行映射,产生一个n位二进制串
  3. 加权:前面的计算我们已经得到了每个词向量的Hash串和该词向量对应的权重,这一步我们计算权重向量W=hash*weight
  4. 合并:把文本所有词向量的权重向量相累加,得到一个新的权重向量
  5. 降维:对于前面合并后得到的文本的权重向量,大于0的位置1,小于等于0的位置0,就可以得到该文本的SimHash值

最后使用海明距离来计算这两个文本的相似度,海明距离可以理解为,两个二进制串之间相同位置不同的个数。举个例子,[1,1,1,0,0,0]和[1,1,1,1,1,1]的海明距离就是3

四、计算模块接口部分的性能改进

  • 概况

  • 方法调用情况

  • CPU负载
消耗最大的函数就是getSimHash,里面包括了分词、获取哈希值、加权、合并
降维,不过这些也没什么好提升的了

五、计算模块部分单元测试显示

  • 测试模块代码
package main.com;

import org.junit.Test;

public class testUnit {

    @Test
    public void orign() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

    @Test
    public void add() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig_0.8_add.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

    @Test
    public void del() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig_0.8_del.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

    @Test
    public void dis1() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig_0.8_dis_1.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

    @Test
    public void dis10() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig_0.8_dis_10.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

    @Test
    public void dis15() {
        String str0 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig.txt");
        String str1 = TxtDemo.readTxt("D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\orig_0.8_dis_15.txt");

        double similarity = Algorithm.getSimilarity(Algorithm.getSimHash(str0), Algorithm.getSimHash(str1));
        TxtDemo.writeTxt( similarity, "D:\\study\\3.1\\first_ruangong\\chachong\\src\\file\\result.txt");
    }

}

  • 测试结果:

  • 输入不存在的文件路径::

六、计算模块部分异常处理说明

  • 空文件异常
  try {
          fileInputStream = new FileInputStream(file);
          InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
          BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                // 字符串拼接
          while ((strLine = bufferedReader.readLine()) != null) {
                    str += strLine;
                }
                // 关闭资源
          inputStreamReader.close();
          bufferedReader.close();
          fileInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
  }

七、参考

https://blog.csdn.net/weixin_33675507/article/details/85826969
https://blog.csdn.net/u010992313/article/details/104224712

posted @ 2021-09-17 15:39  wwcoo  阅读(94)  评论(0编辑  收藏  举报