个人项目作业-论文查重(作业补交)

詹万森 2022-12-29 00:40:36

1.作业信息

  • 作业信息
    这个作业属于哪个课程软件工程
    这个作业要求在哪里个人项目作业
    这个作业的目标设计一个论文查重算法
    仓库 链接仓库

    2.项目地址

  • 仓库
    仓库

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

simHash算法共有5个步骤:分词、hash、加权、合并、降维

  • 关键函数
    main.py里有四个函数:
    • 1.def getWords(text) —— 分词
    • 2.def getSimh(s) —— hash、加权、合并、降维
    • 3.def getSimilarity(simh1, simh2) —— 计算海明距离和相似度
    • 4/def main_project() —— 主函数入口
    • 5.def test() —— 测试接口

simHash算法:首先文本的内容经过splitWords函数进行分词操作,之后getSimh函数计算分词过后文本的hash值,并进行
加权、合并和降维操作,最后通过调用getSimilarity函数,其中以getSimh处理过后的hash值作为传参,得到海明距离,从而
计算出相似度。
simHash算法的独特之处在于,相较于其他传统的hash算法,simHash算法计算出两个文本之间的hash值差距比较小,这样能够
更加精确的计算出文本之间的相似度。

  • 命令行测试
    格式:python main.py [原文文件] [抄袭版论文的文件] [答案文件]

img

4. 计算模块接口部分的性能改进

  • 性能分析
    使用profile方法进行性能分析

img

  • 性能改进

img

其中getWords函数耗时最多,则用正则表达式匹配过滤对其改进

  • 原始代码:

    def getWords(text):
        with open(text, 'r', encoding='UTF-8') as f1:
            f2 = f1.read()   f1.close()
        length = len(list(jieba.lcut(f2))) 
        s = jieba.analyse.extract_tags(f2, topK=length) 
    
  • 改进代码:

    def getWords(text):
        with open(text, 'r', encoding='UTF-8') as f1:
    
            f2 = f1.read()
        pattern = re.compile(u"[^a-zA-Z0-9\u4e00-\u9fa5]")  
        s = pattern.sub("", f2)
        f1.close()
        length = len(list(jieba.lcut(s)))
        string = jieba.analyse.extract_tags(s, topK=length) 
    

    先用正则表达式匹配过滤,再用jieba.lcut来处理,提高效率。从结果可知,改进后的算法较之前的算法提升了几百ms。

5. 单元测试

构建一个test()函数用来专门测试,然后构建一个test.py文件,定义一个testSimHash测试类,测试的方法提供至少10个,具体的代码如下所示:

  • test()函数代码
def test():
    path1 = input("请输入论文原文的路径:")
    path2 = input("请输入抄袭论文的路径:")
    path3 = 'save.txt'
    simhash1 = getSimh(splitWords(path1))
    simhash2 = getSimh(splitWords(path2))
    s1 = getSimilarity(simhash1, simhash2)
    s2 = round(s1, 2)  
    print('文章相似度为:%f' % s2)
    with open(path3, 'a', encoding='utf-8')as f: 
        f.write(path2 + '与原文的相似度为:')
        f.write(json.dumps(s2, ensure_ascii=False) + '\n')
    return s2
  • testSimHash类代码
 class testSimHash(unittest.TestCase):
   def test_1(self):
       self.assertEqual(test(), 0.70)

   def test_2(self):
       self.assertEqual(test(), 0.71)

   def test_3(self):
       self.assertEqual(test(), 0.79)

   def test_4(self):
       self.assertEqual(test(), 0.65)

   def test_5(self):
       self.assertEqual(test(), 0.55)

   def test_6(self):
       self.assertEqual(test(), 0.30)

   def test_7(self):
       self.assertEqual(test(), 0.35)

   def test_8(self):
       self.assertEqual(test(), 0.85)

   def test_9(self):
       self.assertEqual(test(), 0.77)

   def test_10(self):
       self.assertEqual(test(), 0.89)
  • 测试结果

img

  • 代码测试覆盖率

img

6. 异常处理

  • 在命令行以“python main.py [原文文件] [抄袭版论文的文件] [答案文件]”的格式运行程序不会出错,但在pycharm中运行报错。

img

  • 原因:在读取指定文件时,文件路径不存在,程序出现异常。

  • 解决方法:用input()语句接收输入,一段时间后未输入则跳出,并引入os.path.exists()方法用于检验文件是否存在,若不存在则做出响应并且结束程序。

  • 代码修改如下:

    def test():
        path1 = ','.join(sys.argv[1:2]) 
        path2 = ','.join(sys.argv[2:3])
        path3 = ','.join(sys.argv[3:])
    +    if not os.path.exists(path1):
    +       print("论文原文不存在!")
    +       exit()
    +   if not os.path.exists(path2):
    +       print("抄袭论文不存在!")
    +       exit()
        simhash1 = getSimh(splitWords(path1))
        simhash2 = getSimh(splitWords(path2))
        s1 = getSimilarity(simhash1, simhash2)
        s2 = round(s1, 2) 
        print('文章相似度为:%f' % s2)
        with open(path3, 'a', encoding='utf-8')as f:  
            f.write(path2 + '与原文的相似度为:')
            f.write(json.dumps(s2, ensure_ascii=False) + '\n')
        return s2
    
  • 修改后程序正常运行:

img

6. PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3010
Estimate估计这个任务需要多少时间22202060
Development开发12001000
Analysis需求分析 (包括学习新技术)240360
Design Spec生成设计文档6030
Design Review设计复审3050
Coding Standard代码规范 (为目前的开发制定合适的规范)3030
Design具体设计6030
Coding具体编码200240
Code Review代码复审6030
Test测试(自我测试,修改代码,提交修改)12080
Reporting报告9090
Test Repor测试报告6080
Size Measurement计算工作量1010
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6030
合计22202060
...全文
267 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

203

社区成员

发帖
与我相关
我的任务
社区描述
高校教学社区
其他 高校 广东省·广州市
社区管理员
  • ryue.zh
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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