首页 > 其他分享 >个人项目

个人项目

时间:2024-09-15 16:37:49浏览次数:1  
标签:Users 个人 项目 Desktop 26411 test orig String

作业信息

作业属于哪个课程 软件工程https://edu.cnblogs.com/campus/gdgy/CSGrade22-12
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/homework/13220
这个作业的目标 准备、创建、开发、管理、测试个人项目

1.PSP表格

2.题目描述

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

3.算法实现基本思路

3.1simHash算法原理

1.分词:现在有很多可供使用的包来进行文本的分词,本篇所使用的分词器是IKAnalysis,需要安装 IKAnalyzer2012_u6.jar包

2.hash:通过hash函数计算各个特征向量(这里为划分好的词)的hash值,hash值为二进制数01组成的n-bit签名。

3.加权:权重:就是词频;把第2步生成的hash值从左至右与权重进行运算;如果该bit的数值为1,则将权重赋给该位;如果该bit的数值为0,则将权重的负值赋给该位。example:“我”,hash = 101011,weight(词频) = 5;则加权后的结果为:5 -5 5 -5 5 5;

4.合并:经过上述的三个步骤,我们可以得到全部词(word)的加权hash值,此时需要将全部的加权后的hash值进行累加;

5.降维:将第四步计算出来的序列串变为01串;具体规则:如果该位的数值>0,则置为1;反之则置为0.

6.海明距离(Hamming Distance):在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离;

3.2余弦定理查找相似度

(1)找出两篇文章的关键词;
(2)每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频
(3)生成两篇文章各自的词频向量;
(4)计算两个向量的余弦相似度,值越大就表示越相似。

4.具体代码设计部分

4.1 设计顶层接口,选用一种算法作为实现类

由于计算论文相似度、重复度的算法较多,这里也只采用了一种方法,即simhash+海明距离。因此我首先定义一个抽象接口DuplicateCheck接口,作为论文查重多种实现算法都要继承的父接口,接口里定义了一个抽象方法:String getSimilarity(String originalStr, String plagiarizeStr),用于让多种算法的实现类来实现,方便于将来扩展以及将来更换算法实现论文查重。

4.2 核心代码:获取simhash和海明距离得到相似度

在这定义一个子实现类SimHashAndHammingImpl类实现上述所说的DuplicateCheck接口,
核心是实现的方法 String getSimilarity(String originalStr, String plagiarizeStr)
方法内容如下:核心逻辑即为获取两个长文本的simhash以及计算海明距离得到相似度。
@Override
public String getSimilarity(String originalStr, String plagiarizeStr) {
//由字符串得出对应的simHash值
String orSimHash = getSimHash(originalStr);
String plSimHash = getSimHash(plagiarizeStr);

    //由simHash值求出相似度
    String similarity = gotSimilarity(orSimHash, plSimHash);
    return similarity;
}

4.3 代码设计的优点

1、针对这一种Simhash+海明距离的算法的实现方法进行了代码封装,使得易于调用。
2、同时,定义了父接口,也为将来进行代码水平扩展,其他算法的试验进行了准备,将来只需要更换实现类即可,实现了开闭原则,即对修改关闭,对扩展开放。

5.计算模块接口部分的性能改进

5.1 JProfiler分析



程序中消耗最大的函数:
是计算长文本的simHash值的函数

5.2 性能改进策略:

1.simhash用于比较大文本,适用于论文查重,但是如果是小文本,则应该更换算法。

2.使用多线程技术。

6.计算模块部分单元测试展示

6.1 整体功能测试

public class TestPaperSelect {
private DuplicateCheck check = new SimHashAndHammingImpl();
/**
* 测试不同的文件
*/
@Test
public void testdifferent() {
List plagiar = new ArrayList<>();
// 源文件
String originalStr = FileUtil.readUtf8String("C:\Users\26411\Desktop\test\orig.txt");

    plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_add.txt");
    plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_del.txt");
    plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_1.txt");
    plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_10.txt");
    plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_15.txt");
    String plagiarizeStr = null;    //抄袭文本
    String similarity = null;   //相似度
    for (String str : plagiar) {
        plagiarizeStr = FileUtil.readUtf8String(str);
        similarity = check.getSimilarity(originalStr, plagiarizeStr);
        System.out.println(str + " ==>" + similarity);
    }
}

}
结果如下:
C:\Users\26411\Desktop\test\orig_0.8_add.txt ==>0.82
C:\Users\26411\Desktop\test\orig_0.8_del.txt ==>0.75
C:\Users\26411\Desktop\test\orig_0.8_dis_1.txt ==>0.77
C:\Users\26411\Desktop\test\orig_0.8_dis_10.txt ==>0.73
C:\Users\26411\Desktop\test\orig_0.8_dis_15.txt ==>0.61

6.2 测试核心逻辑求解simhash值

@Test
public void testSimhash() {
String originalStr = FileUtil.readUtf8String("C:\Users\26411\Desktop\test\orig.txt");
String plagiarizeStr = FileUtil.readUtf8String("C:\Users\26411\Desktop\test\orig_0.8_add.txt");

    String orSimHash = check.getSimHash(originalStr);
    String plSimHash = check.getSimHash(plagiarizeStr);
    System.out.println(" orSimHash => "+orSimHash);
    System.out.println(" plSimHash => "+plSimHash);
}

结果如下:
orSimHash => 11110000111111010111111100110101010011010110011001111011001010000111110100000010000101011100011010100000111110100100111111110000
plSimHash => 11110001011111000111110001100011010010010010010101111011001010000011111100000010010101010100011010100110110111110100111010110000

6.3 单元测试覆盖率

7.计算模块部分异常处理说明

public class Error {
//错误的传参个数
public static final Exception BadArgsException = new RuntimeException("错误的传参个数!");

//文件校验 
public static final Exception BadFileException = new RuntimeException("文件格式不正确!");
public static final Exception LengthException = new RuntimeException("文本长度需多于300字!");

}
在出现错误的传参个数或校验文件不符合要求时,抛出异常。

7.1 测试错误的传参个数

当命令行传参个数少于3个时,会抛出异常 BadArgsException
public class TestError {
private DuplicateCheck check = new SimHashAndHammingImpl();
@Test
public void testBadArgsException(){
String[] args = new String[2];
args[0] = "C:\Users\26411\Desktop\test\orig.txt";
args[1] = "C:\Users\26411\Desktop\test\orig_0.8_add.txt";
PaperSelect.main(args);
}
}
结果如下:
java.lang.RuntimeException: 错误的传参个数!
at com.hwg.common.Error.(Error.java:5)
at com.hwg.PaperSelect.main(PaperSelect.java:13)

7.2 测试文件格式

当文件格式有误时,会抛出异常 BadFileException
@Test
public void testBadFileException(){
String[] args = new String[3];
args[0] = "C:\Users\26411\Desktop\test\orig.txy";
args[1] = "C:\Users\26411\Desktop\test\orig_0.8_add.txz";
args[2] = "C:\Users\26411\Desktop\test\ans.txw";
PaperSelect.main(args);
}
结果如下:
java.lang.RuntimeException: 文件格式不正确!
at com.hwg.common.Error.(Error.java:8)
at com.hwg.PaperSelect.main(PaperSelect.java:21)

标签:Users,个人,项目,Desktop,26411,test,orig,String
From: https://www.cnblogs.com/1305633803zpf/p/18415348

相关文章

  • 记一次nginx布署spring cloud项目后,jar包运行正常,但访问静态资源报404的问题。
    1、我们知道springcloud,是通过注册中心来注册所有的应用,这里面也包括网关gateway的注册:2、这里面我们运行了consoleapplication应用,这样里面就有一个Instance。3、测试静态资源的访问:4、consoleapplication结构:5、访问单个模块里的资源是正常的,但是上了服务器,nginx布......
  • 项目运行内存异常问题排查
    一:通过命令排查:有的时候在生产环境是无法使用Jprofiler等工具的,我们只能借助jdk提供的相关命令进行排查top:使用Top命令排查CPU消耗很高的进程top-H-ppid:查到进程消耗的CPU很高的情况下我们可以通过以下命令来定位到那个线程消耗的CPU高转换16进制:因为java中查看线程号使用......
  • CMake构建学习笔记16-使用VS进行CMake项目的开发D4
    目录*1.概论2.详论2.1创建工程2.2加载工程2.3配置文件:飞数机场2.4工程配置2.5调试执行3.项目案例4.总结1.概论在之前的系列博文中,我们学习了如何构建第三方的依赖库,也学习了如何去组建自己的CMake项目,尤其是学习了CMake的核心配置文件CMakeLists.txt如......
  • Premake自动部署OpenGL项目
        很多朋友们在构建项目的时候应该都使用过CMake,在github和gitee的很多项目上面都能看到关于CMake的脚本。不过笔者认为,这东西有时候实在是过于繁重了,特别是这个构建的项目足够大的时候。在这里笔者为大家介绍一款轻量轻量化的软件Premake,它可以很方便构建visuals......
  • Cadenza 项目:机器学习如何改善听力受损人士的音乐聆听体验
        音乐,作为全人类共享的文化瑰宝,具有强大的凝聚力,它不仅塑造了我们的社会风貌,更为我们的身心健康带来诸多益处。然而,听力损失却无情地削弱了这份美妙的体验。据世界卫生组织预测,到2050年,全球将有高达25亿人口面临不同程度的听力损失,其中至少7亿人急需治疗。听力受损使......
  • 个人项目-论文查重
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标设计算法比较原文与抄袭版论文,计算并输出文本重复率到指定文件,并完成PSP表格。源码......
  • vue项目之配置本地,测试,生产环境,配置axios.defaults.baseURL,解决跨域问题
    最近在做一个vue项目,想通过不同的命令调用不同环境的api,防止来回手动修改api出错。网上看了好多写的都不全,然后自己突发奇想自己写一篇文章。一、先简单说一下项目搭建1、安装vue脚手架npminstallvue-cli-g2、在硬盘上找一个文件夹放工程用的,在终端中进入该目录cd目录路......
  • python+django+mysql 教师培训反馈系统05141-计算机毕业设计项目选题推荐(赠源码)
       目   录摘  要Abstract第1章  前  言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章  系统开发环境62.1HTTP协议62.2HTML网页技术62.3B/S结构62.4django脚本语言72.5MySQL数据库72.6Apache简介8第3章  需求分析......
  • (赠源码)java+Springboot+mysql全省中小学师生共建习题交流与指导平台031619-计算机毕业
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于全省中小学师生共建习题交流与指导平台当然也不能排除在外,随着网络技术的不断成熟,带动了全省中小学师生共建习题交流与指导平台,它彻底改变了过去传统的管理方式,不仅使服务管理......
  • 【附源码】超市管理系统(源码+数据库+毕业论文+答辩ppt齐全)java开发springboot框架vu
    ......