zoukankan      html  css  js  c++  java
  • 第一次个人编程作业

    一:超链接

    Github仓库

    二:实现过程、方法阐述

    实现过程:

    方法阐述:
    编写一个文章查重方法的测试代码,在百度上搜索许久之后,发现使用余弦定理计算文本相似度是最容易理解并编写改程序的。故得以实现。
    所谓的利用余弦定理,简单来说,就是用向量的方向计算来比较两篇文本的相似度,详细的解释可以参照。

    三:异常处理、函数分析、性能改进

    异常处理:

    try:
        f=open(output,"w")
        f.write(result+"
    ")
        f.close()
        print("结果已存入文件夹中")
    except IOError:
        print("Error: 没有找到文件或读取文件失败")
    

    异常处理的函数,可以防止编译时地址等等出错的问题。
    函数分析:

    def __init__(self, target1, target2, topK=1000):
          self.target1 = target1
          self.target2 = target2
          self.topK = topK
    

    target1和target2分别为对比的两篇文章样本,topK为将提取出前面1000个出现多次的关键字词。

    def vector(self):
          self.vdict1 = {}
          self.vdict2 = {}
          top_keywords1 = jieba.analyse.extract_tags(self.target1, topK=self.topK, withWeight=True)
          top_keywords2 = jieba.analyse.extract_tags(self.target2, topK=self.topK, withWeight=True)
          for k, v in top_keywords1:
              self.vdict1[k] = v
          for k, v in top_keywords2:
              self.vdict2[k] = v
    

    利用jieba.analyse库对文本拆分,并且得到分别出现的次数再返回这些需要用到的值。

    def mapminmax(vdict):
           _min = min(vdict.values())
           _max = max(vdict.values())
           _mid = _max - _min
           for key in vdict:
               vdict[key] = (vdict[key] - _min) / _mid
           return vdict
    

    计算相对的词频并且得到最后的数据。

    def similar(self):
          self.vector()
          self.mix()
          sum = 0
          for key in self.vdict1:
              sum += self.vdict1[key] * self.vdict2[key]
          A = sqrt(reduce(lambda x, y: x + y, map(lambda x: x * x, self.vdict1.values())))
          B = sqrt(reduce(lambda x, y: x + y, map(lambda x: x * x, self.vdict2.values())))
          return sum / (A * B)
    

    相似度的计算,利用的是文章相似度的计算公式。
    性能改进:



    从每个函数消耗的时间来看,总耗时2518ms,时间消耗比较大的函数有__init__,similar,vector等等函数,但是在查询了很多种方法之后,在目前我的认知来看,已经是最优的结果了,在python函数上面各种库的使用,既要保证代码的规范与简单,又要保证时间和内存的优越性,所以这已经是最好的结果了。

    四:单元测试展示

    下面是单元测试的执行代码

    from __future__ import division
    from math import sqrt
    import jieba.analyse
    from functools import reduce
     
    if __name__ == '__main__':
        f1=open("D:PythonFirstcodeorig.txt","r",encoding='UTF-8')
        f2=open("D:PythonFirstcodeorig_0.8_add.txt","r",encoding='UTF-8')
        f3 = open("D:PythonFirstcodeorig_0.8_del.txt", "r", encoding='UTF-8')
        f4 = open("D:PythonFirstcodeorig_0.8_dis_1.txt", "r", encoding='UTF-8')
        f5 = open("D:PythonFirstcodeorig_0.8_dis_3.txt", "r", encoding='UTF-8')
        f6 = open("D:PythonFirstcodeorig_0.8_dis_7.txt", "r", encoding='UTF-8')
        f7 = open("D:PythonFirstcodeorig_0.8_dis_10.txt", "r", encoding='UTF-8')
        f8 = open("D:PythonFirstcodeorig_0.8_dis_15.txt", "r", encoding='UTF-8')
        f9 = open("D:PythonFirstcodeorig_0.8_mix.txt", "r", encoding='UTF-8')
        f10 = open("D:PythonFirstcodeorig_0.8_rep.txt", "r", encoding='UTF-8')
        t1=f1.read()
        t2=f2.read()
        t3=f3.read()
        t4=f4.read()
        t5=f5.read()
        t6=f6.read()
        t7=f7.read()
        t8=f8.read()
        t9=f9.read()
        t10=f10.read()
        f1.close()
        f2.close()
        f3.close()
        f4.close()
        f5.close()
        f6.close()
        f7.close()
        f8.close()
        f9.close()
        f10.close()
        topK = 1000
        s = Similarity(t1, t2, topK)
        result = s.similar()
        print('%.2f' % result)
        s = Similarity(t1, t3, topK)
        result3=s.similar()
        print('%.2f' %result3)
        s = Similarity(t1, t4, topK)
        result4 = s.similar()
        print('%.2f' % result4)
        s = Similarity(t1, t5, topK)
        result5 = s.similar()
        print('%.2f' % result5)
        s = Similarity(t1, t6, topK)
        result6 = s.similar()
        print('%.2f' % result6)
        s = Similarity(t1, t7, topK)
        result7 = s.similar()
        print('%.2f' % result7)
        s = Similarity(t1, t8, topK)
        result8 = s.similar()
        print('%.2f' % result8)
        s = Similarity(t1, t9, topK)
        result9 = s.similar()
        print('%.2f' % result9)
        s = Similarity(t1, t10, topK)
        result10 = s.similar()
        print('%.2f' % result10)
    

    结果展示

    五:PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 60
    Estimate 估计这个计划需要多少时间 30 30
    Development 开发 210 220
    Analysis 需求分析 500 480
    Design Spec 生成设计文档 45 40
    Design Review 设计复审 30 30
    Coding Standard 代码规范 60 60
    Design 具体设计 120 120
    Coding 具体编码 120 120
    Code Review 代码复审 30 30
    Test 测试 120 200
    Reporting 报告 20 20
    Test Report 测试报告 30 30
    Size Measurement 计算工作量 20 20
    Postmortem&Process Improvement Plan 事后总结,并提出过程改进过程 30 50
    合计 1425 1510

    六:总结

    首先在切入题目的时候就琢磨了很久,特别是第一次用测试的软件,之前完全没有用过所以折腾了好久才出来了这个东西。为了完成这次的代码作业,我看了大量的博客,疯狂的找到自己需要的文案与方法,并加以融合改进。最后在改进代码的环节上,再一次次不影响原本函数的可读性和可操作性的方面,也没有太多的地方能进行修改。这里面有太多自己需要学习的知识了,总感觉做的还不够。总之能这次在花了大量的时间的基础上,把这次的实验做到尽量的复合自己当初设计的要求。(/ω\)

  • 相关阅读:
    PHP笔记2__变量/字符串/类型转换/常量/,,
    hdu 5108 Alexandra and Prime Numbers(水题 / 数论)
    C#课程设计----------C#学生成绩管理系统
    Java各种学习资源(视频+文档)
    基于慕课网-----Java验证码的实现
    数组prototype添加函数呢,采用回调判定函数内容
    js正则表达式
    jsunit测试
    bind,call,apply区别
    JS技巧
  • 原文地址:https://www.cnblogs.com/Fzu-hwl/p/13668139.html
Copyright © 2011-2022 走看看