第一次个人编程作业
这个作业属于哪个课程 | 课程链接 |
---|---|
这个作业要求在哪里 | 作业链接 |
这个作业的目标 | 设计并实现一个论文查重算法,学会规划时间,学会测试代码,优化代码以及项目后的反思,总结 |
-
Github项目代码链接:https://github.com/Ladyfish030/LAdyfish030
一.PSP表格
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 410 | 600 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 120 | 180 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 20 | 40 |
· Coding | · 具体编码 | 120 | 180 |
· Code Review | · 代码复审 | 20 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 20 |
· 合计 | 410 | 640 |
二.程序设计与实现过程
- 因为之前是学习前端,所以选择了较为熟悉的nodejs实现该作业,因此本程序需要再node的环境下才能运行。
-
外部引用包:
nodejieba
:分词工具包,按照语义词性进行分词。fs
:文件工具包,对文件进行写入写出操作。path
:nodejs路径包,获取当前所在文件路径
-
程序实现流程图:
-
关键函数的分析和实现
主要在于如何实现求两个词语之间的移动距离,这里的移动距离是指最少经过多少次移动两个词可以达到相同。借鉴知网计算论文重复率的方法:
最终决定使用Levenshtein Distance,Levenshtein Distance是一个度量两个字符序列之间差异的字符串度量标准,两个单词之间的Levenshtein Distance是将一个单词转换为另一个单词所需的单字符编辑(插入、删除或替换)的最小数量。Levenshtein Distance是1965年由苏联数学家Vladimir Levenshtein发明的。对于两个字符串a、b,长度分别为|a|、|b|,它们的Levenshtein Distance为:
示例
为方便理解,以字符串:abroad和:aboard为例,将求值过程中每一步的操作数放入一个i+1行j+1列的二维数组中, 即为将a[1..i]转换为b[1...j]所需要的最少的操作数。1.首先是极端情况,即d[0][j]、d[i][0]即a为空字符串或b为空字符串时,需要操作的次数即为另一字符串的长度。
2.然后是一般情况,即d[i][j]的值,遍历这个二维数组,从第一行开始直到最后一行,由定义可知d[i][j]的值为d[i-1][j]+1、d[i][j-1]+1以及d[i-1][j-1]+1(如果a[i]==b[j])的最小值。即根据d[i][j]所在位置的正上方(d[i-1][j])、左方以(d[i-1][j])及左上方(d[i-1][j-1])的值计算出d[i][j]的值,由此得到二维数组中所有元素的值。
3.最后的d[i][j]即为字符串a转换为b的最少操作数。
如图字符串a、b的Levenshtein Distance levab(6,6)为2,相似度Simab为:
Simab=1-(leva,b(6,6)/max(6,6))=0.666...
三、性能改进
运行正常,无错误或警告:
由于Nodejs偏向于前端开发语言,无法使用性能分析工具Studio Profiling Tools进行性能分析,只有测试各个函数及接口时间的包。测试结果如下所示:
四、异常情况处理
-
输入参数不全
-
输入参数有误
五、十个测试用例
- “今天星期天” VS “今天周日” 60.00%
- “今天我过生日” VS “我今天过生日” 66.66%
- “我有一个红色的书包,我很喜欢” VS “我有一个绿色的书包,我不喜欢” 85.76%
- “为 写 一位真正
才家永实只
内心 作的只有内心的会真远地告诉出,他,让私真他作高尚自己么突他。” VS “一位真正的作家永远只为内心写作,只有内心才会真实地告诉他,他的自私、他的高尚是多么突出。” 57.14% - “我的水杯是白色的” VS “哪里有绿色的草地” 100.00%
- “内心让他真实地了解自己,一旦了解了自己也就了解了世界。很多年前我就明白了这个原则,可是要捍卫这个原则必须付出艰辛的劳动和长时期的痛苦,因为内心并非时时刻刻都是敞开的,它更多的时候倒是封闭起来,于是只有写作,不停地写作才能使内心敞开,才能使自己置身于发现之中,就像日出的光芒照亮了黑暗,灵感这时候才会突然来到。” VS “内心让他真实地夯了解自己,一旦了育解了自己也族就了解了疯世界。很多年前碉我就明白了步这耘个粟原则,可是汲要捍涤卫这个原则必须付出艰辛协的劳动和长体时我期召的痛苦,因为内心并非时时刻刻都是敞开的,镍它昂更多的时候倒是位封闭誉起来,于是只有讹写作,不弃停焰地橇写作才能使牵内心敞开,塌才隅能使自己置身于发过现之中,就像日疗出的光芒照亮了黑荒暗,胡灵感鼻这时候才掠会突然来狈到。” 81.20%
- “长期以来,我的作品都是源出于和现实的那一层紧张关系。我沉湎于想象之中,又被现实紧紧控制,我明确感受着自我的分裂,我无法使自己变得纯粹,我曾经希望自己成为一位童话作家,要不就是一位实实在在作品的拥有者,如果我能够成为这两者中的任何一个,我想我内心的痛苦将会轻微得多,可是与此同时我的力量也会削弱很多。” VS “ 长期诚以来,我的作品都数是缕源出困于和现实的购那一层紧张关系。我沉湎于坑想象之中,又被现营实垦紧紧钡控制,我明确感奉受着自我的分裂,我无法使自己变得纯粹,我曾经希望自膊己成为一位童话作家,要盯不就是一位蘑实实在喻在帛作品的拥有者,如果我能够成控为这两者中的吵任何一苑个,我想隙我内心的痛苦将会巧轻微得多,可颐是与此同时我的力垄量也会双削弱很婆多越。” 81.80%
- “长期以来,我的作品都是源出于和现实的那一层紧张关系。我沉湎于想象之中,又被现实紧紧控制,我明确感受着自我的分裂,我无法使自己变得纯粹,我曾经希望自己成为一位童话作家,要不就是一位实实在在作品的拥有者,如果我能够成为这两者中的任何一个,我想我内心的痛苦将会轻微得多,可是与此同时我的力量也会削弱很多。” VS “长期以来,我的作品是出于和现的那一紧张关系。我沉于想中,又被现紧控制,我确感着自的分裂,我无法使自变纯,我曾经希自己成为位童话家,要就是一位实实在在作品的拥有者,如能够成这两者中的任何一个,我想我内心的痛苦将会轻微多,可与此同时我的力也会弱很多。”82.98%
- “事实上我只能成为现在这样的作家,我始终为内心的需要而写作,理智代替不了我的写作,正因为此,我在很长一段时间是一个愤怒和冷漠的作家。” VS “事实上我只
成为终在这样的作家,我始现为内代的需要而写写,理智心替不了我的作作,正因为此,我在怒长冷段时间是一个愤很和一漠的作家。”82.82% - “作家要表达与之朝夕相处的现实,他常常会感到难以承受” VS “,蜂拥而来的真实几乎都在诉说着丑恶和阴险,怪就怪在这里”0.00%