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

news/2024/11/17 15:49:22/文章来源:https://www.cnblogs.com/lxxxxblogs/p/18413168
这个作业属于哪个课程 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.hqwc.cn/news/797228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

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

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

Docker-Compose搭建RustDesk服务器

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

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. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器。USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0。USB3.0 DRD控制器的内部结构如下图所示;总线接口为AXI或AHB;USB3.0和USB2.0及USB1.0硬件上独立;USB3.0控制器数字逻辑部分对应SS MAC,…

作业2:个人项目

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

Linkedin-SRE-中文教程-二-

Linkedin SRE 中文教程(二)原文:School of SRE 协议:CC BY-NC-SA 4.0一些 Python 概念原文:https://linkedin.github.io/school-of-sre/level101/python_web/python-concepts/虽然期望您了解 python 及其基本语法,但是让我们讨论一些基本概念,这将帮助您更好地理解 pyth…

分析负数取模与取余的规则

目录负数"取模"基本概念修正定义取整规则决定商的值取模和取余不一样. 负数"取模"基本概念如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r,且0 <= r < d。其中,q 被称为商,r 被称为余数。 //对应代码 int mai…

Openwrt挂载大容量NTFS磁盘,解决默认挂载不能写入问题,实现samba共享

1. 目的 在OpenWRT上挂载上大容量磁盘(NTFS文件系统),支持读写操作。解决默认挂载仅能读取,不能写入问题。 配置Samba36,实现局域网文件夹共享。 2. 环境架构 ARMv7 Processor rev 1 (v7l)固件版本 OpenWrt 19.07.7内核版本 3.10.33安装插件smbd -v # 检查是否安装了smb …

使用MySQL Workbench进行数据库备份

1、打开MySQL Workbench2、进行数据库连接配置 如果之前连过,会有历史记录,直接点击需要备份的连接即可3、进入主界面后,选择左侧的Administration选项卡,然后点击Data Export;或者点击工具栏的Server——Data Export4、选择要备份的数据库,默认选择所有的表,在objects …

Mininet安装记录

安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1、更改软件镜像源 在设置中进行如下操作:选择国内的镜像站点,如阿里云。 点击关闭后,在弹出的窗口中点击重新载入,等待缓存更新完成。2、下载git 在终端中执行如下命令: sudo apt-get install git没有报错的话,…

Redis运维之监控指标,性能监控,监控方式,响应慢分析

目录1 Redis监控1.1 Redis监控指标1.1.1 性能指标: Performance1.1.2 内存指标: Memory1.1.3 基本活动指标:Basic activity1.1.4 持久性指标: Persistence1.1.5 错误指标:Error1.2 监控方式1.2.1 info1.2.2 性能监控1.2.3 内存监控1.2.4 基本活动指标1.2.5 持久性指标1.2.6 错…