通过本文你将了解到以下内容:
- 信息爆炸的日常生活
- 网页去重和局部敏感哈希算法
- simhash算法基本原理和过程分析
- 工程中的去重和聚类实现建议
信息爆炸
从2010年之后移动互联网如火如荼,笔者在2011年的时候还在用只能打电话发短信的那种手机,然而现在几乎每个人手机里的app起码有10-20款,以至于经常有种信息爆炸到头晕的感觉,回顾一下匆匆十年手机里的变化:
以笔者目前正在从事的信息流领域来说,有今日头条、百度App、搜狗搜索app、一点资讯、趣头条等feed软件。
很多时候都是自媒体作者会同时在多个平台发布相同的文章,然后会出现非常多的洗稿文章、抄袭文章等,我们无法杜绝和制止这种行为,但是很多时候需要我们使用技术手段来进行识别并处理,让用户看到最好的形式的文章和资讯。
信息爆炸时代,我们需要一个好的文本去重算法。
网页去重
前面是以信息流为例来说的,但是更早的文本去重场景是网页去重,像谷歌、百度、搜狗这种大型的搜索引擎,必须有一套高效的去重算法,要不然网络蜘蛛将做非常多的无用功,时效性等都无法得到保证,更重要的是用户体验也不好。
研究表明:互联网上近似重复的网页的数量占网页总数量的比例高达29%,完全相同的网页大约占网页总数量的22%。
实际中搜索引擎的去重和排序都非常复杂,本文本着简化的思路来阐述其中的一些要点,无法全面深入,对此表示歉意。
谷歌出品,必属精品,我们来看看地表最强搜索引擎是如果做网页去重呢?
这里就引出了今天要讲的主要内容simhash算法,本质上文本去重算法有很多种,每种算法都有各自的优劣势,本文并不做横向对比,而是直接引出simhash算法进行阐述,对于横向对比感兴趣的读者可以自行查阅相关资料。
局部性敏感哈希
说到hash可能我们第一个想到的是md5这种信息摘要算法,可能两篇文本只有一个标点符号的差距,但是两篇文本A和B的md5值差异就非常大,感兴趣的可以试验一下看看,Linux环境下直接md5sum即可计算。
有时候我们希望的是原本相同的文章做了微小改动之后的哈希值也是相似的,这种哈希算法称为局部敏感哈希LSH(Locality Sensitive Hashing),这样我们就能从哈希值来推断相似的文章。
局部敏感哈希算法使得在原来空间相似的样本集合,进行相关运算映射到特定范围空间时仍然是相似的,这样还不够,还需要保证原来不相似的哈希之后仍然极大概率不相似,这种双向保证才让LSH的应用成为可能。
笔者个人认为LSH常用的用途是判重和聚类,其实这两个作用很相似,比如在信息流中我们在识别到文章相似之后无法拒绝入库,这时候就会做聚类,然后用一个id来串起来很多相似的id,从而实现相似文章的把控和管理。
simhash的基本过程
降维压缩映射
simhash算法可以将一个文本生成为一个64bit的二进制数,这里提一句simhash算法最初貌似并不是谷歌提出来的,而是谷歌应用推广的,所以本文出现的simhash相关的数据也都是基于工程中谷歌提出的simhash网页去重展开的。
谷歌2007年关于simhash的论文: https://www2007.org/papers/paper215.pdf
64bit文本容量