软工第一次作业-论文查重

news/2024/9/23 7:32:46
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229
这个作业的目标 通过Java开发个人项目,实现项目单元测试
作业github地址(含jar包) github:https://github.com/Placidoe/first-home-work.git

一、需求分析

题目:论文查重

描述如下:

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

原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:

从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。

注意:答案文件中输出的答案为浮点型,精确到小数点后两位

二、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 40
Estimate 估计这个任务需要多少时间 20 15
Development 开发 350 400
Analysis 需求分析 (包括学习新技术) 80 120
Design Spec 生成设计文档 30 50
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 20
Design 具体设计 60 70
Coding 具体编码 80 110
Code Review 代码复审 30 40
Test 测试(自我测试,修改代码,提交修改) 60 80
Reporting 报告 60 70
Test Repor 测试报告 20 20
Size Measurement 计算工作量 20 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 40 30
合计 1000 1115

三、流程图及接口代码实现

设计思路流程图

接口代码实现

读取文本-工具类

package com.lx.utils;/*** TODO** @Description* @Author Lx* @Date 2024/9/12 下午11:31**/
public class HammingUtils {//1.计算海明威距离public static int getHammingDistance(String simHash1, String simHash2){int distance = 0;if (simHash1.length() != simHash2.length()) {// 出错,返回-1distance = -1;} elsefor (int i = 0; i < simHash1.length(); i++) {// 每一位进行比较if (simHash1.charAt(i) != simHash2.charAt(i)) {distance++;}}return distance;}//2.根据海明威距离计算相似度public static double getSimilarity(String simHash1, String simHash2){int distance = getHammingDistance(simHash1, simHash2);return 0.01 * (100 - distance * 100 / 128);}
}//package com.lx.utils;
//
//public class HammingUtils {
//    /**
//     * 输入两个simHash值,计算它们的海明距离
//     * @param simHash1
//     * @param simHash2
//     * @return 海明距离
//     */
//    public static int getHammingDistance(String simHash1, String simHash2) {
//        int distance = 0;
//        if (simHash1.length() != simHash2.length()) {
//            // 出错,返回-1
//            distance = -1;
//        } else {
//            for (int i = 0; i < simHash1.length(); i++) {
//                // 每一位进行比较
//                if (simHash1.charAt(i) != simHash2.charAt(i)) {
//                    distance++;
//                }
//            }
//        }
//        return distance;
//    }
//
//    /**
//     * 输入两个simHash值,输出相似度
//     * @param simHash1
//     * @param simHash2
//     * @return 相似度
//     */
//    public static double getSimilarity(String simHash1, String simHash2) {
//        // 通过 simHash1 和 simHash2 获得它们的海明距离
//        int distance = getHammingDistance(simHash1, simHash2);
//        // 通过海明距离计算出相似度,并返回
//        return 0.01 * (100 - distance * 100 / 128);
//    }
//}

计算SimHash哈希码-工具类


package com.lx.utils;import com.hankcs.hanlp.HanLP;
import com.lx.utils.ShortStringException;import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.List;public class SimHashUtils {/*** 传入String,计算出它的hash值,并以字符串形式输出* @param str 传入的String类型字符串* @return 返回str的hash值*/public static String getHash(String str){try{//使用MD5获得hash值MessageDigest messageDigest = MessageDigest.getInstance("MD5");return new BigInteger(1, messageDigest.digest(str.getBytes("UTF-8"))).toString(2);}catch(Exception e){e.printStackTrace();return str;}}/*** 传入String,计算出它的simHash值,并以字符串形式输出* @param str 传入的String类型字符串* @return 返回str的simHash值*/public static String getSimHash(String str){// 文本长度太短时HanLp无法取得关键字try{if(str.length() < 200) throw new ShortStringException("文本过短!");}catch (ShortStringException e){e.printStackTrace();return null;}// 用数组表示特征向量,取128位,从 0 1 2 位开始表示从高位到低位int[] v = new int[128];// 1、分词(使用了外部依赖hankcs包提供的接口,把需要判断的文本分词形成这个文章的特征单词)List<String> keywordList = HanLP.extractKeyword(str, str.length());//取出所有关键词// hashint size = keywordList.size();int i = 0;//以i做外层循环for(String keyword : keywordList){// 2、获取hash值String keywordHash = getHash(keyword);if (keywordHash.length() < 128) {// hash值可能少于128位,在低位以0补齐int dif = 128 - keywordHash.length();for (int j = 0; j < dif; j++) {keywordHash += "0";}}// 3、加权、合并for (int j = 0; j < v.length; j++) {// 对keywordHash的每一位与'1'进行比较if (keywordHash.charAt(j) == '1') {//权重分10级,由词频从高到低,取权重10~0v[j] += (10 - (i / (size/10)));} else {v[j] -= (10 - (i / (size/10)));}}i++;}// 4、降维String simHash = "";// 储存返回的simHash值for (int j = 0; j < v.length; j++) {// 从高位遍历到低位if (v[j] <= 0) {simHash += "0";} else {simHash += "1";}}return simHash;}
}

计算海明威距离-工具类

package com.lx.utils;/*** TODO** @Description* @Author Lx* @Date 2024/9/12 下午11:31**/
public class HammingUtils {//1.计算海明威距离public static int getHammingDistance(String simHash1, String simHash2){int distance = 0;if (simHash1.length() != simHash2.length()) {// 出错,返回-1distance = -1;} elsefor (int i = 0; i < simHash1.length(); i++) {// 每一位进行比较if (simHash1.charAt(i) != simHash2.charAt(i)) {distance++;}}return distance;}//2.根据海明威距离计算相似度public static double getSimilarity(String simHash1, String simHash2){int distance = getHammingDistance(simHash1, simHash2);return 0.01 * (100 - distance * 100 / 128);}
}//package com.lx.utils;
//
//public class HammingUtils {
//    /**
//     * 输入两个simHash值,计算它们的海明距离
//     * @param simHash1
//     * @param simHash2
//     * @return 海明距离
//     */
//    public static int getHammingDistance(String simHash1, String simHash2) {
//        int distance = 0;
//        if (simHash1.length() != simHash2.length()) {
//            // 出错,返回-1
//            distance = -1;
//        } else {
//            for (int i = 0; i < simHash1.length(); i++) {
//                // 每一位进行比较
//                if (simHash1.charAt(i) != simHash2.charAt(i)) {
//                    distance++;
//                }
//            }
//        }
//        return distance;
//    }
//
//    /**
//     * 输入两个simHash值,输出相似度
//     * @param simHash1
//     * @param simHash2
//     * @return 相似度
//     */
//    public static double getSimilarity(String simHash1, String simHash2) {
//        // 通过 simHash1 和 simHash2 获得它们的海明距离
//        int distance = getHammingDistance(simHash1, simHash2);
//        // 通过海明距离计算出相似度,并返回
//        return 0.01 * (100 - distance * 100 / 128);
//    }
//}

四、测试用例及结果

1.测试文本读取和写入

2.测试计算simHash

3.测试计算海明威距离

4.测试计算查重率(全部测试用例)



五、性能分析

GC堆占用情况

堆栈使用情况

方法列表

CPU使用率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/60486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

文本相似度计算

一、PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 30 35 Estimate估计这个任务需要多少时间 30 35Development 开发 400 450 Analysis需求分析 (包括学习新技术) 60 70 Design Spec生成设计文档 60 60 Design Review…

第二十讲:为什么我只改一行的语句,锁这么多?

该文章深刻揭示了一点:加索引=行锁+间隙锁=(next-key lock),分析了加锁的规则:对主键(唯一索引),普通非唯一索引进行等值与范围查询的加锁。这篇文章我认为收获最大的是让我们知道“明明对一行加了锁,为什么在他相邻部分,或是相相邻部分无法插入数据(这根主键类型,…

【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:Dongzhi Zhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本…

Docker-Compose搭建RustDesk服务器

前置条件:电脑安装RustDesk客户端,服务器安装Docker及docker-compose官方文档:安装 :: RustDesk文档操作流程:使用Vim编写docker-compose.yml文件,修改需要的端口,最好按照官方对应的端口来操作,< >内替换成服务器对外的端口。记住挂载文件路径,容器运行后会生成密…

[安洵杯 2019]easy_web

首先抓包可以看到img是一个base64编码依次经过base64,base64,asciihex解码得到一个图片名555.png那么我们可以利用这一点反过去看index.php的源码,修改头 img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3 最后经过base64解码后 <?php error_reporting(E_ALL || ~ E_NOTICE); header…

CMake构建学习笔记16-使用VS进行CMake项目的开发

详细介绍了通过Visual Studio 2019 这款IDE进行CMake项目开发过程,能够极大增加C/C++程序的开发效率。目录1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行3. 项目案例4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

作业2:个人项目

个人项目-论文查重 一、课程信息这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 熟悉软件开发以及工具的使用、算法的设计、资料的搜集GitHub地址 二、开发环境开发工具 IDEA 2021.3.2项目构建工具 maven单元测试 Junit分词依赖包 hanlp三、…

[BJDCTF2020]Cookie is so stable

首先这题flag模块有个登录页面抓包可以看到user=123,最后会返回hello 123,这里就很像ssti注入,输入user={{2*3}}最后也是返回成功了,而且处理器是php,常见模块有:twig,smarty,blade 输入 user={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self…