第一次个人编程作业

这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业要求
这个作业的目标 论文查重个人项目 + 单元测试 + PSP表格 + Git管理 + 性能测试
作业代码链接

github

作业的要求

题目:论文查重
描述如下:

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:

从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。

注意:答案文件中输出的答案为浮点型,精确到小数点后两位

思路

1)打开源文本和查重文本,分别用读取里面的内容,关闭文本。
2)用正则表达式去除(除文字以外的)所有标点符号、数字、字母,因为粗略翻看了一下所给的示例,发现都是基于源文本修改或者增加一些标签来混淆而已,发现留着这些也没用,核心的东西还是文字,就只提取出文字。
3)用jieba进行文本处理
4)用similarity计算文本相似度

实现

读取文件

用正则清理文本数据

正则表达式:是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定的字符,及这些特定字符的组合,组成一个“规则字符串,这个”规则字符串“用来表达对字符串的一种过滤逻辑
\u4e00-\u9fa5 这两个unicode值正好是unicode表中的汉字的头和尾

jieba分词


(这里采用的是精确模式)

jieba库分词的三种模式
1)精准模式 jieba.lcut() :把文本精确的分开,不存在冗余
2)全模式 jieba.lcut(s,cut_all=True) :把文中所有可能的词语都扫描出来,存在冗余
3)搜索引擎模式 jieba.lcut_for_search(s) :在精准模式的基础上,再次对长词进行切分
举例:

计算相似度

把结果写进新的文件

结果

命令行输入三个文件绝对路径

结果存放在result.txt

可以看到所给示例第一个文本orig.txt和第二个文本orig_0.8_add.txt的相似度很高。
运行结果符合预期。

性能分析

利用pycharm中的插件查看各个部分的耗费时间

代码覆盖率


代码覆盖率100%,满足要求

单元测试

清理文本数据

文本向量化处理

计算模块

异常处理


用于检验所输入的文件路径是否正确,文件是否存在

PSP表
PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 60
Estimate 估计这个任务需要多少时间 150 150
Development 开发 360 480
Analysis 需求分析 (包括学习新技术) 600 360
Design Spec 生成设计文档 180 240
Design Review 设计复审 30 40
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 10
Design 具体设计 30 20
Coding 具体编码 150 180
Code Review 代码复审 60 30
Test 测试(自我测试,修改代码,提交修改) 120 120
Reporting 报告 30 20
Test Repor 测试报告 20 10
Size Measurement 计算工作量 5 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 5 5
合计 1710 1735
总结

这次的作业对我个人而言难度还是蛮大的,因为“菜是原罪”hhh,对python语言的运用不熟悉,对模型的建立反应迟钝,在计算相似度的时候,尝试建立TFIDF模型来计算,这里卡了好久,感觉代码没有错,各个部分单独输出也没有错,但是文本相似度怎么算都是0,最后还是参考了别的大佬的代码才算出相似度的。
这次作业收获颇多,但也是真的累,至少让我见了很多之前没接触过也没尝试过的东西,还是要加油哇!!!

posted @ 2020-09-25 00:38  平平无奇小咸鱼  阅读(111)  评论(0)    收藏  举报