个人项目
所属课程 | 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和海明距离,通过具体分析与实现,使用海明距离来衡量文本内容的相似度。
算法关键
-
分词:使用糊涂工具包中的TokenizerEngine进行分词处理,并通过hankc作为分词工具,遍历词汇和词频的结果树,计算余弦相似度。
-
计算文本相似度:采用如下的向量余弦计算模型来衡量文本相似度。
参考资料: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 作为项目管理工具的使用。希望在接下来的课程学习中,能够进一步深入理解软件工程的相关知识。