个人项目
这个作业属于哪个课程 | 19网工3软工 |
---|---|
这个作业要求在哪里 | 个人项目 |
这个作业的目标 | 设计一个论文查重算法,完成软件设计的个人开发流程 |
1.PSP表格
PSP是卡耐基梅隆大学(CMU)的专家们针对软件工程师所提出的一套模型:Personal Software Process (PSP, 个人开发流程,或称个体软件过程)。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 450 | 454 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 130 | 140 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 12 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 60 | 40 |
· Code Review | · 代码复审 | 20 | 24 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 130 |
Reporting | 报告 | 10 | 10 |
· Test Repor | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 18 |
Total | · 合计 | 470 | 469 |
2.计算模块接口的设计与实现过程
中文分词--friso.dll
整合项目的头文件--PaperC.h
主程序,负责调用分词和调用checking.c中的比较函数--papercheck.c
比较函数整合--checking.c
分词部分
涉及到了数据库(词库)和mmseg算法,数据库这大类个人不容易实现,调用了github项目中的中文分词工具Friso,Friso带有自身的词库,vendors。使用时需要将词库的所在地址写入设置文件(friso.ini),并采用UTF-8编码(txt的中文是UTF-8编码),配置完成后才可进行下一步。
查重算法
考虑到自身实现不了类似TF-IDF中的逆文档频率(大数据,即按词的逆词频和重要度划分合适的权重)。难以实现类似余弦定理的查重的方案。SimHash(局部敏感哈希)考虑的是对相似文档的比对,只存在相似或者不相似,且需要用到词权重,暂不考虑。
初步选定N-Gram算法,稍作修改(本质是暴力近似匹配)。
N-Gram算法的变种,以词为单位(忽略特殊符号和单个标准字符),对查重文档取连续的xlen长度的词串,在标准文档上查找近似最大匹配(每个词仅一次错误区间,同时全部失配不超过长度的5/9,超过则认为不算重复部分)。为了提高效率,查重文档取xpos的间隔程度进行匹配。最后取重复率的平均值。
具体实现参考checking.c部分
主程序为papercheck.c,完成分词的调用checking。
3.计算模块接口部分的性能改进。
按照比较算法,时间复杂度近似为 \(O(xlen*N^2/xpos)\) ,N为文本的词数。鉴于给定的测试文本不超过6k,能在一个比较优的时间内得到较好的结果(xlen=7,xpos=3)
4.计算模块部分单元测试展示
五组对比数据,标准为orig.txt
orig_0.8_add.txt,orig_0.8_del.txt,orig_0.8_dis_1.txt,orig_0.8_dis_10.txt,orig_0.8_dis_15.txt
测试使用.bat的批处理文件
批处理cmd运行中...
得出的查重结果:
鉴于空串的比较是无意义的,程序没有设置针对性判断。
5.计算模块部分异常处理说明
暂无
程序运行
papercheck -init friso.ini orig.txt sim.txt report.txt
或者
papercheck orig.txt sim.txt report.txt
friso.ini是Friso的配置文件
orig.txt是标准文档
sim.txt是查重文档
report.txt是额外的查重结果输出文件
log.txt是程序日志,即分词的结果
结语
- 1.学会了个人项目的完整流程
- 2.对组件编程有了更深入的理解,了解动态库和链接器的使用
- 3.学习了git工具上传代码至github以及commit和update。