第一次个人编程作业
| 这个作业属于哪个课程 | 班级链接 |
|---|---|
| 这个作业要求在哪里 | 作业要求链接 |
| 这个作业的目标 | 设计一个论文查重算法,完成一次个人项目的开发 |
一、Github链接:3122004784
二、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 60 |
| · Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
| Development | 开发 | 120 | 160 |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | 150 |
| · Design Spec | · 生成设计文档 | 20 | 20 |
| · Design Review | · 设计复审 | 30 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 10 |
| · Design | · 具体设计 | 60 | 45 |
| · Coding | · 具体编码 | 120 | 150 |
| · Code Review | · 代码复审 | 20 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改 | 15 | 10 |
| Reporting | 报告 | 60 | 45 |
| · Test Repor | · 测试报告 | 120 | 150 |
| · Size Measurement | · 计算工作量 | 30 | 40 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 70 |
| · 合计 | 870 | 960 |
三、计算模块接口的设计与实现过程
1.设计原理
计算两篇论文中词语的频率,然后将频率转换为向量形式,最后用余弦相似性测量两个向量的夹角的余弦值来度量它们之间的相似性。
2.实现过程
(1)预处理文本
将中文文本去除标点符号和空格,并使用中文分词库jieba将文本分成单词,然后过滤掉常用停用词。这一步的目的是将文本转换成一个词序列,方便后续的相似度计算。
(2)计算词语出现频率
计算每个词在文本中出现的次数,并将其存储为一个字典,键为词,值为出现次数。
(3)计算余弦相似度
首先计算两篇论文中词语的频率,然后使用余弦相似度公式计算相似度。在余弦相似度公式中,分子表示向量点积,即两个向量中对应位置元素的乘积之和;分母表示向量长度,即各个元素的平方和的平方根。
运行程序后,在一行中输入原文地址 抄袭论文地址 答案文件地址,三个绝对路径用空格隔开。



3.算法关键
(1)文本清洗
使用正则表达式提取文本中的汉字,去除其他字符。这一步确保后续处理专注于中文内容,减少噪音影响。
(2)中文分词
采用 jieba 库进行分词,适应中文语言的特性。分词的效果直接影响相似度计算的准确性,因此保证了处理的准确性。
(3)Simhash 算法
利用 Simhash 生成文本的指纹,通过计算文本的哈希值来量化文本特征。Simhash 特别适合大规模文本相似度比较,因为它通过将文本转换为固定长度的哈希值(通常为64位)来实现高效计算。
(4)海明距离计算
计算两个 Simhash 值之间的海明距离,海明距离较小意味着文本相似度较高。通过这种方式,算法能够有效识别出相似或抄袭的文本。
(5)相似度的量化
通过将海明距离转换为相似度值(0到1之间),并进一步转换为百分比(0%到100%),使得结果易于理解和使用。
4.独到之处:
(1)高效性:
Simhash 和海明距离的结合使得算法在处理大规模文本时具有较高的效率,能够快速得出相似度结果。
(2)适应性:
预处理步骤确保算法不受编码、格式等因素的干扰,专注于中文的核心内容。
(3)友好的用户界面:
采用命令行参数,使得用户体验简便,方便调用和集成。
四、性能分析

消耗最大的函数:程序主要消耗函数是外部依赖汉语言处理提供的接口,即分词模块,所以整体没有改进必要。
五、举例测试
Text代码


六、异常处理



浙公网安备 33010602011771号