第一次个人编程作业-论文查重

黄华健 2023-03-08 23:29:33

软件工程第一次作业

  • 0.作业基本信息
  • 1.PSP表格
  • 2.计算模块接口的设计与实现过程
  • 2.1设计原理
  • 2.2实现过程
  • 3.性能分析
  • 4.举例测试
  • 5.单元测试
  • 6.计算模块部分异常处理说明

0.作业基本信息

这个作业属于哪个课程班级的链接
这个作业要求在哪里作业要求的链接
这个作业的目标设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率
其他参考文献

代码仓库地址

1.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6060
· Estimate· 估计这个任务需要多少时间360400
Development开发120160
· Analysis· 需求分析 (包括学习新技术)120150
· Design Spec· 生成设计文档2020
· Design Review· 设计复审3020
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1510
· Design· 具体设计6045
· Coding· 具体编码120150
· Code Review· 代码复审3040
· Test· 测试(自我测试,修改代码,提交修改)6070
Reporting报告6080
· Test Repor· 测试报告2025
· Size Measurement· 计算工作量3040
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3040
· 合计11351310

2.计算模块接口的设计与实现过程

2.1设计原理

计算两篇论文中词语的频率,然后将频率转换为向量形式,最后用余弦相似性测量两个向量的夹角的余弦值来度量它们之间的相似性。

2.2实现过程

1.预处理文本
  将中文文本去除标点符号和空格,并使用中文分词库jieba将文本分成单词,然后过滤掉常用停用词。这一步的目的是将文本转换成一个词序列,方便后续的相似度计算。
2.计算词语出现频率
  计算每个词在文本中出现的次数,并将其存储为一个字典,键为词,值为出现次数。
3.计算余弦相似度
  首先计算两篇论文中词语的频率,然后使用余弦相似度公式计算相似度。在余弦相似度公式中,分子表示向量点积,即两个向量中对应位置元素的乘积之和;分母表示向量长度,即各个元素的平方和的平方根。

一个functions类中有三个函数
分别为preprocess(),get_word_freq(),cosine_similarity(),cosine_similarity()函数中调用了前两个函数

运行程序后,在一行中输入原文地址 抄袭论文地址 答案文件地址,三个绝对路径用空格隔开。

关键函数为cosine_similarity()函数
流程图如下

在这里插入图片描述

算法中对文本进行了预处理,去除标点符号和空格并过滤掉常用停用词,能使查重结果更准确。

3.性能分析

用pycharm的Profile插件对程序进行性能分析

img

程序中消耗最大的函数是cosine_similarity()函数

    def cosine_similarity(self, text1, text2):
        try:
            # 计算余弦相似度
            words1 = Functions.preprocess(self, text1)
            words2 = Functions.preprocess(self, text2)

            # 计算词语频率
            words1_freq = Functions.get_word_freq(self, words1)
            words2_freq = Functions.get_word_freq(self, words2)

            # 计算向量点积
            dot_product = 0
            for word in words1_freq:
                if word in words2_freq:
                    dot_product += words1_freq[word] * words2_freq[word]

            # 计算向量长度
            words1_length = math.sqrt(sum([freq ** 2 for freq in words1_freq.values()]))
            words2_length = math.sqrt(sum([freq ** 2 for freq in words2_freq.values()]))

            # 计算余弦相似度
            cosine_sim = dot_product / (words1_length * words2_length)
            return round(cosine_sim, 2)  # 结果保留两位小数
        except:
            print("传入参数错误")

4.举例测试

对wen1.txt和wen2.txt两个文本进行查重,并把查重率写入答案文档

img

5.单元测试

对cosine_similarity()进行测试
对已知查重率的文本进行测试,看测试结果是否正确
测试代码

import unittest
from test_cosine_similarity import cosine_similarity
class MyTestCase(unittest.TestCase):
    def test_something(self):
        article1, article2, ans = input('请输三个地址:').split()
        # 读取文本文件
        with open(article1, 'r', encoding='utf-8') as f1, open(article2, 'r', encoding='utf-8') as f2:
            texta = f1.read()
            textb = f2.read()
        # 计算余弦相似度
        cos_sim = cosine_similarity(texta, textb)
        f1.close()
        f2.close()
        self.assertEqual(cosine_similarity(texta,textb),0.94)

if __name__ == '__main__':
    unittest.main()

img

img

代码覆盖率

img

6.计算模块部分异常处理说明

在模块函数中进行异常检测,检测出错误即提示传入参数错误

在这里插入图片描述

img

在主函数中进行异常检测,检测文件是否存在,检测出错误即提示文件不存在

在这里插入图片描述


img

...全文
65 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

192

社区成员

发帖
与我相关
我的任务
社区描述
广工软工21级3、4班,软件工程课程学习、训练、讨论交流社区
软件工程 高校 广东省·广州市
社区管理员
  • ryue.zh
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧