个人项目

这个作业属于哪个课程 19网工3软工
这个作业要求在哪里 个人项目
这个作业的目标 设计一个论文查重算法,完成软件设计的个人开发流程

个人项目github

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

个人项目

个人项目

鉴于空串的比较是无意义的,程序没有设置针对性判断。

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。
上一篇:3.Mysql之MHA实战(03)


下一篇:Mac下Homebrew替换镜像