个人项目

所属课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34
作业要求 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229
作业目标 学会github的使用,熟悉markdown格式,熟悉个人开发流程,了解项目单元测试

Github链接: https://github.com/Qiteng925/Qiteng925

运行环境:MAC OS操作系统 IntelliJ IDEA 2022

1.PSP表格

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

2. 模块接口设计

2.1 流程图

2.2 算法实现

利用SimHash和海明距离,通过具体分析与实现,使用海明距离来衡量文本内容的相似度。

算法关键

  1. 分词:使用糊涂工具包中的TokenizerEngine进行分词处理,并通过hankc作为分词工具,遍历词汇和词频的结果树,计算余弦相似度。

  2. 计算文本相似度:采用如下的向量余弦计算模型来衡量文本相似度。

参考资料:SimHash原理

2.3 类

类名 分类
Main 主函数类
FileUtil 工具类
SimHashUtil 工具类

![image-20240914200200366](/Users/yiyan/Library/Application Support/typora-user-images/image-20240914200200366.png)

2.4 函数

函数名 功能 归属的类
readFile() 读取文件 FileUtil类
writeFile() 写入文件 FileUtil类
getHash() 计算字符串的hash值并输出字符串 SimHashUtil类
getSimHash() 计算simHash值并输出字符串 SimHashUtil类
getHammingDistance() 比较两个simHash值,计算它们的海明距离 SimHashUtil类
getSimilarity() 计算相似度 SimHashUtil类

函数之间的关系

getSimHash() 函数内部调用了 getHash() 函数,而 getHammingDistance() 的输入则是 getSimHash() 的输出结果。

关键函数流程图(SimHashUtil函数)

3. 代码性能分析图

通过观察性能分析图,我对代码进行了微调,从而实现了程序的优化。

4. 单元测试展示

4.1 测试代码

工具类

public class FileUtilTest {
    @Test
    public void test01(){
        try {
            FileUtil.readFile("/Users/yiyan/Desktop/3122004761.txt/src/main/java/com/example/papercheck/测试文本/aaa.txt");
        } catch (IOException e) {
            System.out.println("文件不存在");
        }catch (FileIsNotTxtException e){
            System.out.println("文件格式不对");
        }
    }

    @Test
    public void test02(){
        try {
            FileUtil.readFile("/Users/yiyan/Desktop/3122004761.txt/src/main/java/com/example/papercheck/测试文本/orig.doc");
        } catch (IOException e) {
            System.out.println("文件不存在");
        }catch (FileIsNotTxtException e){
            System.out.println("文件格式错误");
        }
    }

}

核心类

public class MainTest {

    @Test
    public void test01() {
        String[] example = new String[3];
        example[0] = "/Users/yiyan/Desktop/3122004761/src/main/java/com/example/papercheck/测试文本/orig.txt";
        example[1] = "/Users/yiyan/Desktop/3122004761/src/main/java/com/example/papercheck/测试文本/orig_0.8_add.txt";
        example[2] = "/Users/yiyan/Desktop/3122004761/src/main/java/com/example/papercheck/测试文本/ans.txt";
        mainTest(example);
    }

    public void mainTest(String[] example) {
        String[] s = example;
        String simHash0;
        String simHash1;
        String str0;
        String str1;
        //if (args.length < 3) return;
        try {
            str0 = FileUtil.readFile(s[0]);
            str1 = FileUtil.readFile(s[1]);
        } catch (IOException e) {
            System.out.println("找不到指定文件");
            return;
        } catch (FileIsNotTxtException e) {
            System.out.println("文件格式错误");
            return;
        }

        simHash0 = SimHashUtil.getSimHash(str0);
        simHash1 = SimHashUtil.getSimHash(str1);

        double similarity = SimHashUtil.getSimilarity(simHash0, simHash1);
        System.out.print("相似度: ");
        System.out.println(similarity);
        try {
            FileUtil.writeFile(s[2], String.valueOf(similarity));
            System.out.println("结果写入文件 "+s[2]+" 完成");
        } catch (IOException e) {
        }
        System.out.println("计算结束,程序自动退出");
    }
}

4.2 测试结果

文件工具类测试

查重测试

ans.txt

4.3 测试覆盖率

5.异常处理

文件不存在异常设计

class FileIsNotTxtException extends Exception {
    public FileIsNotTxtException() {
        super();
    }
}

异常处理示例

文件不存在

@Test
public void test01(){
    try {
        FileUtil.readFile("/Users/yiyan/Desktop/3122004761.txt/src/main/java/com/example/papercheck/测试文本/aaa.txt");
    } catch (IOException e) {
        System.out.println("文件不存在");
    }catch (FileIsNotTxtException e){
        System.out.println("文件格式不对");
    }
}

文件格式异常

@Test
public void test02(){
    try {
        FileUtil.readFile("/Users/yiyan/Desktop/3122004761.txt/src/main/java/com/example/papercheck/测试文本/orig.doc");
    } catch (IOException e) {
        System.out.println("文件不存在");
    }catch (FileIsNotTxtException e){
        System.out.println("文件格式错误");
    }
}

6. 作业总结

通过查阅资料,我学会了如何使用 GitHub,并掌握了软件项目的基本流程。借助 PSP 表格,我对时间的分配有了更清晰的认识。此外,我还学习了如何使用 Jprofiler 进行性能测试,以及掌握了 Maven 作为项目管理工具的使用。希望在接下来的课程学习中,能够进一步深入理解软件工程的相关知识。

posted @ 2024-09-14 20:53  爱喝茶的瓜仔  阅读(4)  评论(0编辑  收藏  举报