第一次个人编程作业

个人项目-简单论文查重

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229
这个作业的目标 使用java开发个人项目,使用git和github托管代码各版本

PSP

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

需求分析

题目:论文查重

描述如下:

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

经过查阅资料,了解了一些相似度算法

比如:

余弦相似度算法:基于两向量夹角的余弦值,对两向量大小不敏感

​ 计算公式:

\[\frac{a\cdot b}{|a|| b|} \]

欧氏距离:两点间的距离

思路:将文本转化成向量再进行余弦相似度算法

设计

对于中文文本,使用分词器将其分词,转成一个个关键词,再使用map集合存储这些关键词,value为关键词出现的次数,没出现不用记录(显然0和任何数相乘都为0),计算时,以其中一个map为基准点积即可

分词器选择IK分词器

maven依赖如下

		 <dependency>
            <groupId>cn.shenyanchao.ik-analyzer</groupId>
            <artifactId>ik-analyzer</artifactId>
            <version>9.0.0</version>
         </dependency>

代码结构

将文件操作,IK分词,余弦计算三大模块分别包装为工具类

在Main类中将三大模块整合起来,得到一个make()的由给定文件算出余弦相似度并写入指定文件的方法

Code Quality Analysis工具

使用idea自带的代码快速分析工具,消除了警告(右方绿色的勾)

性能图分析

一次对所有测试用例的分析


一次对整合模块的性能分析


由于下面的两部分主要是使用第三方库导致的,总不可能修改别人的代码,而且中文分词时间长点也情有可原

但上面的日志也耗费了许多时间,而且这个最初时为了消除警告使用的,使用量较少,可以加以修改

文件的处理可以使用缓冲区优化

测试

使用Junit4进行单元测试

相关maven依赖如下

 		<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

测试覆盖率

Main中主要是main方法未测试,这个主要是用于接收命令行参数的,在命令行中已另外测试过

FileUtil则是部分异常(创建目录失败等)

问题

发现使用idea测试结果正常,而用cmd测试同样的文本确得到不同的结果且大都为0.99

而且 桌面 在cmd中会出现变成 口口或者空白的问题

复审

查阅资料发现是windows cmd编码问题

解决运行结果不一致问题

可通过添加 -Dfile.encoding=utf-8 解决(不推荐,出现显示乱码)

## 原来异常的运行方式(常规操作)
java -jar main.jar orig.txt orig_0.8_add.txt ans.txt

## 应该这样
java -Dfile.encoding=utf-8 -jar main.jar orig.txt orig_0.8_add.txt ans.txt

也可以在代码中显示确定UTF-8编码(两个都能解决了)

异常

这里3个make,第一个是正常的,第二个的答案文件的路径是不正常的(不存在文件后再起目录),第三个则是其答案文件已经其父目录都不存在

 //一般正常的路径不存在也可生成文件
        if (!file.exists()) {
            if (!file.getParentFile().exists()) {
                boolean mkdirs = file.getParentFile().mkdirs();
                if (!mkdirs) {
                    System.out.println("创建父目录失败");
                    return;
                }
            }
            if (!file.createNewFile()) {
                System.out.println("创建文件失败");
                return;
            }
        }

至于输入文件的异常,或者更无语的答案文件路径乱写,程序会抛出异常

在整合模块make中会捕获

catch (IOException e) {
            System.out.println(e.getMessage());
        }

最终运行结果


posted @ 2024-09-10 17:49  hwc2459604249  阅读(69)  评论(0)    收藏  举报