海量数据处理(四) simhash

 

如果有一天,你向优酷传了一个记录着你和我当天一起去长城玩的小视频(假设其大小为1G)。在你传完以后,我也传了一个和你一模一样的视频。但是我一点击上传,几秒钟就现设上传成功。这是为什么呢。这就是这这会要讨论的simhash算法。

 

simhash过程一共有5个步骤,分词,hash,加权,合并,降维。

 

第一步分词。假设现在给一个句子:我今天有课。再给一个句子:我明天有课。很明显这两个句子代表的含义明显不一样,如果按照simhash的步骤来看,那么我们首先应该分词:第一个句子:我(),今天(),有课()。括号内代表着不同的权重。同理第二个句子可以分为:我(),明天(),有课().括号内的权重应该有以下两种方法:静态给定和统计出现频率来给权重。

 

第二步hash:hash结果将以二进制表示,比如给权重如下:我(5),今天(4),有课(3);我(5),明天(3),有课(3)。假设哈希结果为:100101, 今天:101011。即通过某种算法,得出了一系列数字。

 

第三步加权:现在要对“我”这个字加权,遇到1则哈希值与权重正乘,遇到0则哈希值与权重负乘结果为100101*5 =5-5 -5 5 -5 5 。“今天”的加权结果为 101011*4 =4 -4 4 -4 4 4其他词同样操作。

 

第四步合并:将所有的加权结果累加,变成只有一个序列串。比如对“我今天”进行加权累加,得到的结果为9 -9 1 -1 1 9

 

第五步降维:对于其结果,如果大于0就制为1,否则就置为0。所以得到结果:101011.这就是“我今天”最后得到的哈希值。

 

回到最开始的问题。如果我们最后看到你传的视频的哈希值和我传的视频的哈希值,是一模一样的。那就代表着,我们两个传的文件,是一模一样的。那既然一模一样,为什么我还要再传一遍呢?数据库里改一改就好了嘛。

 

换个话题继续讨论。如果你的数据库里存在着百万,千万,甚至上亿个哈希值。并且系统对于上传文件要求对于视频允许存在一些细微的差别(比如多了几秒片头片尾的黑屏)那么我们如果继续使用这种挨个比较的算法,那时间上会不会太慢了?如果太慢了,那又该怎么优化呢?

 

我们需要引入三个个新的概念:鸽巢原理、倒排索引、海明距离。三个概念在此不再详述,请自行百度。

 

依照惯例,我们对于相似度的要求是在64位系统下海明距离不超过3,那么根据鸽巢原理,我们将其64位平均分为4个小块。如果这两个视频是类似的,这样就一定会有一个小块里的哈希值是全等的。那么我们建立倒排索引,通过倒排索引来进行查找,这样就不需要挨个比较了。

你可能感兴趣的:(海量数据处理(四) simhash)