文本相似度计算

news/2024/9/23 7:21:56

一、PSP表格

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

github仓库链接:https://github.com/moyuer147/3122004517/tree/master

二、模块接口的设计和实现


  • COS类功能为计算余弦相似度
  • Getwordcount类功能为计算每个词语出现的次数
  • IK_analyzer类为引入maven依赖使用ikanalyzer进行句子的分词
  • IO类为读取文件并返回字符串
  • JavaBreakIterator类为文档断句,分成句子装入list里面
  • Main类为实现函数
  • origtxt类为原文档的数据,使用static修饰减少代码运行次数
  • Union类为两个文档出现过的词语的并集
    类之间的关系
    先使用IO读取文档内容转化成字符串形式,;然后通过JavaBreakIterator将字符串断句,分成一个个句子装入list集合中;IK_analyzer负责将list中的每个句子进行分词,装入list集合中记录所有词语;Getwordcount创建一个map集合将list集合中所有分词的出现次数进行统计,键是词语,值是词语的出现次数;Union把两个文档出现过的分词进行并集计算,存储在list中;COS将map集合中的值通过与Union产生的并集进行向量化储存在一维数组中,把两个一维数组进行余弦计算,再乘两个文本字数的占比,即可得出两个文本的余弦相似度,即是文本的重复率;最后由main实现。
    算法的关键
    在COS类中,参数为两个文本分词后的list集合和Union的并集(两个文本出现过的词语的集合),先通过Getwordcount把list转化为map,遇到重复的词语值+1,这样就得到了每个词语和其出现的次数,通过for循环遍历Union的集合,for(i = 0; i < union.size(); i++)arr[i] = map.getOrDefault(union.get(i), 0);,生成一个向量化的数组,然后把两个数组的成员分别进行余弦运算。
    独到之处
    由于原文本每次查重都会使用到,所以把原文本的所有数据用static修饰,使得原文本的数据在程序运行过程中只需运行一次,减少计算量;引入了maven依赖的中文分词法,减少工作量;使用TreeSet集合记录文本的分词,将分词按一定规律的顺序排序,在后续遍历查找对比的时候减少代码的复杂度。

性能改进

因为使用了FileReader的带参构造,用byte数组接收字符串,再转化成string,所以占用内存高。


单元测试





异常处理说明

找不到文件或者文件不可读取:


未按指定格式输入:

参数丢失:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/60484.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第二十讲:为什么我只改一行的语句,锁这么多?

该文章深刻揭示了一点:加索引=行锁+间隙锁=(next-key lock),分析了加锁的规则:对主键(唯一索引),普通非唯一索引进行等值与范围查询的加锁。这篇文章我认为收获最大的是让我们知道“明明对一行加了锁,为什么在他相邻部分,或是相相邻部分无法插入数据(这根主键类型,…

【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:Dongzhi Zhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本…

Docker-Compose搭建RustDesk服务器

前置条件:电脑安装RustDesk客户端,服务器安装Docker及docker-compose官方文档:安装 :: RustDesk文档操作流程:使用Vim编写docker-compose.yml文件,修改需要的端口,最好按照官方对应的端口来操作,< >内替换成服务器对外的端口。记住挂载文件路径,容器运行后会生成密…

[安洵杯 2019]easy_web

首先抓包可以看到img是一个base64编码依次经过base64,base64,asciihex解码得到一个图片名555.png那么我们可以利用这一点反过去看index.php的源码,修改头 img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3 最后经过base64解码后 <?php error_reporting(E_ALL || ~ E_NOTICE); header…

CMake构建学习笔记16-使用VS进行CMake项目的开发

详细介绍了通过Visual Studio 2019 这款IDE进行CMake项目开发过程,能够极大增加C/C++程序的开发效率。目录1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行3. 项目案例4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

作业2:个人项目

个人项目-论文查重 一、课程信息这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 熟悉软件开发以及工具的使用、算法的设计、资料的搜集GitHub地址 二、开发环境开发工具 IDEA 2021.3.2项目构建工具 maven单元测试 Junit分词依赖包 hanlp三、…

[BJDCTF2020]Cookie is so stable

首先这题flag模块有个登录页面抓包可以看到user=123,最后会返回hello 123,这里就很像ssti注入,输入user={{2*3}}最后也是返回成功了,而且处理器是php,常见模块有:twig,smarty,blade 输入 user={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self…

Linkedin-SRE-中文教程-二-

Linkedin SRE 中文教程(二)原文:School of SRE 协议:CC BY-NC-SA 4.0一些 Python 概念原文:https://linkedin.github.io/school-of-sre/level101/python_web/python-concepts/虽然期望您了解 python 及其基本语法,但是让我们讨论一些基本概念,这将帮助您更好地理解 pyth…