第一次个人项目作业

第一次个人编程作业

这个作业属于哪个课程 软件工程-19信安2
这个作业要求在哪里 作业要求
这个作业的目标 实现论文查重算法 + PSP表格 + 使用JProfiler性能分析 + GitHub管理

1、代码链接

SoftwareWork1.zip

2、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 90
· Estimate · 估计这个任务需要多少时间 30 30
Development 开发 450 540
· Analysis · 需求分析 (包括学习新技术) 60 90
· Design Spec · 生成设计文档 40 40
· Design Review · 设计复审 20 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 50 60
· Coding · 具体编码 360 420
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 240 240
Reporting 报告 50 70
· Test Report · 测试报告 20 40
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
· 合计 1450 1710

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

3.1 主要的类

  • MainPaperCompare类:main方法
  • Hamming类:计算海明距离
  • SimHash类:计算 SimHash 值
  • Txt类:读写 txt 文件
  • ShortStringException类:处理文本内容过短的异常
  • HtmlSpirit类:删除文档中的HTML标签

3.2 算法

  1. 算法简介

    • SimHash也即相似hash,是一类特殊的信息指纹,常用来比较文章的相似度,与传统hash相比,传统hash只负责将原始内容尽量随机的映射为一个特征值,并保证相同的内容一定具有相同的特征值。而且如果两个hash值是相等的,则说明原始数据在一定概率下也是相等的。但通过传统hash来判断文章的内容是否相似是非常困难的,原因在于传统hash只唯一标明了其特殊性,并不能作为相似度比较的依据。

    • SimHash最初是由Google使用,其值不但提供了原始值是否相等这一信息,还能通过该值计算出内容的差异程度。

  2. 算法原理

    • 分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。
    • hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。
    • 加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
    • 合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。
    • 降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
  3. 流程图

性能测试

  • 测试标准文本消耗

  • 测试HTML文本消耗

单元测试

  • 主方法测试
public void testOrigAndAll(){
        String[] str = new String[6];
        str[0] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig.txt");
        str[1] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig_0.8_add.txt");
        str[2] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig_0.8_del.txt");
        str[3] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig_0.8_dis_1.txt");
        str[4] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig_0.8_dis_10.txt");
        str[5] = Txt.readTxt("D:\\大学\\大三\\大三上\\软件工程\\测试文本\\orig_0.8_dis_15.txt");
        String ansFileName = "D:\\大学\\大三\\大三上\\软件工程\\测试文本\\result.txt";
        for(int i = 0; i <= 5; i++){
            double ans = Hamming.getSimilarity(SimHash.getSimHash(str[0]), SimHash.getSimHash(str[i]));
            Txt.writeTxt(ans, ansFileName);
        }
    }

异常处理

总结

  • 因为以前并没有试过类似的项目开发经验,很多东西都要重头摸索,包括算法的查询、实现、测试等,本次作业让我各方面能力都有了一定的增长。
posted @ 2021-09-18 00:09  .Soaring  阅读(64)  评论(0编辑  收藏  举报