短文本重复率快速检测

简介: 短文本重复率快速检测

1.gif

直奔主题,本文讲述的就是一种快速检测短文本重复率的方法,适用的场景类似内容发布,商品发布等,减少劣质的堆砌型文本,比如:“高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待”



核心难点

要解决这个问题的最大的难点是如何确定重复的关键词句,拿到后,就可以分别算出关键词句在总字符中的占比和出现次数,进而计算出重复率,所以我们先从这一步开始。


分析关键词句


我们以上面的例子为例,为了方便理解,这里我们先手动标识下重复的文案



“高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待”



重复的词句我通过相同的背景色进行了标识,我们可以看到重复的如下:

  1. “高压洗车水枪,一喷轻松洗车不等待” 出现了 2 次,这个是最明显的文字堆砌,我们希望最终分析出这个结果
  2. “水枪” 出现了 3 次
  3. “喷” 出现了3次
  4. “分” 出现了2次
  5. “枪” 出现了4次



如上,我们通过大脑回路就能够判断出来,这个文案不合格,显然有文字堆砌的嫌疑,那我们怎么通过代码快速识别出来呢?


通过如上手动分析过程我们发现有几个特点:

  1. 单词、字、标点符号等重复出现的概率比较大,并且不适合通过这种字符判断重复
  2. 长的重复词句会覆盖更短的重复词句,需要避免重复计算重复率,否则会增大重复率计算


▐  去除特殊字符


综合如上特点,我确定的第一个思路就是去除特殊字符,毕竟在真实业务场景,大家不会写一堆标点符号,因为这个比文字堆砌更低级,这个比较简单,就像给字符串洗澡一样,一个正则命令就可以搞定


const demoText = '高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待';
const specialTextReg:RegExp = /[\s·!#¥(——):;“”‘、,|《。》?、【】[\]`~!@#$%^&*()_+<>?:"{},.\/;']/gim;
const cleanText = demoText.replace(specialTextReg, '');


输出的结果如下,我们下文称这个字符串为“母字符串”:“高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”

这样就比较简单了,方便做进一步的关键词句分析


▐  找出关键词句


首先我们要将字符串拆成单字数组,这里记录了最原始的字符出现的顺序。['高', '压', '洗', '车', '水', '枪', '一', '喷', '轻', '松', '洗', '车', '不', '等', '待', '全', '铜', '4', '分', '6', '分', '高', '压', '水', '枪', '可', '调', '节', '喷', '枪', '接', '头', '套', '装', '浇', '花', '灌', '溉', '园', '高', '压', '洗', '车', '水', '枪', '一', '喷', '轻', '松', '洗', '车', '不', '等', '待']关键词句的出现有一个非常重要的特点,就是连续出现(好像是句废话),那如何分析连续性呢,这里我们可以将连续的字放在单独的数组中,以方便我们区分连续性,所以我们最终要得到一个二维数组,二维数组的生成我们遵循三个基本原则:

  1. 从来没有出现的字符放在第一个数组中(母数组),并按照出现的顺序排序
  2. 每一个字符和第一个字符进行比较,如果出现过则新增数组,并存储在新数组中对应的母数组位置
  3. 如果下一个字符也重复,则不用新增数组,只需要在原数组中新增字符,出现以下两种情况需要新开数组:重复的字符中断(就是出现了母数组没有的字符,这时候需要将字符 push 到母数组中)重复的字符在母数组中出现的序号小于等于上一个重复字符的序号

这里比较难以理解,通过图示帮大家理解,为了方便理解,我把一个连续的分析过程,强制分布讲解

  • 上面的字符,首先分析到第 10 个字符


母数组 高 压 洗 车 水 枪 一 喷 轻 松
序列 0 1 2 3 4 5 6 7 8 9


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”

  • 接下来分析到第12个字符(“洗车”),因为在母数组中出现过,所以需要新开数组存储,分析结果如下:


1

洗 车





母数组 高 压 洗 车 水 枪 一 喷 轻 松
序列 0 1 2 3 4 5 6 7 8 9


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”

  • 接下来分析到第20个字符,因为从 13 个开始,又出现了母数组中没有的字符,所以回到母数组中进行字符 push


1

洗 车













母数组 高 压 洗 车 水 枪 一 喷 轻 松 不 等 待 全 铜 4 分 6
序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”


  • 接下来第 21 个字符 “分”和母数组中第17 个字符重复,并且因为数组 1被终端 push 了,所以需要新开数组 2


2

















分


1



洗

车















母数组

高

压

洗

车

水

枪

一

喷

轻

松

不

等

待

全

铜

4

分

6

序列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”


  • 接下来我们分析到第 23 个字符(“高压”),由于高压在母数组中出现的序号分别是 1,2,第 4 步“分”在数组出现的序号是17,满足 <= 17,所以需要新开数组,结果如下:


3 高 压















2















分
1

洗 车













母数组 高 压 洗 车 水 枪 一 喷 轻 松 不 等 待 全 铜 4 分 6
序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”


  • 接下来分析到第25个字符(“水枪”),同样也是在我们的母数组中出现过,出现的序号分别是5,6,不满足 <= 2,所以可以继续在数组三中 push,结果如下:


3

高

压



水

枪













2

















分


1



洗

车















母数组

高

压

洗

车

水

枪

一

喷

轻

松

不

等

待

全

铜

4

分

6

序列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”


  • 到第 6 步,基本上规则讲清楚了,一次类推,可以得出如下结果:


7



洗

车







不

等

待


















6

高

压

洗

车

水

枪

一

喷

轻

松





















5






枪

























4








喷























3

高

压



水

枪

























2

















分














1



洗

车



























母数组

高

压

洗

车

水

枪

一

喷

轻

松

不

等

待

全

铜

4

分

6

可

调

节

接

头

套

装

浇

花

灌

溉

园

序列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30


通过如上表我们肉眼可以轻松判断出来词句的出现次数以及每一个词句在母数组中的长度占比,对于程序来说,只需要根据两个原则分析出数组 1-7 中重复出现的词句:


  1. 在同一个数组中连续的字符确定为重复词句
  2. 当遇到空或者切换数组,则连续中断


通过如上两个步骤,确定结果如下:


关键词句 重复出现次数 重复率
洗车 4 14.81%
分 2 3.70%
高压 3 11.11%
水枪 3 11.11%
喷 3 5.56%
枪 4 7.40%
高压洗车水枪一喷轻松 2 37.03%
不等待 2 11.11%


这里关键词句重复率 = 关键词句的长度/母字符串长度 x 出现的次数 x 100%


得出重复率


因为我们最终需要得到一个重复率的总值,需要通过如上的值得出最终结果,如果只是单纯的相加,得到的结果是 96.27%, 这个明显不合适,但是重复的词句越多,重复率越大是一定的,从我们感官上去分析,我们感受到的是“高压洗车水枪一喷轻松” 带来的重复是我们无法接受的,所以我们需要通过加权,减少短字、词、句带来的重复率计算影响,这里我采用最简单的规则,就是根据重复词句的长度返回权重值如下:


字符长度 权重
1 0.1
2 0.4
3 0.5
4 0.5
>=5 1



所以如上表加上权重后的结果如下:

关键词句 重复出现次数 重复率
洗车 4 5.92%
分 2 0.37%
高压 3 4.44%
水枪 3 4.44%
喷 3 0.55%
枪 4 0.74%
高压洗车水枪一喷轻松 2 37.03%
不等待 2 5.55%
重复率 59.07%


所以我们最终得出的重复率数据 59.07%,如果界定阈值:30%,则如上字符串判断为重复


特殊场景分析

▐  关键词句分析问题


如上字符,最长的重复词句是:“高压洗车水枪一喷轻松洗车不等待”,但是通过如上分析方法,由于“洗车”重复出现了,所以强制切换了数组,所以得到的重复词句是:“高压洗车水枪一喷轻松”、“不等待” 两个,这个不合理,所以上面的第 7 步需要作如下调整:
➠ “高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”
所以除了根据是否切换数组和是否有空来判断连续性还不够,需要增加一个下标,这里的下标是字符在母字符串出现的序号,通过下标是否连续进行关键词句的拼合


图片.png


得出重复率词句如下:


关键词句

洗车
分高压水枪
喷枪
高压洗车水枪一喷轻松洗车不等待



这里我们发现除了第1、4 个词句,2、3 只出现了一次,所以这里要和母字符串进行一次对比,对于只出现一次的进行过滤,得出结果如下:


关键词句 重复出现次数 重复率
洗车 4 5.92%
高压洗车水枪一喷轻松洗车不等待 2 51.72%
重复率 57.64%


▐  关键词句被重复计算


但是我们同时发现,“洗车” 这个关键词在 “高压洗车水枪一喷轻松洗车不等待” 就出现过2次,两次重复就是 4 次,所以是被重复计算了,这里应该把这四次移除掉(其实这个过程可以提前做,大家可以考虑下)

关键词句 重复出现次数 重复率
洗车 0 0%
高压洗车水枪一喷轻松洗车不等待 2 51.72%
重复率 51.72%


最终得到的结果已经和我们最初的预期一样了,同样按照 30% 的阈值判断,该字符串也是重复的
总结

不得不说,以上实现还有很多可以优化的地方,比如在做关键词句分析上,但是准确率是经过逛逛的内容简介测试的,大家有想法也可以留言指正。
团队介绍

我们是大淘宝技术内容前端团队,主要负责淘宝的内容业务(直播、图文、短视频)和内容中台建设,涉及淘宝直播、逛逛、亲拍、有好货等业务,并通过平台化的方式支持集团其他团队的内容业务,包括饿了么、盒马、优酷、闲鱼、飞猪等 24 个 BU、160 个业务场景。
内容化是一个较新的战场,整个前端团队在多媒体、机器学习、播放器、视频剪辑、LowCode 等技术领域都有比较多挖掘和技术应用,欢迎留言技术交流。

相关文章
|
7月前
|
弹性计算 人工智能 前端开发
阿里云特价云服务器:轻量应用服务器38元与199元,云服务器99元和199元对比与选择参考
2026年,阿里云推出多款特价云服务器,包括轻量应用服务器2核2G 38元/年、2核4G 199元/年,以及云服务器ECS经济型e实例99元/年、通用算力型u1实例199元/年,满足从个人开发者到成熟企业的不同需求。轻量应用服务器快速交付、简化运维,适合轻量级应用;ECS则提供更灵活专业的选项,适合需要稳定性和扩展性的业务。用户可根据需求、预算和长期成本考量选择合适的产品。
896 4
|
6月前
|
SQL 存储 安全
PHP 安全攻防 —— 从 SQL 注入到 RCE 的完整防御指南
性能不仅仅关乎用户体验,还直接影响服务器成本和能源消耗。PHP、Java和C++分别代表了三个性能层次:PHP是动态解释型脚本语言,Java是JIT编译的字节码语言,C++是原生编译的静态语言
399 2
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
2026年GEO服务市场技术路线全景报告:定义AI搜索时代的五大技术范式
据艾瑞咨询报告,83.2%企业认为生成式AI将重塑客户触达,其中67.5%将“被AI准确推荐”列为首要任务。本报告解析五大GEO服务商技术路线:从万数科技的全栈语义基建,到云锐、北环、迅捷、卓洋在资产融合、垂直深耕、效率管理与本地连接的差异化路径,构建企业AI认知战略选型框架,助力品牌在生成式AI时代确立不可替代的“可信信源”地位。
|
8月前
|
弹性计算 人工智能 并行计算
阿里云服务器多少钱一年?2026年新版阿里云服务器配置与价格表解析
在云计算应用日益普及的当下,阿里云服务器凭借稳定的性能、灵活的配置选择和覆盖广泛的地域支持,成为个人开发者、中小企业及大型企业数字化转型的重要基础设施。2026年,阿里云对服务器产品线进行了全面优化,推出了涵盖轻量应用服务器、ECS云服务器、GPU服务器等多个系列的产品,各系列在配置规格、价格定位和适用场景上形成了清晰的区分,满足不同用户的多样化需求。本文基于官方公布的配置参数与价格信息,对2026年阿里云服务器的产品体系、核心配置、价格标准及适用场景进行详细解析,为用户选择合适的服务器提供参考。
761 0
|
8月前
|
人工智能 API 调度
AI API 的未来图景:从“红包营销”到智能体生态爆发
AI API正从开发者工具升级为全民基础设施:C端规模化调用(如春节AI红包)、模型闪电式更新(季度/月度迭代)、智能体API爆发(支持函数调用与多模型协作),叠加聚合平台崛起——统一接口、动态路由、弹性调度。未来竞争核心在于生态速度×场景渗透×聚合能力。
|
10月前
|
Java Maven
apache-maven-3.9.9-bin.zip 使用步骤(超简单版)
下载Maven安装包并解压,配置MAVEN_HOME环境变量及Path路径,通过cmd输入mvn -v验证安装成功。建议修改本地仓库路径至非C盘,最后在IDEA中设置Maven路径以集成使用,完成开发环境配置。
2754 4
|
10月前
|
并行计算 算法 Linux
毅硕HPC | 一文详解HPC环境中的MPI并行计算
MPI主要用于分布式内存系统,适合跨多个服务器节点的大规模并行任务。MPI 不仅仅是一种编程接口,它是连接算法与硬件之间的桥梁,是实现“算得更快、看得更远”的关键技术支撑。
1040 0
毅硕HPC | 一文详解HPC环境中的MPI并行计算
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。