这个作业属于课程 | 软件工程 |
---|---|
这个作业的要求在哪里 | 个人项目作业 |
这个作业的目标是 | 完成论文查重程序 |
GitHub:
820831320/3118005409
PSP
PSP 2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
- Estimate | 估计这个任务需要多少时间 | 60 | 45 |
Development | 开发 | ||
- Analysis | 需求分析(包括学习新技术) | 240 | 120 |
- Design Spec | 生成设计文档 | 60 | 30 |
- Design Review | 设计复审 | 60 | 30 |
- Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 40 |
- Design | 具体设计 | 120 | 125 |
- Coding | 具体编码 | 120 | 180 |
- Code Review | 代码复审 | 60 | 70 |
- Test | 测试(自我测试、修改代码、提交修改) | 180 | 240 |
Reporting | 报告 | ||
- Test Report | 测试报告 | 30 | 60 |
- Size Measurement | 计算工作量 | 30 | 20 |
- Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 60 | 60 |
Sum | 合计 | 1020 | 1020 |
接口设计
一共设计了五个函数进行程序运行
函数为:
- is_blank
- re_jieba_han()
- count()
- merge_word()
- change()
- cosine_similarity()
re_jieba_han()
通常情况下会对文档先进行一遍提取分词,然后再对文档中的标点符号使用re模块函数进行去除标点符号。
该函数在读取的时候就直接选择性读取``
结果减少了对文档的操作时间,提高效率
性能分析
性能图
其中整个程序中最消耗时间的是 change () 函数,
函数改进仅对 re_jieba_han () 进行了性能优化
优化前
函数对文档先进行了提取,再进行标点符号的清除
优化后
直接进行筛选读取
单元测试
程序代码覆盖率
测试 re_jieba_han ()
测试样例及其结果
十个测试用例同时测试了包含汉字、数字、英语以及特殊标点符号的文件,函数成功运行
代码覆盖率:
测试 count ()
沿用上一次是的结果测试该函数
成功生成字典,并且词频统计正确
代码覆盖率:
测试 cosine_similarity ()
测试算法函数,需要输入两个列表作为两个文本的转化向量来进行计算测试,所以设计了自动生成列表函数并通过循环自动测试十次
def create_vec():
a = rd.randint(0,10,(5,5))
a2 = a.reshape(25, order='C')
return a2
def cosine_similarity(x, y, norm=False):
assert len(x) == len(y), "len(x) != len(y)"
zero_list = [0] * len(x)
if (x == zero_list).all() or (y == zero_list).all():
return float(1) if x == y else float(0)
res = np.array([[x[i] * y[i], x[i] * x[i], y[i] * y[i]] for i in range(len(x))])
cos = sum(res[:, 0]) / (np.sqrt(sum(res[:, 1])) * np.sqrt(sum(res[:, 2])))
return 0.5 * cos + 0.5 if norm else cos
if __name__ == '__main__':
i = 1
while i < 11:
vec1 = create_vec()
vec2 = create_vec()
result = cosine_similarity(vec1,vec2)
print("第 %d 次测试" %i)
print("这是向量1",vec1)
print("这是向量2",vec2)
i = i+1
print(result)
代码覆盖率:
异常处理
对空文件的异常处理
当输入的两个文件中有一个为空文件,即停止程序并提醒文件为空
总结
使用PSP感受
对于PSP一开始看着感觉很虚,似乎是随便填的,主要是第一次规范的填写自己的时间花在了那里,让人难以捉摸。但是这个确实可以让自己明白自己的大概花在了哪里,能有针对性的提升
jieba算法
结巴算法中有 jieba.cut()
和 jieba.lcut()
,他们的区别是jieba.cut()
生成的是一个生成器,需要通过循环来把分好的词一个一个取出来放入列表里,但是 jieba.lcut()
可以直接得到一个列表,这一次使用的是jieba.cut()
Numpy中关于列表的条件判别
当使用 if x == zero_list or y == zero_list
时 x,y ,zero_list三个列表长度一样的时候可能出现判别模糊,因为 x == zero_list
可能数值上不相等但是逻辑上相等。因此可能需要使用a.any() 或者 a.all()
来判别
即:if (x == zero_list).all() or (y == zero_list).all():
具体参考 Python-numpy逻辑报错