个人编程作业——论文查重

第一次个人编程作业———论文查重

这个作业属于哪个课程广工2023软件工程课程
这个作业要求在哪里个人项目作业-论文查重
这个作业的目标1.学习对工程进行单元测试
2.学习PSP表格的制作
3.学习对工程文件进行性能分析和内存分析
其他参考文献CSDN

一、项目地址

gitCode

二、PSP表格

PSP2.1Personal Sortware Process Stages预计耗时(分钟)实际耗时(分钟)
Planning计划6045
·Esitmate·估计这个任务需要多少时间19201955
Development开发800900
·Analysis·需求分析(包括学习新技术)200210
·Design Spec·生产设计文档3025
·Design Review·设计复审3040
·Coding Standard·代码规范(为目前的开发指定合适的规范)105
·Design·具体设计9090
·Coding·具体编码300240
·Code Review·代码复审6040
·Test·测试(自我测试、修改代码、提交修改)180150
Reporting报告90120
·Test Repor·测试报告6045
·Size Measurement·计算工作量2020
·Postmortem & Process Improvement Plan·事后总结,并提出过程改进计划2025
·合计19201955

三、计算模块接口的设计和实现过程

3.1 系统流程

在这里插入图片描述

3.2 所用的类

3.2.1 文件读写类

FileUtil类,有readFile()和writeFile()两个方法。引入了糊涂工具包里面的FileReader,对异常进行了封装,设计了读、写文件两个方法。

3.2.2 自定义异常类

fileException类。用于处理FileUtil类的异常。

3.2.3 分词计算类

TokenizerUtil类。包括CountWord()和CosCount()方法,分别用于分词和文本相似度计算。

3.3 算法关键

3.3.1 分词

分词的方法引用了糊涂工具包的TokenizerEngine,并且通过hankc当作引擎作分词处理,这里我用到的是hanlp分词,遍历存放着词和词频的结果树,通过结果树存储计算cos值。

3.3.2 文本相似度的计算

1)思路
使用向量余弦计算文本相似度。思路如下:

  1. 通过中文分词(此处使用HanLP工具),把完整的句子根据分词算法分为独立的词集合,为降噪,将标点符号过滤掉
  2. 求出两个词集合的并集,得到输入文本中的所有词;
  3. 计算各自词集的词频并作为特征值;
  4. 带入向量计算模型就可以求出文本相似度。

查阅许多资料对比发现,该方法优势在于代码实现难度较低,向量计算模型拟合情况良好,但对于处理长文本的话,该方法速度较慢,但也能基本覆盖需求。

2)向量余弦计算模型

  • 余弦相似性的定义:两个向量的家教越接近于0,其余弦值越接近1,表面两个向量越相似。
  • 计算模型:
    计算模型

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

4.1 JProfiler分析

  • 概览图
    在这里插入图片描述
    花费时间约为2s
  • 性能分析图
    在这里插入图片描述

4.2 消耗最大的函数

用于计算向量余弦值的CosCount函数。

4.3 性能改进思路

由性能分析图可见,Linklist占据了较多的性能,原因是Linklist查询性能较差,遍历较慢,可以尝试将linkList替换为ArrayList。

五、计算模块部分单元测试展示

  • 单元测试代码

测试函数说明已注释

/**
	 * 封装测试方法。
	 *
	 * @param firstPath  第一个测试文件的路径
	 * @param secondPath 第二个测试文件的路径
	 */
	public void test(String firstPath, String secondPath, String testDetail) {
		Map<String, List<Integer>> firstListMap = TokenizerUtil.CountWord(firstPath);
		Map<String, List<Integer>> secondListMap = TokenizerUtil.CountWord(secondPath);
		Double similarity = TokenizerUtil.CosCount(firstListMap, secondListMap);
		String result = testDetail + similarity;
		FileUtil.writeFile("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\result.txt", result);
		System.out.println(result);
	}

	/**
	 * 空白文件测试样例
	 */
	@Test
	public void testNullFilePath() {
		test("", "", "空白文件测试结果为:");
	}


	/**
	 * 相同性测试样例
	 */
	@Test
	public void testSame() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "相同性测试结果为:");
	}

	/**
	 * 增加文本与原文本测试样例
	 */
	@Test
	public void testAdd() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_add.txt", "原先文本和增加文本的对比测试结果为:");
	}

	/**
	 * 删除后的文本与原文本测试样例
	 */
	@Test
	public void testDelete() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_del.txt", "原先文本与删除部分文字的文本对比测试结果为:");
	}

	/**
	 * 原文本与dis1文本测试样例
	 */
	@Test
	public void testDis1() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_1.txt", "原文本与dis1文本测试结果为:");
	}

	/**
	 * 原文本与dis10文本测试样例
	 */
	@Test
	public void testDis10() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_10.txt", "原文本与dis10文本测试结果为:");
	}

	/**
	 * 原文本与dis15文本测试样例
	 */
	@Test
	public void testDis15() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_15.txt", "原文本与dis15文本测试结果为:");
	}

	/**
	 * dis1与dis10测试样例
	 */
	@Test
	public void testCommon1() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_1.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_10.txt", "dis1与dis10文件测试结果为:");
	}

	/**
	 * dis1与dis15测试样例
	 */
	@Test
	public void testCommon2() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_1.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_15.txt", "dis1与dis15文件测试结果为:");
	}

	/**
	 * dis10与dis15测试样例
	 */
	@Test
	public void testCommon3() {
		test("D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_10.txt", "D:\\Java_demo\\软件工程作业\\3121005168论文查重作业\\text_example\\orig_0.8_dis_15.txt", "dis10与dis15文件测试结果为:");
	}
  • 思路
  1. 五个抄袭的文件与原文件构成五个测试样例
  2. 五个抄袭文件构成三个测试样例
  3. 两个空白文件构成一个测试样例
  4. 两个相同文件构成一个测试样例
  • 样例结果
    在这里插入图片描述

  • 代码覆盖率
    在这里插入图片描述

六、计算模块部分异常处理说明

  • 文件异常处理

如果输入的文本的路径为空,会提示“文件路径为空”,不会导致程序异常退出。同时若所读的文件中没有内容,会提示“文件为空”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值