• 第一次个人编程作业


    一、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
  • 相关阅读:
    Effective C++笔记_条款25考虑写出一个不抛出异常的swap函数
    SilverLight小游戏
    可分片数据持久层ShardingPL使用说明
    r.a.d controls 学习笔记 - radcombobox + RadWindowManager 组成的参照控件
    用 .Net Remoting 技术实现“定向广播”
    Silverlight中的资源文件
    一个丑陋的对Silverlight中的Grid无CellPadding的解决方案
    几个小问题
    .Net Remoting 排错笔记:An existing connection was forcibly closed by the remote host
    .Net Remoting 排错笔记:The constructor to deserialize an object of type 'xxx.xxxx.xxxxx' was not found.
  • 原文地址:https://www.cnblogs.com/ThreeSmall/p/13675781.html
Copyright © 2020-2023  润新知