洗稿,技术上怎么判断文章相似性?

这几天“差评洗稿”的事情,闹得沸沸扬扬,楼主本身也是内容创作的手艺人,简单说两句。

“运营为王”的今天,组一队编辑,起一个噱头标题,调整别人原创的内容(洗稿),在朋友圈/微信群/各渠道推广,个人原创作者根本防不胜防。

楼主最早写文章的配图都不带水印的,无奈抄袭成风的浮躁互联网,在N个平台发现了贴有“原创”标签的楼主的文章,才被迫打上“架构师之路”的水印。

画外音:楼主的配图很丑,很容易辨认。

当然,有些很用心的博主:

  • 会调整文章结构,文字顺序
  • 会重画架构图

反正就是不会说明来源。

洗稿又不犯法,怎么这么矫情?

大伙将心比心的感受下,辛辛苦苦花了5个小时缕思路,写文字,画图形,调格式发布的原创文字,5K阅读。

洗稿组织花了10分钟调整内容,打原创标签,多渠道运营,5W+阅读,原创作者会是什么感受?

大伙将心比心的感受下,辛辛苦苦花了4年时间,写了几百篇文章,只为分享知识。

被洗稿之后的文章,目的却是赚打赏赚广告费,原创作者会是什么感受?

真希望,这是“内容为王”的时代。

好了,技术公众号,还是多聊聊技术的东西。很多原创内容在网上被抄来抄去,改来改去,技术上有什么样的方法能够判断抄袭与洗稿,判断文章相似性,收集证据呢?希望本文能给大家一些思路。

两篇文章,如何判断一模一样?

:很容易想到的,一个字节一个字节的比对。

一个字节一个字节比对效率较低,有没有更高效的方法?

:可以用一个签名值(例如md5值)代表一篇文章,签名值相同则认为文章相同。

md5是一种常见的签名算法,常用来判断数据的完整性与一致性。例如:

  • 判断下载的区块链是否被篡改,只要比对本地数据md5,与预期的md5即可
  • 判断上线的二进制是否被篡改,只要比对线上二进制的md5,与编译机上二进制的md5即可
  • 判断消息是否被篡改,只要比对收到消息的md5,与传过来的md5值即可

md5设计原则:两篇文章哪怕只有1个字符不同,其md5签名值也会非常大,它只适用于“完整性”检测,并不适用于“相似性”检测。

对于一篇原创文章,洗稿者可能删除了5%的内容,修改了5%的内容,调整顺序了5%的内容(一般没有时间增加5%的内容)。此时的签名值并不相同。

洗稿这种场景,并不适合签名值比对。

有没有一种哈希算法,文章越相似,哈希值也越相似呢?

:局部敏感哈希LSH(Locality Sensitive Hash)是典型解决方案(感兴趣的同学自行百度),这里分享一下minHash的思路。

什么是minHash?

:minHash是局部敏感哈希的一种,它常用来快速判定集合的相似性,也常用于检测文章的相似性。

其思路为:用相同的规则抽取集合中的少部分元素代表整个集合,如果少部分元素的重合度很高,非常可能整个集合的重复度也很高。

举例:待判定的集合为A{1, 7, 5, 9, 3, 11, 15, 13}

已有的集合为:

B{10, 8, 2, 4, 6, 0, 1, 16},

C{100, 700, 500, 900, 300, 1100, 1500,1300},

D{1, 3, 2, 4, 6, 5, 8, 7}

假设使用部分元素代替全体集合的规则为:集合内元素进行排序,取值最小的4个(这个过程有信息损失,我们可以认为是一个hash过程)代表整个集合。

处理结果为:

A{1, 3, 5, 7}

B{0, 1, 2, 4} =>A与B有1个元素相同

C{100, 300, 500, 700} => A与C有0个元素相同

D{1, 2, 3, 4} => A与D有2个元素相同

判断结论:认为集合A与集合D是最相似的。

例子说明了整体思路,实际执行的过程中:

  • 可以使用更多的元素来代表集合,以提高准确性
  • 可以使用更多的hash函数来代表集合,以提高准确性
  • minHash可以量化评判相似度
  • 文章库中的哈希值都可以提前计算

minHash可以检测集合相似度,它与文章相似度有啥关系?

:如果能将每一篇文章,用一个集合来表示,那么文章的相似度就能用minHash来解决了。

如何将文章转化为集合?

:分词。

举例:文章为A{我是58沈剑,我来自58到家}

已有文章库为:

B{我是一只来自58的狼}

C{58到家,服务到家}

D{这事和我没关系,我是凑数的}

使用分词将上述文本集合化:

A{我,58,沈剑,来自,到家}

B{我,58,来自,狼}

C{58,服务,到家}

D{事,我,凑数,关系}

判断结论:转化为集合后,可以快速判断文章A与文章B的相似度最高。

实际执行过程中,除了分词还可以考虑词频,以及词的权重。用这种方法进行文章相似度检测,准确率非常高(文本越长越准)。

能否进一步优化,提升效率,保留证据,证明洗稿者抄袭?

答:使用上述方法进行文章相似度检测,需要进行中文分词,词频统计,哈希值计算,相似度计算,计算量微大。可以这么优化:

  • 不再进行分词,而是进行“分句”,用标点符号把长文按照句子分开,使用N个句子作为文章的签名,能大大降低工程复杂度,并且准确度也异常的高
  • 故意留一些错别字,洗稿者很难发现这些错别字,能够很快证明抄袭成立

总结

  • 签名,例如md5经常用于判断文章相同,其效率比全文比对效率高
  • 局部敏感哈希,例如minhash经常用于判断文章相似
  • minhash的原理是,使用子集代表全集合,以子集的相似性模拟全集合的相似性
  • 把文章转化为集合的常见方法是分词
  • 分句,故意留错别字能够提高检测效率

画外音:看了下后台,创作4年,总打赏10797.72元,感谢大家。文章中部广告,文章底部广告,文章底部二维打赏码都非常影响用户体验,楼主就不这么切入广告了。平时发的推广软文,大家多帮忙扫扫码,多帮忙点击点击,多帮忙转发转发哈,撰文不易。

做技术,思路更重要,求转。

原文发布于微信公众号 - 架构师之路(road5858)

原文发表时间:2018-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

用 Python 做文本挖掘的流程

作者:肖智博 来源:https://zhuanlan.zhihu.com/p/19630762 点击阅读原文可进入超链接。 收集数据 数据集。如果是已经被人做...

4688
来自专栏小樱的经验随笔

元胞自动机实现多数分类算法

元胞自动机(Cellular automaton) 元胞自动机是由元胞组成的网格,每个元胞都根据邻域的状态来选择开或关。所有的元胞都遵循同样的规则,也称为元胞的...

3355
来自专栏逸鹏说道

借网站日记分析~普及一下Pandas基础

对网站日记分析其实比较常见,今天模拟演示一下一些应用场景,也顺便说说Pandas,图示部分也简单分析了下

673
来自专栏数据和云

性能优化:认识B*Tree 索引分裂(二)

黄玮(Fuyuncat) 黄玮(Fuyuncat),资深 Oracle DBA,从事Oracle数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、开发...

3445
来自专栏张善友的专栏

C#数学计算包 Math.NET

Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂...

3435
来自专栏程序员叨叨叨

6.4 移位操作符

Cg语言中的移位操作符,功能和C语言中的一样,也可以作用在向量上,但是向量类型必须是int类型。例如:

1242
来自专栏程序人生

谈谈状态机

题记:上周做 BBL 里讲了我们 Tubi TV 内部做 DSL 的一些简单实践,大家反馈不错。有同事建议我给大家先补补 FSM,之后再进阶 CFG,可能会更顺...

3707
来自专栏新智元

Jeff Dean推荐:用TPU跑Julia程序,只需不到1000行代码

Julia是一门集众家所长的编程语言。随着Julia 1.0在8月初正式发布,Julia语言已然成为机器学习编程的新宠。

1071
来自专栏生信技能树

【生信菜鸟经】如何系统入门R语言

写在前面 R语言不仅在生物信息数据处理中发挥着重要作用,也是其它主流数据处理人士的首选工具。现在非常多自学生物信息学的小伙伴必须学的就是R,所以写一个R的系统性...

1.4K9
来自专栏Aloys的开发之路

OOAD与UML笔记

UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素、构建模块、分析过程并可通过文档说明系统中的重...

1998

扫码关注云+社区

领取腾讯云代金券