文本相似度计算

一、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,所以占用内存高。


单元测试





异常处理说明

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


未按指定格式输入:

参数丢失:

posted @   乌桃  阅读(14)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示