第一次个人编程作业
| 软件工程 | Here | 
|---|---|
| 作业要求 | Here | 
| 作业目标 | 使用git管理代码/PSP表格/查重算法/单元测试 | 
GitHub代码地址:
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时 (分钟) | 实际耗时 (分钟) | 
|---|---|---|---|
| Planning | 计划 | 60 | 50 | 
| ·Estimate | ·估计这个任务需要多少时间 | 100 | 90 | 
| Development | 开发 | 980 | 1110 | 
| ·Analysis | ·需求分析(包括学习新技术) | 300 | 360 | 
| ·Design Spec | ·生成设计文档 | 180 | 150 | 
| ·Design Review | ·设计复审 | 30 | 20 | 
| ·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 20 | 10 | 
| ·Design | ·具体设计 | 30 | 30 | 
| ·Coding | ·具体编码 | 240 | 180 | 
| ·Code Review | ·代码复审 | 60 | 30 | 
| ·Test | ·测试(自我测试,修改代码,提交修改) | 120 | 240 | 
| Reporting | 报告 | 80 | 100 | 
| ·Test Repor | ·测试报告 | 40 | 50 | 
| ·Size Measurement | ·计算工作量 | 10 | 10 | 
| ·Postmortem & Process Improvement Plan | ·事后总结,并提出过程改进计划 | 30 | 40 | 
| ·合计 | 1220 | 1350 | 
计算模块接口的设计与实现过程
类
1.Main:包含方法main,pocess和work
2.convert:包含方法textToString和StringTotext
3.getCos:包含方法getCos
大概流程
*通过命令行接收三个参数,分别为原文档、抄袭文档和答案文档
*将原文档和抄袭文档转换为字符串
*对比两个字符串的相似度
*将相似度输出到制定的文档中
具体实现
分词
使用hanlp工具分词,使用的是比较方便的第一种方法,不用另外下载data包,在pom.xml文件中加入
<dependency>  
    <groupId>com.hankcs</groupId>  
    <artifactId>hanlp</artifactId>  
    <version>portable-1.7.8</version>  
</dependency>  
就能使用基本功能。
附上github地址:https://github.com/hankcs/HanLP/tree/1.x
以及配置好后的第一次使用截图

相似度算法--使用余弦相似度算法
公式

具体介绍地址:<https://blog.csdn.net/u012160689/article/details/15341303
除了博客中提到的计算词频的方式,我还找到了另一种:把词的出现位置用Map<String,Vector
代码性能测试
堆内存:

内存消耗:

耗时:


CPU Load:

单元测试
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
/**
 * Main Tester.
 *
 * @author <QS>
 * @since <pre>Sept, 24, 2020</pre>
 * @version 1.0
 */
public class MainTest {
    @Before
    public void before() throws Exception {
        System.out.println("begin");
    }
    @After
    public void after() throws Exception {
        System.out.println("finish");
    }
    /*相似度为零的测试*/
    @Test
    public void testshouldb0() throws Exception{
        Main.work("src/test/test1/orig.txt","src/test/test1/empty.txt","src/result/shouldb0");
    }
    /*相似度为1的测试*/
    @Test
    public void testshouldb1() throws Exception {
        Main.work("src/test/test1/orig.txt","src/test/test1/orig.txt","src/result/shouldb1");
    }
    @Test
    public void testmain1() throws Exception {
        Main.work("src/test/test1/orig.txt","src/test/test1/orig_0.8_add.txt","src/result/testmain1");
    }//部分代码
  
测试结果

总结
这是我作为一条咸鱼第一次遇到一个相对完整的项目,所要完成的东西不仅是代码,还有除了代码以外的很多。对于我而言几乎是从零开始,所以借此机会也学到了很多东西,一开始想过用python实现这个算法,但想想这完全就是从零开始了,遂放弃。只是我的Java知识也不是非常扎实,于是乎也花了不少时间在寻求代码实现的路上。除此之外,更难的还是学习git、JProfiler等等没接触过的新事物。总而言之,完成这份作业的途中学到了很多新东西,不管是在这个作业里用不得到的还是用不到的,总归是一份很不错的积累。

 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号