第一次个人编程作业

作业github链接

这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业要求
这个作业的目标 学习建立简易工程项目

一、PSP表格

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

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

思路参考:余弦相似度(Cosine Similarity) - CSDN

三、计算模块接口部分的性能改进

如图,调用最多的是byte[]和String

四、计算模块部分单元测试展示

1.分词模块

展开代码

public class AnsjCutTest {
    @Test
    public void test1() {
        String text = "在百合花幽暗的阁楼上, 在我们的月亮床上 , 在海龟梦想的舞蹈里";
        List expected = Arrays.asList("百合花", "幽暗", "阁楼", "我们", "月亮", "床上", "海龟", "梦想", "舞蹈","里");
        // 调用 WordAnsjCut 方法
        List actual = AnsjCut.WordAnsjCut(text);
        // 断言分词结果是否符合预期
        assertEquals(expected, actual);
    }
    @Test
    public void test2() {
        String text = "唉,唉,唉,唉! ";
        List expected = Arrays.asList("唉", "唉", "唉", "唉");
        // 调用 WordAnsjCut 方法
        List actual = AnsjCut.WordAnsjCut(text);
        // 断言标点符号被去除,分词结果是否符合预期
        assertEquals(expected, actual);
    }
    @Test
    public void test3() {
        List list1 = Arrays.asList("百合花", "幽暗", "阁楼");
        List list2 = Arrays.asList("圆舞曲", "拿走", "梦想");
        List expected = Arrays.asList("百合花", "幽暗", "阁楼", "圆舞曲", "拿走", "梦想");
        // 调用 Merge 方法
        List actual = AnsjCut.Merge(list1, list2);
        // 断言合并后的结果是否符合预期
        assertEquals(expected, actual);
    }
}

2.词频计算模块

展开代码

public class CountNumTest {
    @Test
    public void test1() {
        // 定义文本,数字1到9,每个数字出现次数与其值相等
        List text = Arrays.asList(
                "9", "9", "9", "9", "9", "9", "9", "9", "9",
                "8", "8", "8", "8", "8", "8", "8", "8",
                "7", "7", "7", "7", "7", "7", "7",
                "6", "6", "6", "6", "6", "6",
                "5", "5", "5", "5", "5",
                "4", "4", "4", "4",
                "3", "3", "3",
                "2", "2",
                "1"
        );
        // 定义合并后的词汇表,包含数字0到9
        List mergeText = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
        // 计算文本中每个词项的出现频率
        int[] expected = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 每个数字的词频
        int[] actual = CountNum.CountNum(text, mergeText);
        // 验证频率是否符合预期
        assertArrayEquals(expected, actual);
    }
    @Test
    public void test2() {
        // 定义空文本
        List text = Arrays.asList();
        // 定义合并后的词汇表,包含数字0到9
        List mergeText = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
        // 计算文本中每个词项的出现频率
        int[] expected = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 所有词汇的词频都为0
        int[] actual = CountNum.CountNum(text, mergeText);
        // 验证频率是否符合预期
        assertArrayEquals(expected, actual);
    }
    @Test
    public void test3() {
        // 定义文本,数字1到3,每个数字出现次数与其值相等
        List text = Arrays.asList(
                "3", "3", "3",
                "2", "2",
                "1"
        );
        // 定义空的合并词汇表
        List mergeText = Arrays.asList();
        // 计算文本中每个词项的出现频率
        int[] expected = {}; // 没有合并词汇,结果应该是空的
        int[] actual = CountNum.CountNum(text, mergeText);
        // 验证频率是否符合预期
        assertArrayEquals(expected, actual);
    }
}

3.余弦相似度模块

展开代码

public class CosineSimilarityTest {
    // 测试完全相同的向量,预期余弦相似度为1.0
    @Test
    public void test1() {
        int[] vector1 = {1, 2, 3};
        int[] vector2 = {1, 2, 3};
        double similarity = CosineSimilarity.getSimilarity(vector1, vector2);
        assertEquals(1.0, similarity, 0.001);
    }
    // 测试正交向量(不同维度),预期余弦相似度为0.0
    @Test
    public void test2() {
        int[] vector1 = {1, 0, 0};
        int[] vector2 = {0, 1, 0};
        double similarity = CosineSimilarity.getSimilarity(vector1, vector2);
        assertEquals(0.0, similarity, 0.001);
    }
    // 测试完全相反的向量,预期余弦相似度为-1.0
    @Test
    public void test3() {
        int[] vector1 = {1, 2, 3};
        int[] vector2 = {-1, -2, -3};
        double similarity = CosineSimilarity.getSimilarity(vector1, vector2);
        assertEquals(-1.0, similarity, 0.001);
    }
    // 测试相似的向量(一个向量的每个元素是另一个向量的元素的两倍),预期余弦相似度为1.0
    @Test
    public void test4() {
        int[] vector1 = {1, 1, 1};
        int[] vector2 = {2, 2, 2};
        double similarity = CosineSimilarity.getSimilarity(vector1, vector2);
        assertEquals(1.0, similarity, 0.001);
    }
    // 测试一个向量全为零,预期余弦相似度为0.0
    @Test
    public void test5() {
        int[] vector1 = {0, 0, 0};
        int[] vector2 = {1, 2, 3};
        double similarity = CosineSimilarity.getSimilarity(vector1, vector2);
        assertEquals(0.0, similarity, 0.001);
    }
}

4.单元测试得到的测试覆盖率

五、计算模块部分异常处理说明

读取参数异常

读取文件异常

写入文件异常

posted @ 2024-09-13 21:46  C0LAAAAA  阅读(22)  评论(0编辑  收藏  举报