第一次个人编程作业
作业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.单元测试得到的测试覆盖率

五、计算模块部分异常处理说明
读取参数异常

读取文件异常

写入文件异常

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号