第一次个人编程作业
click我的GitHub
作业需求
题目:论文查重
描述如下 :
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
• 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
• 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
• 从命令行参数给出:论文原文的文件的绝对路径。
• 从命令行参数给出:抄袭版论文的文件的绝对路径。
• 从命令行参数给出:输出的答案文件的绝对路径。
• 注意:答案文件中输出的答案为浮点型,精确到小数点后两位
计算模块接口的设计与实现过程
思路:
这次作业简单可以划分成三个方面:
其中最难的是simHash算法的实现
算法过程大概如下:
-
将Doc进行关键词抽取(其中包括分词和计算权重),抽取出n个(关键词,权重)对, 即图中的(feature, weight)们。 记为 feature_weight_pairs = [fw1, fw2 ... fwn],其中 fwn = (feature_n, weight_n)。
-
hash_weight_pairs = [ (hash(feature), weight) for feature, weight in feature_weight_pairs ] 生成图中的(hash,weight)们, 此时假设hash生成的位数bits_count = 6;
-
然后对 hash_weight_pairs 进行位的纵向累加,如果该位是1,则+weight,如果是0,则-weight,最后生成bits_count个数字,如图所示是[13, 108, -22, -5, -32, 55], 这里产生的值和hash函数所用的算法相关。
-
[13,108,-22,-5,-32,55] -> 110001这个就很简单啦,正1负0。
到此,如何从一个doc到一个simhash值的过程已经讲明白了。
simhash值的海明距离计算 \n ----------
二进制串A 和 二进制串B 的海明距离 就是 A xor B 后二进制中1的个数。 **举例如下**: A = 100111; B = 101010;
hamming_distance(A, B) = count_1(A xor B) = count_1(001101) = 3;
当我们算出所有doc的simhash值之后,需要计算doc A和doc B之间是否相似的条件是:
A和B的海明距离是否小于等于n,这个n值根据经验一般取值为3,
simhash本质上是局部敏感性的hash,和md5之类的不一样。 正因为它的局部敏感性,所以我们可以使用海明距离来衡量simhash值的相似度。
计算模块接口部分的性能改进
性能分析图
运行时间15ms
话说,我研究这个性能分析研究了好久,
因为用的是python语言,作业文档里面的jprofile性能测试工具我下载了发现不会用,研究了半天,发现很多功能还要收费版。
又去百度看怎么对python代码进行性能分析。。。T^T
最后用了pycharm自带的profile
((〃>皿<)只能免费试用30天)就很生气
计算模块部分单元测试展示
---
-------C:\Users\Administrter\venv\Scripts\python.exe "D:/Workspace/test.py"
test add
0.8601768754747804
test over!test del
..0.8985891244539704
test over!test dis_1
.0.9808112866546317
test over!test dis_10
.0.9233929083371283
test over!test dis_15
0.7122391923479036
test over!test dis_3
..0.9613218437864147
test over!test dis_7
..0.9511418312250954
test over!test mix
..0.9368555273793027
test over!test rep
0.7963167032716033
test over!test err_1
无法读取 123
test over!test err_2
文本无有效词汇,请输入包含有效词汇的文本路径
test over!.
Ran 11 tests in 6.066s
OK
Process finished with exit code 0
覆盖率
刚开始覆盖率只有86%
高亮部分是未覆盖的代码,只要删掉就可以百分百覆盖(不是)
后来改进的覆盖率
计算模块部分异常处理说明
可能出现的异常
1、输入路径不是utf-8
2、相同文本相似度却不是100%
3、文本不是汉字而是其他
class TextSameError(Exception): # 文本不同相似度却100%
def __init__(self): print("错误") def __str__(self, *args, **kwargs): return "路径输入有误"
class TextDifferentError(Exception): # 文本一致相似度不是100%
def __init__(self): print("错误") def __str__(self, *args, **kwargs): return "检查代码"
测试内容 | 测试模块 | 测试结果 |
---|---|---|
参数行命令为utf-8编码 | 输入输出函数 | 通过 |
命令行参数不是utf-8编码 | 输入输出函数 | 修改后通过 |
文本打开按行读取 | 文件读写模块 | 通过 |
文本整个读取 | 文件读写模块 | 通过 |
相同含义大小写单词按一个统计 | 文件读写模块 | 修改后通过 |
没有文本信息 | 文件读写模块 | 通过 |
PSP表格
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | |
---|---|---|---|
Planning | 计划 | 30 | 40 |
Estimate | 估计这个任务需要多少时间 | 20 | 25 |
Development | 开发 | 480 | 300 |
Analysis | 需求分析 (包括学习新技术) | 300 | 180 |
Design Spec | 生成设计文档 | 60 | 20 |
Design Review | 设计复审 | 30 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
Design | 具体设计 | 60 | 60 |
Coding | 具体编码 | 390 | 210 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 180 | 120 |
Reporting | 报告 | 90 | 120 |
Test Repor | 测试报告 | 60 | 100 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 30 |
Total | 合计 | 1840 | 2000 |
总结
1、实在太难了,但是收获很大!真的。
2、每一个流程都是面向百度,但收获挺大的,懂了怎么上传github的文件,怎么测试python代码,怎么测覆盖率。。。。
3、我要特别谢谢助教,谢谢他的用心良苦。于是我学会了靠自己解决问题。感谢!!!