文本去重算法——simhash简介

一、基本概念

simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。 
 
simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述: 
 

二、步骤

1、分词 
        给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“腾讯上海分公司三楼食堂的快餐”,分词后为:“腾讯 上海分公司 三楼 食堂 的 快餐”,然后为每个特征向量赋予权值:腾讯(4) 上海分公司(5) 三楼(3) 食堂(2) 的(1) 快餐(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。 
2、hash 
      通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“腾讯”的hash值Hash(腾讯)为100101,“上海分公司”的hash值Hash(上海分公司)为“101011”。就这样,字符串就变成了一系列数字。 
3、加权 
     在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。例如给“腾讯”的hash值“100101”加权得 到:W(腾讯) = 100101*4 = 4 -4 -4 4 -4 4,给“上海分公司”的hash值“101011”加权得到:W(上海分公司)=101011*5 = 5 -5 5 -5 5 5,其余特征向量类似此般操作。 
4、合并 
       将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“腾讯”的“4 -4 -4 4 -4 4”和“上海分公司”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。 
5、降维 
       对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的汉 明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。

三、举例

现在有两串文本,文本1:“你妈妈  你回家吃饭  ,回家罗回家罗”;文本2:“你妈妈  你回家吃饭  ,回家罗回家罗”。显然这两句话有很高的相似度,我们来看看经过simhash算法后,两者的simhash签名。 
 
1、求文本1的simhash签名。 
a、分词:你(3)妈妈(3)喊(2)你(3)回家(4)吃饭(4)哦(2),回家罗(3)回家罗(3)。 
b、hash:你(001000)妈妈(010100)喊(001000)你(001000)回家(100001)吃饭(101001)哦(101000)回家罗(100110)回家罗(100110)。 
c、加权:你(-3 -3 3 -3 -3 -3)妈妈(-3 3 -3 3 -3 -3)喊(-2 -2 2 -2 -2 -2)你(-3 -3 3 -3 -3 -3)回家(4 -4 -4 -4 -4 4)吃饭(4 -4 4 -4 -4 4)哦(2 -2 2 -2 -2 -2)回家罗(3 -3 -3 3 3 -3)回家罗(3 -3 -3 3 3 -3)。 
d、合并:5 -21 1 -9 -15 -11 
e、降纬:1 0 1 0 0 0 
 
2、求文本2的simhash签名。 
a、分词:你(3)妈妈(3)叫(2)你(3)回家(4)吃饭(4)啦(2),回家罗(3)回家罗(3)。 
b、hash:你(001000)妈妈(010100)叫(000011)你(001000)回家(100001)吃饭(101001)啦(100010)回家罗(100110)回家罗(100110)。 
c、加权:你(-3 -3 3 -3 -3 -3)妈妈(-3 3 -3 3 -3 -3)叫(-2 -2 -2 -2 2 2)你(-3 -3 3 -3 -3 -3)回家(4 -4 -4 -4 -4 4)吃饭(4 -4 4 -4 -4 4)啦(2 -2 -2 -2 2 -2)回家罗(3 -3 -3 3 3 -3)回家罗(3 -3 -3 3 3 -3)。 
d、合并:5 -21 -7 -9 -7 -7 
e、降纬:1 0 0 0 0 0 
 
3、计算汉明距离 
上述得到的simhash签名分别为:“101000”和“100000” 
计算汉明距离为1。

posted @ 2017-08-31 14:23  ->大胖子  阅读(939)  评论(0编辑  收藏  举报