出处:(1)原创内容不易,网上抄袭现象普遍,网上很多原创内容都是抄袭改的(2)百度网库是非常大,爬虫如何判断新网页是否与网页库中已有网页重复?这就是本文要讨论的问题(尽量使用大家能立即理解的语言和例子)。1.传统签名算法和文本完整性判断的问题:(1)运维发起一个bin文件,分发给4台在线机器。如何判断所有的bin文件是否一致?(2)用户A将消息msg发送给用户B,用户B如何判断收到的msg_t是用户A发送的msg?思路:逐字节比较两个大文件或大网页,效率很低。我们可以用一个签名值(例如md5值)来表示一个大文件,如果签名值相同,则认为大文件相同(先不考虑冲突率)。答:(1)bin文件使用md5,在??线4台机器上的bin文件都使用md5,如果5个md5值相同,说明一致(2)用户A发送msg和md5同时将消息发送给用户B,用户B收到msg_t后也取md5。如果得到的值与用户A发送的md5值相同,则说明msg_t与msg相同结论:md5是一种签名算法,常用于判断数据的完整性和一致性,仅适用于“完整性””检查,而不是“相似性”检查。一个新的问题出现了:有没有一种签名算法,如果文本很相似,那么签名值也很相似?2.文本相似度的签名算法上面提出的问题可以通过局部敏感散列LSH(LocalitySensitiveHash)来解决,局部敏感散列是一种哈希算法,文本越相似,哈希值越相似。有兴趣的同学可以自行百度,在这里分享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个(这个过程有信息损失,我们可以认为是哈希过程)处理结果为: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是最相似的。这个例子有点2,但基本能说明整体思路。在实际实现过程中:(1)我们可以使用更多的元素来表示集合,以提高准确率(例如将上例中的4个元素表示集合升级为8个元素表示集合)(2)我们可以使用更多的哈希函数来表示集合以提高准确性(例如,在上面的示例中,除了“排序并取最小值的4个元素表示集合”之外,还可以添加一个哈希函数“这4个元素排序后的最高值代表集合”)(3)minHash可以量化相似度,判断网页是否重复(分类问题),设置相似度阈值,高于阈值重复,低于阈值不重复(4)在实际去重过程中,可以预先计算网页库中的哈希值,只有待确定的集合或网页的哈希值才需要临时计算。3、minHash和长文本重复检测有什么关系?目前看来与它无关,但是如果我们能够用一个集合来表示每一个长文本,那么长文本的相似度就可以使用minHash来解决。问题:如何将长文本转换为集合?答:放开我,分词不好吗?例:待判断的长文本是A{我是58神剑,我是58道家}现有的网络图书馆馆藏是:B{我是58的狼}C{58到家,服务在home}D{这件事与我无关,我只是凑个数}用分词法将上面的文字收集起来:A{I,58,申建,from,tohome}B{I,58,from,wolf}C{58,service,tohome}D{thing,me,makeup,relationship}判断结论:当当当,转换成集合后,可以快速判断A和B的相似度,准确率极佳,当然在实际执行过程中,除了分词外,还必须考虑词频。用这种方法对长文本进行相似度检测,准确率非常高(文本越长越准确)4、有没有更有效的方法?使用上述方法进行文本相似度检测需要中文分词、词频统计、哈希值计算、相似度计算,计算量很小。不过,抄袭、一字不改的风潮,让这项技术有了更广阔的优化空间。称赞!如何优化?不再是分词,而是“分句”,用标点符号把长文本按句子分开,用一组N句(比如一篇文章中最长的5句作为署名,注意长句比短句)作为文章的署名。在抄袭盛行的互联网环境下,这种方法判断的可重复性可以大大降低工程复杂度,准确率也极高。五、结论在抄袭盛行的互联网环境下,采用“句子”的方式,将最长的5个网页内容作为网页的签名,可以大大降低重复排名系统的复杂度,提高重复排名的准确性。一个不错的选择。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】
