个人项目——论文查重

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目--论文查重
这个作业的目标 个人编程实现论文查重算法并进行测试检验

一、项目链接

GitHub

二、PSP表格

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

三、分包、接口设计与实现

image

  • TxtUtil包:进行文本的读入读出

  • main主类进行cmd的运行

  • test包,里面的测试类

四、性能改进

从各个图我们可以得知,测试良好

比较占用资源的是,获取哈希值,分词过程,由于调用别人写好的包,没什么大的改进。

image
image
image

五、单元测试展示

image

image

  • cmd单独测试:
    image

image

  • 覆盖率:
    image

六、异常处理说明

public static String getSimHash(String str) {
        // 文本长度太短时HanLp无法取得关键字
        try {
            if (str.length() < 200) throw new ShortStringException("文本过短,难以判断!");
        } catch (ShortStringException e) {
            e.printStackTrace();
            return null;
        }

七、算法原理

具体实现:见仓库代码

  1. 分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

  2. hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。

  3. 加权,通过 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 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”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

  5. 降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

posted @ 2023-09-14 22:18  huangmengsha  阅读(52)  评论(0编辑  收藏  举报