个人项目
| 个人项目 | |
|---|---|
| 软件工程 | <网工1234> |
| 作业要求: 1.在Github仓库中新建一个学号为名的文件夹。 2.在开始实现程序之前,在PSP表格记录下你估计在程序开发各个步骤上耗费的时间,在你实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。 3.语言不限,运行环境为64-bit Windows 10。需将编译好的程序发布到Github仓库中的releases中。 4.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告。 5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。 6.使用Github来管理源代码和测试用例,代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。 7.使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保你的程序能够正确处理各种情况。 |
<作业要求> |
| 作业目标: 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | ||
| Estimate | 估计这个任务需要多少时间 | 1440 | 1800 |
| Development | 开发 | ||
| Analysis | 需求分析 (包括学习新技术) | 120 | 300 |
| Design Spec | 生成设计文档 | 120 | 100 |
| Design Review | 设计复审 | 30 | 30 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
| Design | 具体设计 | 200 | 300 |
| Coding | 具体编码 | 200 | 300 |
| Code Review | 代码复审 | 100 | 50 |
| Test | 测试(自我测试,修改代码,提交修改) | 100 | 600 |
| Reporting | 报告 | ||
| Test Repor | 测试报告 | 30 | 30 |
| Size Measurement | 计算工作量 | 30 | 30 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 50 | 30 |
| 合计 | 1440 | 1800 |
模块接口设计与实现过程
各类
1.Main主类 :调用各类
2.Compute计算类:采用余弦计算相似度
3.Txt读取类:对本地文件的存取和读写
项目结构

程序流程

关键方法的分析与实现
查重操作可分为以下四个步骤:读入文件,分词,查重,写入文件,其中分词和查重是难点。适当选择分词函数和相似度算法可有效提高查重效率和精确度。
编写程序前,查阅了许多资料,以下是参考的部分文章:
经考虑,决定采用余弦相似性算法来完成
向量空间余弦相似度(Cosine Similarity)
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
一个例子来说明,用上述理论计算文本的相似性。为了简单起见,先从句子着手。
句子A:这只皮靴号码大了。那只号码合适。
句子B:这只皮靴号码不小,那只更合适。
怎样计算上面两句话的相似程度?
基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。
第一步,分词。
句子A:这只/皮靴/号码/大了。那只/号码/合适。
句子B:这只/皮靴/号码/不/小,那只/更/合适。
第二步,计算词频。(也就是每个词语出现的频率)
句子A:这只1,皮靴1,号码2,大了1。那只1,合适1,不0,小0,更0
句子B:这只1,皮靴1,号码1,大了0。那只1,合适1,不1,小1,更1
第三步,写出词频向量。
句子A:(1,1,2,1,1,1,0,0,0)
句子B:(1,1,1,0,1,1,1,1,1)
第四步:运用上面的公式:计算如下:

计算结果中夹角的余弦值为0.81非常接近于1,所以,上面的句子A和句子B是基本相似的
计算模块接口部分的性能改进
对分句算法进行优化,减少拼凑字符串的次数.
忽略符号以减少处理次数.
模块部分异常处理说明
当两个句子都为空时会输出NaN,因此要进行异常处理,具体实现:
在Main类中添加句子的判空,如果都为空则输出提示信息并退出程序。

计算模块接口部分的性能测试

计算结果展示






浙公网安备 33010602011771号