第一次个人编程作业

一、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
posted @ 2020-09-15 21:32    阅读(265)  评论(0编辑  收藏  举报