论文查重
这个作业属于哪个课程 | 计科国际班软工 |
---|---|
这个作业要求在哪里 | 要求 |
这个作业的目标 | 论文查重程序 |
1.GitHub地址: https://github.com/a-sk768/3119009435 | |
2.PSP表格 | |
PSP2.1 | Personal Software Process Stages |
--------------------------------------- | -------------------------------- |
Planning | 计划 |
· Estimate | · 估计这个任务需要多少时间 |
Development | 开发 |
· Analysis | · 需求分析 (包括学习新技术) |
· Design Spec | · 生成设计文档 |
· Design Review | · 设计复审 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) |
· Design | · 具体设计 |
· Coding | · 具体编码 |
· Code Review | · 代码复审 |
· Test | · 测试(自我测试,修改代码,提交修改) |
Reporting | 报告 |
· Test Repor | · 测试报告 |
· Size Measurement | · 计算工作量 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 |
Sum up | 合计 |
3.计算模块接口的设计与实现过程: | |
此次论文查重我以余弦相似度实现。 | |
我使用hanlp进行分词及关键字提取,kmp算法计算关键词数量,并以快速排序和链表数据结构进行辅助计算。 | |
故至少需要以下模块: | |
1.输入输出模块 | |
2.分词及关键词提取模块 | |
3.计算关键词数量模块 | |
4.计算余弦值模块 | |
程序的函数嵌套顺序以模块标号按从小到大进行 | |
其中,3、4模块在最后被我合并为一个计算模块,此外加入了一些用以辅助计算的类,类中有且只有一个静态方法。 | |
(注:关键词提取部分的函数目前正在构建,故先调用工具辅助进行,以后有时间commit) | |
我的工程结构示意图: | |
![]() |
Libraries:
4 性能测试
JProfiler运行时截图:
可以看到,Java.lang.Float的实例次数最多,这是因为在函数实现的过程中大量调用toString方法。
从这个上面所展示的截图可以看出,在处理文本容量为一万字左右的文件时,该项目计算结果所需时间为679ms,读取数据用了1ms,
为了检查程序在不同性能设备上运行效率 我将电脑置为省电模式,结果为763ms以及2ms。
至于如何改进,思路如下:
将原文分词并去除停用词后放入Map中,之后根据关键词数组遍历Map,遇到相同的,关键词的数量数组对应位置加一(具体实现靠hash算法),直到遍历完成,最终得到表示关键词数量的数组。从时间复杂度来看,假设关键词数量为m,文本容量为n,若用原来的方法,对每一个关键词,均需要遍历一次文本所以最终时间复杂度为O(mn),改进后的算法,只需要遍历一遍文本,所以时间复杂度仅为O(m),最终得到一个线性时间复杂度的算法。
改进后的算法相当于重写一遍这个作业,所以我暂时放弃将其实现,但之前想复杂了,这次以后,我会着重考虑性能分析,在构建代码前仔细思考。(所以说这次算法的设计真的辣鸡)
5 部分代码展示:
1.
这里我直接构建一个String,将其转换为char数组,然后传参,通过人工校验确认无误后,测试结束。
2.
这里我还是直接构建一个String,将其转换为char数组,然后传参,通过人工校验确认无误后,啪,测试结束。
6.计算模块部分异常处理说明
在输入输出部分的异常处理我是直接使用了Java语言的异常抛出机制,如果遇到文件路径非法或者路径不存在,则会抛出如下
异常:
非法路径:
文件不存在:
文件为空: