个人项目:论文查重

2021/9/18 23:09:19

本文主要是介绍个人项目:论文查重,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

作业所属课程 课程
作业要求
要求
作业目标
实现论文查重算法

熟练使用PSP表格

熟练使用单元测试

熟练使用代码质量检测工具

熟练使用性能分析工具

1.git hub地址

图片即超链接
图片即超链接

2.PSP表格

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

3.开发环境以及设计原理

3.1开发环境

  • 开发环境:IDEA 2021

3.2设计原理

  • 算法原理
    参考文章:
    1. 使用余弦相似度算法计算文本相似度
    2. 分词器

余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。

下面我们介绍使用余弦相似度计算两段文本的相似度。思路:1、分词;2、列出所有词;3、分词编码;4、词频向量化;5、套用余弦函数计量两个句子的相似度。

句子A:这只皮靴号码大了。那只号码合适。
句子B:这只皮靴号码不小,那只更合适。
1、分词:
使用结巴分词对上面两个句子分词后,分别得到两个列表:
listA=[‘这‘, ‘只‘, ‘皮靴‘, ‘号码‘, ‘大‘, ‘了‘, ‘那‘, ‘只‘, ‘号码‘, ‘合适‘]
listB=[‘这‘, ‘只‘, ‘皮靴‘, ‘号码‘, ‘不小‘, ‘那‘, ‘只‘, ‘更合‘, ‘合适‘]

2、列出所有词,将listA和listB放在一个set中,得到:
set={'不小', '了', '合适', '那', '只', '皮靴', '更合', '号码', '这', '大'}
将上述set转换为dict,key为set中的词,value为set中词出现的位置,即‘这’:1这样的形式。
dict1={'不小': 0, '了': 1, '合适': 2, '那': 3, '只': 4, '皮靴': 5, '更合': 6, '号码': 7, '这': 8, '大': 9},可以看出“不小”这个词在set中排第1,下标为0。

3、将listA和listB进行编码,将每个字转换为出现在set中的位置,转换后为:
listAcode=[8, 4, 5, 7, 9, 1, 3, 4, 7, 2]
listBcode=[8, 4, 5, 7, 0, 3, 4, 6, 2]
我们来分析listAcode,结合dict1,可以看到8对应的字是“这”,4对应的字是“只”,9对应的字是“大”,就是句子A和句子B转换为用数字来表示。

4、对listAcode和listBcode进行oneHot编码,就是计算每个分词出现的次数。oneHot编号后得到的结果如下:
listAcodeOneHot = [0, 1, 1, 1, 2, 1, 0, 2, 1, 1]
listBcodeOneHot = [1, 0, 1, 1, 2, 1, 1, 1, 1, 0]
下图总结了句子从分词,列出所有词,对分词进行编码,计算词频的过程

5、得出两个句子的词频向量之后,就变成了计算两个向量之间夹角的余弦值,值越大相似度越高。
listAcodeOneHot = [0, 1, 1, 1, 2, 1, 0, 2, 1, 1]
listBcodeOneHot = [1, 0, 1, 1, 2, 1, 1, 1, 1, 0]

根据余弦相似度,句子A和句子B相似度很高。


  • 接口设计

  • maven工程引用dependency

4.性能分析

  • overview

  • 实时内存

    分析可得:分词模块占用的比例较大,由于不熟悉分词模块内容,我无法在分词上做出更进一步的改进

5.测试分析

  • TXtest
    initData()函数中objects包含5组数据,它们会在构造函数中被接收,相当于进行5次不同数据的测试
    1. 由于每篇文章的第一句话都是不同的,可以用来测试对应文章是否成功被读取到List中

    2. 文章是否被成功读取到List中

    3. 输出文件是否可以成功创建

    4. 结果:

    5. 测试覆盖率

    6. 异常测试

      结果

    7. 编译结果

5.小结

这次的作业需求涉及到了我很多没有涉及到的知识面,在很多地方消耗了非常多的时间,比如git命令行的操作,如何在idea中提交git,如何使用maven工程更好的调用第三方jar包和jprofile进行代码分析等等,让我了解到了自己平时在学习编程语言上遗漏的知识点,同时本次作业也参考了一些往届师兄师姐的思路和想法,希望自己在未来的日子里能够专心学习Java语言的各种特性更好的去完成项目的开发。



这篇关于个人项目:论文查重的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程