短文本重复率快速检测

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

1.gif

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



核心难点

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


分析关键词句


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



高压洗车,一轻松洗车不等待,全铜46高压可调节接头套装浇花灌溉园,高压洗车,一轻松洗车不等待



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

  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, '');


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

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


 找出关键词句


首先我们要将字符串拆成单字数组,这里记录了最原始的字符出现的顺序。['高', '压', '洗', '车', '水', '枪', '一', '喷', '轻', '松', '洗', '车', '不', '等', '待', '全', '铜', '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 等技术领域都有比较多挖掘和技术应用,欢迎留言技术交流。

相关文章
|
安全 Shell 网络安全
|
JSON 监控 数据管理
【Elasticsearch专栏 12】深入探索:Elasticsearch使用索引生命周期管理(ILM)自动化删除旧数据
Elasticsearch的ILM功能允许用户定义策略,自动管理索引从创建到删除的生命周期。用户可以设置策略,根据索引年龄或大小自动删除旧数据,节省存储空间。通过应用ILM策略于索引模板,新索引将遵循预定义的生命周期。用户还可以监控ILM状态,确保策略按预期执行。使用ILM,用户可以高效地管理数据,确保旧数据及时删除,同时保持数据完整性和安全性。
663 3
|
缓存 数据库
15- 什么是缓存击穿 ? 怎么解决 ?
`# 缓存击穿简介及解决方案` 缓存击穿是指大量请求同时命中已过期的缓存,导致数据库压力骤增。解决方法包括:1) 预热热点数据;2) 设置热点数据永不过期;3) 使用加锁或限流策略。
413 4
|
7月前
|
人工智能 算法 API
多模态模型卷王诞生!InternVL3:上海AI Lab开源78B多模态大模型,支持图文视频全解析!
上海人工智能实验室开源的InternVL3系列多模态大语言模型,通过原生多模态预训练方法实现文本、图像、视频的统一处理,支持从1B到78B共7种参数规模。
1160 6
多模态模型卷王诞生!InternVL3:上海AI Lab开源78B多模态大模型,支持图文视频全解析!
|
8月前
|
数据采集 文字识别 API
Python爬虫模拟登录并跳过二次验证
Python爬虫模拟登录并跳过二次验证
|
12月前
|
自然语言处理 算法 开发者
通义灵码开发者社区的重要性——反馈与改进
通义灵码开发者社区是用户反馈的重要平台,用户可直接反馈使用中遇到的问题、建议和需求,如代码错误或性能问题。社区还支持通义灵码团队主动征求用户意见,通过调查问卷等形式收集反馈,以优化产品功能和用户体验,解决兼容性和性能等潜在问题,推动产品的持续改进和发展。
通义灵码开发者社区的重要性——反馈与改进
|
JavaScript 前端开发 搜索推荐
CSR、SSR与同构渲染全方位解析
CSR、SSR与同构渲染全方位解析
343 0
|
10月前
|
存储 运维 NoSQL
【赵渝强老师】Redis的慢查询日志
Redis慢查询日志用于记录执行时间超过预设阈值的命令,帮助开发和运维人员定位性能问题。每条慢查询日志包含标识ID、发生时间戳、命令耗时及详细信息。配置参数包括`slowlog-max-len`(默认128)和`slowlog-log-slower-than`(默认10000微秒)。实战中可通过`slowlog get`获取日志、`slowlog len`查看长度、`slowlog reset`重置日志。建议线上环境将`slowlog-max-len`设为1000以上,并根据并发量调整`slowlog-log-slower-than`。需要注意的是,慢查询只记录命令执行时间。
498 5
|
弹性计算 负载均衡 监控
阿里云aca考试大纲 分享阿里云aca题库及答案
现在云计算云服务是高新技术的重要发展发现之一,阿里云长期占有国内的最大市场份额,因此考取阿里云认证也成为想入行的技术人员努力争取的目标,今天就分享阿里云aca题库及答案.希望能帮更多人实现理想。
4055 1
阿里云aca考试大纲 分享阿里云aca题库及答案