Java实现文本查重(相似度) 无三方工具版本

功能背景:

在业务记录逐渐增长的前提下,逐渐出现重复项目名称数据和重复内容数据,这些数据导致项目记录质量的下降。为了避免此中情况发生,考虑对关键数据信息进行查重校验,原计划采用第三方标准查重接口,但过程比较繁琐,需要商务对接等时间,所以暂时在自身系统中实现数据查重检验。

当然,实现标准查重类似知网论文查重那种系统就太麻烦了,甚至可以独立出来一套系统了,所以就简单实现查重功能,针对名称 和 大文本内容实现查重。

 查重逻辑:

想要做查重功能就要了解参考其他标准项目是如何实现查重逻辑的。

通常的做法是:
  1. 分割文本:将待检查的文本按照一定规则(如空格、标点等)进行分割,得到文本中的单词、短语或句子。
  2. 去除停用词:将一些常见但无实际意义的词(如“the”、“a”、“an”、“and”等)从分割后的单词中去除,以减少误判和提高效率。
  3. 计算相似度:通过比较待检查文本与已有文本的相似度来判断是否存在重复内容。相似度计算可以基于单词、短语或句子等进行,常用的算法包括余弦相似度、Jaccard相似度、编辑距离等。
  4. 设定阈值:根据实际需求设定一个阈值,判断待检查文本与已有文本的相似度是否超过该阈值。如果超过,则认为存在重复内容。
  5. 返回结果:将判断结果返回给用户,通常包括是否存在重复内容、重复率等信息。
 另外一个就是​​​​​​​:

读取文本数据之后分别计算SimHash值,之后查重文本和原始文本根据SimHash算出海明距离,进而得到相似度和查重率。

简单说下原理:
  1. SimHash是一种文本特征提取方式,它将文本映射成一个固定位数的二进制数列,这个二进制数列称为SimHash值。SimHash的原理是通过计算文本中各个关键词的hash值,然后将这些hash值加权求和,最终得到一个n位的二进制数列。
  2. 假设我们有两段文本A和B,我们可以分别计算它们的SimHash值,然后通过计算它们的海明距离来判断它们的相似度。海明距离是指两个二进制数列中,对应位置上不同的比特位的个数。我们可以用下面的公式来计算海明距离:
  3. hamming_distance = sum(1 for x, y in zip(a, b) if x != y)
  4. 其中a和b分别是两个SimHash值。假设我们假设SimHash计算出来的值是128位的二进制数列,那么它们之间的海明距离就在0-128之间。海明距离越小,说明两个文本在内容上越相似,反之则越不相似。我们可以基于海明距离来设置一个阈值,比如如果海明距离小于10,我们就认为这两个文本相似。在实际应用中,阈值的设置需要根据具体的应用场景来确定。
  5. 对于文本查重任务,我们可以先将所有文本的SimHash值计算出来,然后两两比较每一对SimHash值的海明距离,即可得到每一对文本之间的相似度。在完成这个过程之后,我们可以选择一个相似度阈值,比如90%,来判断哪些文本是重复的,哪些是不重复的。
  6. 具体来说,对于一个包含n篇文本的集合,我们需要计算出n*(n-1)/2个SimHash值,然后对于每一对SimHash值,计算它们的海明距离。最后我们可以将所有海明距离小于设定阈值的文本对输出,这些文本对就是重复的。

接口逻辑:

字符串查重的过程一般可以分为四步:

  1. 读取目标字符串和基础记录字符串。
  2. 对它们进行预处理,比如将所有字母转为小写,去除空格和特殊符号等。
  3. 应用字符串查重算法进行对比,得到它们的相似度。
  4. 选取最大相似度作为它们的最终相似度结果。

在对目标字符串和基础记录字符串进行预处理时,需要注意选择合适的方式来规范化这些字符串,例如字母大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值