Skip to content

wchunjin/SE_two

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

作业简述

这个作业属于哪个课程 作业课程
这个作业要求在哪里 作业要求
这个作业的目标 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

PSP表格

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

计算模块接口的设计与实现过程

项目结构

1.路径:SE_two\src\main\java\

Cosine类:计算余弦相似度

IO类:文件读取与写入

Main类:主类

Participle类:分词

2.路径:SE_two\src\main\resources\

hit_stopwords.txt:停用词词典,选用的是哈工大版停用词

3.路径:SE_two\src\test\

java文件夹下存放的是测试类,测试各对应类中的各个方法

例:testCosine类测试Cosine类中的各个方法

resources文件夹下存放的是测试过程中需要读入和写出的文本
流程图

关键函数的分析与实现

该项目主要使用:hanlp分词器+余弦相似度算法

假设有两个句子:

句子A:这只皮靴号码大了,那只号码合适。

句子B:这只皮靴号码不小,那只更合适。

第一步:分词

先是标准分词结果:

句子A:[这, 只, 皮靴, 号码, 大, 了, ,, 那只, 号码, 合适, 。]

句子B:[这, 只, 皮靴, 号码, 不, 小, ,, 那只更, 合适, 。]

读取停用词:

[———, 》),, )÷(1-, ”,, )、, =(, :, →, ℃ , ...]

对标准分词结果进行停用词过滤:

句子A:[只, 皮靴, 号码, 大, 那只, 号码, 合适]

句子B:[只, 皮靴, 号码, 不, 小, 那只更, 合适]

实现:Participle.participle() 借助 hanlp分词器

第二步:合并分词

将第一步得到的两个分词结果进行合并:

[只, 皮靴, 号码, 大, 那只, 合适, 不, 小, 那只更]

实现:Participle.unionSet()

第三步:计算词频

计算各句子分词在合并分词中出现的次数

句子A:[只, 皮靴, 号码, 大, 那只, 号码, 合适]

合并分词:[只 1, 皮靴 1, 号码 2, 大 1, 那只 1, 合适 1, 不 0, 小 0, 那只更 0]

句子A词频:[1, 1, 2, 1, 1, 1, 0, 0, 0]

句子B:[只, 皮靴, 号码, 不, 小, 那只更, 合适]

合并分词:[只 1, 皮靴 1, 号码 1, 大 0, 那只 0, 合适 1, 不 1, 小 1, 那只更 1]

句子B词频:[1, 1, 1, 0, 0, 1, 1, 1, 1]

实现:Participle.computingWordFrequency()

第四步:计算余弦相似度

    计算结果作为相似度对比结果

img

A·B=(1, 1, 2, 1, 1, 1, 0, 0, 0)·(1, 1, 1, 0, 0, 1, 1, 1, 1)=5

|A|=|(1, 1, 2, 1, 1, 1, 0, 0, 0)|=3

|B|=|(1, 1, 1, 0, 0, 1, 1, 1, 1)|=根号7

cos=5/(3*根号7)=0.6299

实现:Cosine.calculate()

参考博客:余弦计算相似度度量

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

内存部分

程序中消耗较大的有:

int[] 相关的主要有,词频计算与余弦相似度计算

hanlp 分词器分词与停用词过滤

运行时间

不知道为什么,在 IDEA中直接运行测试方法只用 900ms左右

而在 IDEA中通过 Profile测试工具运行测试文本却要用 4s左右

即使是实际使用,也只是用 1s左右

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

测试结果与异常提醒均以注释形式写入代码中

Cosine类测试

IO类测试

Participle类测试

Main类测试

代码覆盖率

lines covered低的原因是:写了很多异常情况信息提示,却很少用到

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

异常处理写了很多,这里展示不完,主要说一下写在哪里,写了什么。

基本各个方法都写关于传入参数的异常处理,例:

关于计算的方法,一些计算过程也写了异常处理,例:

关于异常情况,大致上都在测试类中,把各个方法会碰到的异常情况都测试了一次,并且异常处理结果以注释形式写在各个测试方法中,有兴趣的可以在单元测试那里看。

项目程序功能测试

项目中碰到的问题

mevan项目以及打包后的jar包,读取resources文件夹下的txt文件失败问题:

参考博客

【解惑】深入jar包:从jar包中读取资源文件

Maven jar 如何读取resource目录下的文件(read file in resource folder)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages