第一次个人编程作业
软件工程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-1 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
作业目标 | 学习使用Java建立工程项目,了解开发流程 |
Github链接
https://github.com/muggle1116/muggle1116/tree/main/3221004855
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 30 |
- Estimate | - 估计这个任务需要多少时间 | 40 | 30 |
Development | 开发 | 530 | 480 |
- Analysis | - 需求分析 (包括学习新技术) | 90 | 120 |
- Design Spec | - 生成设计文档 | 60 | 0 |
- Design Review | - 设计复审 | 30 | 30 |
- Coding Standard | - 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
- Design | - 具体设计 | 30 | 30 |
- Coding | - 具体编码 | 180 | 160 |
- Code Review | - 代码复审 | 20 | 40 |
- Test | - 测试(自我测试,修改代码,提交修改) | 90 | 90 |
Reporting | 报告 | 120 | 130 |
- Test Report | - 测试报告 | 60 | 50 |
- Size Measurement | - 计算工作量 | 30 | 40 |
- Postmortem & Process Improvement Plan | - 事后总结, 并提出过程改进计划 | 30 | 40 |
Total | 合计 | 690 | 640 |
计算模块接口的设计与实现过程
模块接口设计
实现过程及流程图
实现过程
- 导入文件 FileUtils.readFile()
- 根据传入的路径参数调用文件读写工具对文件进行读取,转换为字符串
- 调用simHash算法计算文本的simHash的值 SimHashUtils.getSimHash()
- 分词:使用ToAnalysis分词器进行中文分词,分割字符串保存为一个集合
- 计算文本中各个分词的Hash值
- 将各个分词的Hash值进行加权合并
- 将合并结果进行降维处理,返回128位二进制的文本Simhash值
- 计算文本相似度 HaimingUtils.getSimilar()
- 传入两个文本的SimHash值,计算两个SimHash值的海明距离distance
- 根据公式0.01 * (100 - distance * 100 / 128)来计算相似度
- 写入结果 FileUtils.writeFile()
- 根据传入的路径参数调用文件读写工具将结果写入对应路径的文件
流程图
运行结果
计算模块接口部分的性能改进
性能分析图
改进思路
由图可以看出,使用最多的是Integer、HashMap、char[]和int[],由此可知,可以通过选择一个性能较好的分词器以提高程序性能。
模块部分单元测试展示
测试覆盖率
文件读取测试FileUtilsTest
测试思路:导入正常的txt文件和不正常的txt文件,写入正常的txt文件和不正常的txt文件。
测试代码:
{
//正确读取文件
@Test
public void testreadFile(){
String filename="D:\\zhd\\学习\\软件工程\\2\\orig.txt";
String s = FileUtils.readFile(filename);
System.out.println(s);
}
//正确写入文件
@Test
public void testwriteFile(){
String filename="D:\\zhd\\学习\\软件工程\\2\\text.txt";
String data="test";
FileUtils.writeFile(filename,data);
}
//错误读取文件
@Test
public void testReadException(){
String filename="D:\\zhd\\学习\\软件工程\\2\\orig.xlsx";
try {
FileUtils.readFile(filename);
} catch (Exception e) {
e.getMessage();
}
}
//错误写入文件
@Test
public void testWriteException(){
String filename="D:\\zhd\\学习\\软件工程\\2\\orig.xlsx";
String data="1111";
try {
FileUtils.writeFile(filename,data);
} catch (Exception e) {
e.getMessage();
}
}
}
}
测试结果:
分词器测试AnsjUtilTest
测试思路:输入一句话,打印分词情况
测试代码:
{
//测试分词器ansj
@Test
public void testAnsj(){
String test="今天是星期六,天气很适合出去野餐";
List<String> ansj = AnsjUtils.ansj(test);
System.out.println(ansj.toString());
}
}
测试结果:
获取SimHash值测试SimHashUtilsTest
测试思路:传入词语测试getHash()并打印结果,传入文本测试getSimHash()并打印结果
测试代码:
{
//测试词语Hash值的获取
@Test
public void testgetHash(){
String test="今天";
String hash = SimHashUtils.getHash(test);
System.out.println(hash);
}
//测试文本SimHash值的获取
@Test
public void testgetSimhash(){
String test="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
String simhash = SimHashUtils.getSimhash(test);
System.out.println(simhash);
}
}
测试结果:
计算海明距离测试HaimingUtilsTest
测试思路:输入两个文本并获取其SimHash值,将两个文本的SimHash值传入getHaimingDis()计算海明距离并打印,将海明距离传入getSimilar()计算相似度并打印
测试代码:
{
//测试海明距离计算
@Test
public void TestgetHaimingDis(){
String test1="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
String test2="今天是星期日,天气非常适合出去玩,我们决定去越秀公园放风筝";
String simhash1= SimHashUtils.getSimhash(test1);
String simhash2 = SimHashUtils.getSimhash(test2);
int haimingDis = HaimingUtils.getHaimingDis(simhash1,simhash2);
System.out.println(haimingDis);
}
//测试文本相似度计算
@Test
public void TestgetSimilar(){
String test1="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
String test2="今天是星期日,天气非常适合出去玩,我们决定去越秀公园放风筝";
String simhash1= SimHashUtils.getSimhash(test1);
String simhash2 = SimHashUtils.getSimhash(test2);
double similar = HaimingUtils.getSimilar(simhash1, simhash2);
System.out.println("相似度为"+similar);
}
}
测试结果:
计算模块部分异常处理说明
文件异常处理
代码实现:
{
public class FileException extends RuntimeException{
private String errMessage;
public FileException(){
super();
}
public FileException(String errMessage){
super(errMessage);
this.errMessage=errMessage;
}
public String getMessage(){
return errMessage;
}
public static void handle(){
throw new FileException("仅支持读取txt类型文件");
}
}
}