第一次个人编程作业

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了第一次个人编程作业脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

个人第一次编程作业

这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业链接
这个作业的目标 论文查重算法设计+学习PSP表格+单元测试+JPRofiler性能分析+GIT管理

PSP表格

PSP2.1 PErsonal Software Process Stage 预估耗时(分钟 实际耗时(分钟)
Planning 计划 20 30
EstiMATE 估计这个任务需要多少时间 60 60
Development 开发 600 600
Analysis 需求分析 (包括学习新技) 240 300
Design Spec 生成设计文档 70 60
Design review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 20
Design 具体设计 60 70
Coding 具体编码 200 240
Code Review 代码复审 40 60
test 测试(自我测试,修改代码,提交修改) 240 300
Reporting 报告 160 180
Test Repor 测试报告 60 60
Size Measurement 计算工作量 40 40
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 60
合计 1910 2110

作业需求:

题目:论文查重

描述如下:

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

- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看影。

要求输入输出采用文件输入输出,规范如下:

- 从**命令行参数**给出:论文原文的文件的**绝对路径**。
- 从**命令行参数**给出:抄袭版论文的文件的**绝对路径**。
- 从**命令行参数**给出:输出的答案文件的**绝对路径**。

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

实现思路及代码实现:

需求是实现一个论文查重算法,网上查找相关资料后发现Simhash算法(一种局部敏感hash算法)可以用于实现计算文本查重率。其核心思想是对我们输入的文本进行降维,提取出一些低维的特征向量,通过两个文件提取出来的特征向量的汉明距离来确定输入的文本是否高度相似。

第一次个人编程作业

simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述:

  • 分词与分权:

    • 对我们输入的语句进行分词,也就是提取一些关键词,去掉一些无用词,生成多个高维特征向量,然后为每一个特征向量设置权重(权重就是该词在文中出现的比例,出现次数越多比例就越大)。权重代表着这短语在整个语句中的重要程度,数字越大就表示越重要。

      第一次个人编程作业

      该函数的流程是对我们传入的参数,打开相对应的文件,返回相对应的对象,然后把文件的每一行的一些常用的标点符号和和英文字母和数字去掉,然后再把从我们的停词库中读取停词,把我们输入的文件过滤掉相同的词,停词就是一些对论文实质内容没有什么意义的词,如:”上 下 不 不仅 不但 不光 不单 不只 不外乎“等,在这里我是用了jieba这个Python中文分词组件和GitHub的断词库。然后就可以提取出我们的关键词,然后为每个关键词设置权重等级(1-50),然后返回生成的词典和权重等级。

  • hash与加权

    • 通过hash函数计算各个从分词而来的特征向量的hash值,hash值为二进制数01组成的n-bit签名。在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。就这样,字符串就变成了一系列数字。由于实现代码较长就不贴代码,贴图。

      第一次个人编程作业

    @H_360_254@

  • 合并

    • 将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。
    • 第一次个人编程作业

  • 降维

    • 对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。

      第一次个人编程作业

      • 最后就是可以生成海明距离进行计算:

      第一次个人编程作业

  • 然后再用两近似度相除,就可得到相似度了。

性能分析:

由于用vscode写的python没有找到什么合适的性能分析工具,就随便pip个python的包,生成一个火焰图:

第一次个人编程作业

占用最高的是我们的main函数,涉及了文件的读写可能比较慢。未发现能改进的地方,只能再读写的时候加个try语句提供异常处理。

单元测试与异常处理

1.参数少传错误:

第一次个人编程作业

2.传送不存在的文件路径:

第一次个人编程作业

3.相同文件比较:

第一次个人编程作业

4.示例文本比较:

第一次个人编程作业

脚本宝典总结

以上是脚本宝典为你收集整理的第一次个人编程作业全部内容,希望文章能够帮你解决第一次个人编程作业所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。