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

    一、GitHub链接

    二、计算模块接口的设计与实现过程

    主要有三大类:

    simhash算法解释:

    • 本次个人编程项目主要采取simhash算法来计算文本相似度,在传统的simhash算法上进行了更改。

    • 算法关键:计算得到汉明距离

    • 最后由公式,将汉明距离带入x即可计算出文本相似度

    算法改进:

    • 不足:simhash算法在短文本上有着很大缺陷,比如:

      1.福大今天真不错
      2.福大今天真美丽
      

      可据上述流程图,最后两个文本的64位二进制码分别为:

      0001011101101001001110011100000100101000011100100110101111001100
      1011101111001111111110011101101100111101111100101010001011001100
      

      不同位数21位,即汉明距离为21,带入公式可得相似度约为0.0000007,可见若是对短文本使用simhash算法将会带来较大偏差。

    • 改进思路:在短文本的比对中引入新的适合算法,偷瞧了下前面同学的算法,觉定使用余弦相似度算法

    • 余弦相似度算法概要:

      • 对比较文本分词得到词表
      • 合并去重
      • 计算特征值并向量化
      • 计算余弦值:

    三、计算模块接口部分的性能改进

    由于相似度计算的模糊性,无法给出特定的某个数值来决定具体字数使用两者算法的准确度。改为测试字符数对效率的影响,可知当字符数大于3000时,simhash效率开始明显高于余弦相似度,因此本次项目将阈值设为3000.在3000字符数以下使用余弦相似度算法,以上使用simhash算法

    性能分析:

    • 总览:大概在2s左右完成,符合要求

    • 类内存消耗:绝大部分消耗在了分词

    四.计算模块部分单元测试展示

    • 给出的示例文本测试

      /**
           * 测试给出的示例原本
           */
          @Test
          public void simTest() throws IOException {
              File folder = new File("src/TestFile/sim_0.8");
              File[] files = folder.listFiles();
              for(File file:files){
                  if(file == files[0]){
                      continue;
                  }
                  System.out.println(files[0].getName()+" 与文本 " + file.getName() + "的相似度为:");
                  Unit.ans(files[0].getPath(),file.getPath());
                  System.out.println("-----------------------------");
              }
          }
      

    • 测试3000字以下使用余弦相似的算法:

      /**
           * 在3000字符下文本的比较(使用余弦相似度算法)
           */
          @Test
          public void CosTest() throws IOException {
              File folder = new File("src/TestFile/costest");
              File[] files = folder.listFiles();
              for(File file:files){
                  if(file == files[0]){
                      continue;
                  }
                  System.out.println(files[0].getName()+" 与文本 " + file.getName() + "的相似度为:");
                  Unit.ans(files[0].getPath(),file.getPath());
                  System.out.println("-----------------------------");
              }
          }
      

      - 注:sim和cos分别为simhash算法和余弦相似度算法所放的包,故存在覆盖率为0的情况
      

    五、异常类(空文本报错)

    public class CommonException extends RuntimeException {
        public CommonException(String message) {
            super(message);
        }
    
        public CommonException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    
    if(text1.length() == 0 || text2.length() == 0){
                throw new CommonException("文本为空");
            }
    

    六、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 40 30
    · Estimate · 估计这个任务需要多少时间 5 5
    Development 开发 240 150
    · Analysis · 需求分析 (包括学习新技术) 300 360
    · Design Spec · 生成设计文档 30 90
    · Design Review · 设计复审 30 30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 10
    · Design · 具体设计 120 60
    · Coding · 具体编码 240 200
    · Code Review · 代码复审 60 30
    · Test · 测试(自我测试,修改代码,提交修改) 60 90
    Reporting 报告 40 100
    · Test Repor · 测试报告 20 20
    · Size Measurement · 计算工作量 15 10
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 120 60
    · 合计 1350 1245
  • 相关阅读:
    Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
    HDU 1281 棋盘游戏 【二分图最大匹配】
    Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
    Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】
    Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) 【思维】
    Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
    Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
    Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
    005 如何分析问题框架
    004 如何定义和澄清问题
  • 原文地址:https://www.cnblogs.com/ThreeSmall/p/13675781.html
Copyright © 2011-2022 走看看