第一次个人编程作业
第一次个人编程作业
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 软件工程 |
| 这个作业要求在哪里 | 个人项目作业 |
| 这个作业的目标 | 学会使用PSP表格,设计论文查重算法,并在整个过程中学会对代码进行性能分析、单元测试,以及对github的基本使用 |
| 这个作业的github链接 |
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 50 |
| Estimate | 估计这个任务需要多少时间 | 30 | 30 |
| Development | 开发 | 300 | 360 |
| Analysis | 需求分析 (包括学习新技术) | 120 | 100 |
| Design Spec | 生成设计文档 | 20 | 20 |
| Design Review | 设计复审 | 20 | 30 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| Design | 具体设计 | 20 | 20 |
| Coding | 具体编码 | 120 | 150 |
| Code Review | 代码复审 | 20 | 40 |
| Test | 测试(自我测试,修改代码,提交修改) | 30 | 80 |
| Reporting | 报告 | 30 | 60 |
| Test Repor | 测试报告 | 30 | 30 |
| Size Measurement | 计算工作量 | 5 | 5 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 10 |
| Total | 总计 | 835 | 1005 |
接口的设计与实现
基本原理
借助jieba库进行了分词和文本转向量的计算,同时使用了余弦相似度算法计算论文的重复率。其中算法的关键就是文本转向量的计算以及余弦相似度计算。
预处理部分
在翻看txt文件的时候可以发现,其除了汉字以外还包括了标点符号等不需要进行分词比较的部分。所以我利用正则表达式先对文本进行预处理,将文本中除中文外的所有字符全部去除,利用了如下代码:

文本转向量部分
文本转向量,首先将预处理之后的文本进行分词处理,并将处理后的词全部组成一个词包,里面包括了源文本以及查重文本的所有词。接着计算词频,利用循环算出词包中每个词在两篇文章中出现的次数并作为向量储存。

余弦相似度计算
通过利用numpy中的np.dot()(计算向量点积),np.linalg.norm()(计算平方和开根号),利用余弦函数表达式计算出重复率。
余弦函数表达式

代码实现:

程序运行截图

性能分析
利用pyCharm自带的Profile工具对代码进行性能分析,得到如下时间耗费:


由图可以看出,整个程序中耗费时间最长的就是文本转向量的计算函数,占据了程序运行的一大半时间。我本想在这里对代码进行修改,但是由于本人基础不够扎实,技术力不够,只能采用最笨的双重循环计算向量,难以在此进行优化。
文本转向量函数展示

部分单元测试展示
文本预处理


程序总覆盖率

异常处理
在这次程序实现中,我所考虑的最容易出现的异常,就是在输入路径的时候路径输入错误。为此我做了如下的异常处理

运行结果

心得
这次的个人项目作业,我充分认识到了我自己的不足。一是我编程底子非常薄弱,二是我数学基础不太熟练,编程思维不够灵活,三是我对相关工具的使用不够熟练。而且,这次我使用的是python来实现程序,但是我直到上个周末才刚开始学python。这对我来说是一次挑战。
虽然如此,我也从这次个人项目作业中学习到了许多的东西。我对Git的使用更加熟练了,对于pyCharm等开发工具还有命令行也更加熟悉了。而且我会像更多的人去请教,在向他人请教的过程中,我收益匪浅。
浙公网安备 33010602011771号