第一次个人编程作业
作业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.单元测试得到的测试覆盖率
五、计算模块部分异常处理说明
读取参数异常
读取文件异常
写入文件异常