一.背景
互联网上,一篇文章被抄袭来抄袭去,转载来转载去。
被抄袭的文章一般不改,或者少量改动就发表了,所以判重并不是等于的关系,而是相似判断,这个判别的算法就是simhash。
二.simhash计算
给定一篇文章内容,利用simhash算法可以计算出一个哈希值(64位整形)。
判别两篇文章是相似的方法,就是两个simhash值的距离<=3,这里距离计算采用汉明距离,也就是2个simhash做一下异或运算,数一下比特位=1的有N位,那么距离就是N。
现在问题就是,如何计算文本的simhash?(局部敏感hash)
三.实现原理:
第一步:分词+权重
首先需要将文章作分词,得到若干个(词组,权重)。
分词我们知道很多库都可以实现,最常见的就是结巴分词。权重是怎么得来的呢?
权重一般用TF/IDF算法,TF表示词组在本文章内的频次比例,出现越多则对这篇文章来说越重要,文章分词后TF可以立马计算出来。
IDF是词组在所有文章中的出现比例,出现越多说明词组对文章的区分度越低越不重要,但是IDF因为需要基于所有文章统计,所以一般是离线去批量计算出一个IDF字典。
结巴分词支持加载IDF词典并且提供了一个默认的词典,它包含了大量的词组以及基于海量文本统计出来的IDF词频,基本可以拿来即用,除非你想自己去挖掘这样一个字典。如果文章产生的分词在IDF字典里不存在,那么会采用IDF字典的中位数作为默认IDF,所谓中庸之道。
所以呢,我建议用结巴分词做一个分词服务,产生文章的(分词,权重),作为simhash计算的输入。
<