第一次个人编程作业

作业github链接:https://github.com/HsuQingYoung/3121004931

Java实现论文查重算法

项目 链接
这个作业属于哪个课程 软件工程
这个作业要求在哪 作业要求
这个作业的目标 学会用java建立工程项目以及熟悉使用github
作业github链接 作业github链接

PSP表格

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

流程图

流程设计

先通过命令行过的原文路径,抄袭文件路径,以及答案路径,接着调用FileOperation类的readTextFromFile()方法从原文路径和抄袭文件路径中读取文本,在调用CosSimility类的getCosSimility()方法获得两个文本的相似度。再调用FileOperation类的writeIntoFile()方法将相似度写入答案文件

算法设计


1.Main:程序入口
2.FileOperation:对文件的读写操作
readTextFromFile(String filePath):从文件路径读取文本并返回字符串
writeIntoFile(String filePath,String result):将计算的相似度结果写入文件
3.CosSimility:计算相似度
getCosSimility(String str1,String str2):计算两个文本的相似度并返回相似度结果

算法设计

算法
public static String readFromFile(String filePath) 从文件路径中读取文件的内容
public static void writeIntoFile(String filePath,String result) 将相似度写进文件路径对应的文件中
public static double getCosSimility(String str1,String str2) 通过ansj分词器和余弦算法计算文本一和文本二的相似度

测试

测试文件的读取

点击查看代码
public class TestReadTextFromFile {
    public static void main(String[] args) {
        String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
        FileOperation rtff=new FileOperation();
        String originalText=rtff.readFromFile(originalFilePath);//原文
        System.out.println(originalText);
    }
}

测试结果如下图,读取成功

测试ansj分词器

点击查看代码
public class TestAnsj {
    public static void main(String[] args) {
        StopRecognition filter = new StopRecognition();
        //过滤掉标点
        filter.insertStopNatures("w");
        Map<String,Integer> map1= new HashMap<>();
        String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
        FileOperation rtff=new FileOperation();
        String originalText=rtff.readFromFile(originalFilePath);//原文
        String analysisedText = ToAnalysis.parse(originalText).recognition(filter).toStringWithOutNature();
        System.out.println((analysisedText));
    }
}
测试结果如下图,分词效果好

测试余弦相似度的计算

点击查看代码
public class TestCosSimility {
    public static void main(String[] args) {
        String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
        String copiedFilePath = "D:\\softwork\\测试文本\\orig_0.8_add.txt";//抄袭路径
        FileOperation rtff=new FileOperation();
        String originalText=rtff.readFromFile(originalFilePath);//原文
        String copiedText=rtff.readFromFile(copiedFilePath);//抄袭
        CosSimility cos=new CosSimility();
        double result=cos.getCosSimility(originalText,copiedText);
        System.out.println(result);
    }
}
测试结果如下

测试主类

点击查看代码
public class TestMain {
    public static void main(String[] args) {
        String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
        String copiedFilePath = "D:\\softwork\\测试文本\\orig_0.8_del.txt";//抄袭路径
        String answerFilePath ="D:\\softwork\\测试文本\\CosSimility.txt";

        FileOperation rtff=new FileOperation();
        String originalText=rtff.readFromFile(originalFilePath);//原文
        String copiedText=rtff.readFromFile(copiedFilePath);//抄袭
        String answer=rtff.readFromFile(answerFilePath);//相似度
        CosSimility cos=new CosSimility();
        Double result=cos.getCosSimility(originalText,copiedText);
        rtff.writeIntoFile(answerFilePath,result.toString());
    }
}
测试结果如下,成功将两个文本的相似度写入结果文件

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

性能分析图


改进思路

从上图可以看出,内存中使用最多的是char,String类型的数据,前者为分词后,后者为分此前,可以通过选择一个性能更好的分词器以提高程序的性能

覆盖率

异常处理

对IO做了异常处理

在命令窗口运行jar包


posted @ 2023-09-17 13:29  疯尤金  阅读(38)  评论(0)    收藏  举报