短文本重复率快速检测
直奔主题,本文讲述的就是一种快速检测短文本重复率的方法,适用的场景类似内容发布,商品发布等,减少劣质的堆砌型文本,比如:“高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待”
核心难点
要解决这个问题的最大的难点是如何确定重复的关键词句,拿到后,就可以分别算出关键词句在总字符中的占比和出现次数,进而计算出重复率,所以我们先从这一步开始。
分析关键词句
我们以上面的例子为例,为了方便理解,这里我们先手动标识下重复的文案
“高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待”
重复的词句我通过相同的背景色进行了标识,我们可以看到重复的如下:
“高压洗车水枪,一喷轻松洗车不等待” 出现了 2 次,这个是最明显的文字堆砌,我们希望最终分析出这个结果
“水枪” 出现了 3 次
“喷” 出现了3次
“分” 出现了2次
“枪” 出现了4次
如上,我们通过大脑回路就能够判断出来,这个文案不合格,显然有文字堆砌的嫌疑,那我们怎么通过代码快速识别出来呢?
通过如上手动分析过程我们发现有几个特点:
单词、字、标点符号等重复出现的概率比较大,并且不适合通过这种字符判断重复
长的重复词句会覆盖更短的重复词句,需要避免重复计算重复率,否则会增大重复率计算
▐ 去除特殊字符
综合如上特点,我确定的第一个思路就是去除特殊字符,毕竟在真实业务场景,大家不会写一堆标点符号,因为这个比文字堆砌更低级,这个比较简单,就像给字符串洗澡一样,一个正则命令就可以搞定
const demoText = '高压洗车水枪,一喷轻松洗车不等待,全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园,高压洗车水枪,一喷轻松洗车不等待';
const specialTextReg:RegExp = /[\s·!#¥(——):;“”‘、,|《。》?、【】[\]`~!@#$%^&*()_+<>?:"{},.\/;']/gim;
const cleanText = demoText.replace(specialTextReg, '');
输出的结果如下,我们下文称这个字符串为“母字符串”:
“高压洗车水枪一喷轻松洗车不等待全铜4分6分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”
这样就比较简单了,方便做进一步的关键词句分析
▐ 找出关键词句
首先我们要将字符串拆成单字数组,这里记录了最原始的字符出现的顺序。
['高', '压', '洗', '车', '水', '枪', '一', '喷', '轻', '松', '洗', '车', '不', '等', '待', '全', '铜', '4', '分', '6', '分', '高', '压', '水', '枪', '可', '调', '节', '喷', '枪', '接', '头', '套', '装', '浇', '花', '灌', '溉', '园', '高', '压', '洗', '车', '水', '枪', '一', '喷', '轻', '松', '洗', '车', '不', '等', '待']
关键词句的出现有一个非常重要的特点,就是连续出现(好像是句废话),那如何分析连续性呢,这里我们可以将连续的字放在单独的数组中,以方便我们区分连续性,所以我们最终要得到一个二维数组,二维数组的生成我们遵循三个基本原则:
从来没有出现的字符放在第一个数组中(母数组),并按照出现的顺序排序
每一个字符和第一个字符进行比较,如果出现过则新增数组,并存储在新数组中对应的母数组位置
如果下一个字符也重复,则不用新增数组,只需要在原数组中新增字符,出现以下两种情况需要新开数组:
重复的字符中断(就是出现了母数组没有的字符,这时候需要将字符 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 中重复出现的词句:
在同一个数组中连续的字符确定为重复词句
当遇到空或者切换数组,则连续中断
通过如上两个步骤,确定结果如下:
关键词句 |
重复出现次数 |
重复率 |
洗车 |
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分高压水枪可调节喷枪接头套装浇花灌溉园高压洗车水枪一喷轻松洗车不等待”
所以除了根据是否切换数组和是否有空来判断连续性还不够,需要增加一个下标,这里的下标是字符在母字符串出现的序号,通过下标是否连续进行关键词句的拼合
得出重复率词句如下:
关键词句 |
洗车 |
分高压水枪 |
喷枪 |
高压洗车水枪一喷轻松洗车不等待 |
这里我们发现除了第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 等技术领域都有比较多挖掘和技术应用,欢迎留言技术交流。
✿ 拓展阅读
作者|蒂夫
编辑|橙子君
短文本重复率快速检测相关推荐
- 怎样对论文重复率进行检查
论文的重复率应该怎样进行检查呢?很多的论文都是对重复率有所要求的,那么当我们写好了一篇论文,我们应该怎样检测论文的重复率呢?下面我们就一起来看一下吧. 操作步骤: 步骤一:首先,我们需要先准备一台电脑 ...
- 产生论文高重复率的原因及降重方法
一.产生论文高重复率的原因 你所写的内容大多都是直接在网上抄袭的,这样的直接复制粘贴造成雷同,没有分析的必要,不在讨论之列.这样的论文在提交到查重检测时,查重系统的数据库其实早已收录过其中的内容了,所 ...
- 2篇word文档比较重复率_继续教育 | 你该知道的论文小技巧——重复率检测
点击上方蓝字关注我们 一年一度的毕业季又到了,不少学生愁眉苦脸,最近看到2016级.2017级的小伙伴们都开始疯狂加油写论文,但是写毕业论文,重复率必须达标.据报道,部分学校的毕业论文"查重 ...
- 代码重复率PHP,终端代码重复率检测实践
背景 当一个项目在不断开发迭代.功能累加的过程中,重复代码的出现几乎是不可避免的.其出现的原因不外乎以下两点: 复制粘贴:这可能是造成代码重复的最大因素,其原因也有很多种,可能是跨项目的代码拷贝,可能 ...
- php 判断文章重复率,(一)、社区反垃圾化之文字重复率检测
(一).社区反垃圾化之文字重复率检测 序言: 随着用户量的增长和内容化过渡化增长,总会有一些不坏好意的人在你的产品或者应用中留下一些垃圾,这些垃圾并不是传统意义的垃圾,而是指互联网上的垃圾文本.垃圾邮 ...
- 论文检测重复率怎么修改
对于即将走出校园的毕业生们此刻正在忙碌毕业论文的写作,高校对毕业论文都有自己的标准,只有符合要求才能够顺利毕业,因此同学们都很重视,因为它直接关系到学生能否拿到毕业资格证书,否则的话直到学生们通过 ...
- 2篇word文档比较重复率_论文深耕 | 论文重复率太高怎么办?7个降重技巧收好了!...
Hello! 这是你与「大学生科研竞赛」的第 25 次相遇. 不知道从什么时候开始,我们的网络社区被各种关于论文降重.论文查重.论文改重的知识所包围.相信每个上了大学的朋友或多或少都会接触到这方面的内 ...
- 论文查重图片会不会算重复率?
许多大学生写的毕业论文都会有图片内容,而在各种学术不端行为中,文字拷贝是最普遍.最严重的, 论文查重 时也主要是检测论文中的文字重复情况,那么, 论文查重图片会不会去算重复率?今天小编就来为大家解答疑 ...
- 论文降重有效减少重复率修改的方法
今年,学校对论文检测的似乎比往年更加严格,对文章的重复率的要求也是再创新高,有些高校甚至要求重复率低于8%,所以对于学生掌握一些论文降重有效减少重复率修改的方法非常必要,具体方法小编整理如下: 一 ...
最新文章
- 【译】如何精确判断最终用户响应时间过长的原因?
- 十问 | 关于Service Mesh 和Kubernets的最前沿思考
- python 自定义异常
- PlentyOfFish.com .NET网站的又一传奇
- 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去
- 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序
- 递归的使用不当 导致 压缩文件不能压缩二级目录
- javascript拾遗
- C语言实现九九乘法表
- django下载或者导出文件
- 什么是PLC软元件和软继电器
- ReactNative实现仿微信或者通讯录快速索引功能
- 如何用列表解析式生成 2个小数位 的 python 列表
- QlikView常用函数(整理)
- 天池大数据阿里流行音乐竞赛
- 成功的路上会布满荆棘
- 我眼中的工程师的十个特质
- python locust提取参数_python+locust性能测试学习笔记
- java高级软件工程师面试题
- arm mali 天梯图_ARM发飙!最强移动CPU/GPU来了:一图懂