hash函数
SimHash +汉明距离
simhash是谷歌发明的算法,可以将一个文档转换成64位的字节,然后我们可以通过判断两个字节的汉明距离就知道是否相似了。其目的是降维。
汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:
1011101与 1001001之间的汉明距离是 2。
"toned"与 "roses"之间的汉明距离是 3。
首先我们来计算SimHash:
①分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重。提取文档特征词得到[word,weight]这个一个数组。(举例 [美国,4])
②用hash算法将word转为固定长度的二进制值的字符串[hash(word),weight]。(举例 [100101,4]),通过hash算法把每个词变成hash值
③ word的hash从左到右与权重相乘,如果为1则乘以1,如果是0则曾以-1。(举例4,-4,-4,4,-4,4)。
④接着计算下个数,直到将所有分词得出的词计算完,然后将每个词第三步得出的数组中的每一个值相加。(举例美国和51区,[4,-4,-4,4,-4,4]和[5 -5 5 -5 5 5]得到[9 -9 1 -1 1 9])
⑤对第四步得到的数组中每一个值进行判断,如果>0记为1,如果<0记为0。(举例[101011])
第四步得出的就是这个文档的SimHash。
这样我们就能将两个不同长度的文档转换为同样长度的SimHash值,因此,我们现在可以计算第一个文档的值和第二个文档的汉明距离(一般<3就是相似度高的)。
SimHash本质上是局部敏感性的hash(如果是两个相似的句子,那么只会有部分不同),和md5之类的不一样。正因为它的局部敏感性,所以我们可以使用海明距离来衡量SimHash值的相似度。
如果想要小数形式的可以这么做:1 -汉明距离 /最长关键词数组长度。
优点:文本处理速率快,计算后的指纹能够存储于数据库,因此对海量文本相似判定非常适合。缺点:由于短文本的用于哈希计算的数据源较少,因此短文本相似度识别率低。
更多simhash转载文章的链接
http://www.cnblogs.com/hxsyl/p/4518506.html(simhash的原理及应用)
http://blog.youkuaiyun.com/heiyeshuwu/article/details/44117473(simhash与minhash)
http://blog.youkuaiyun.com/ygrx/article/details/12748857(JaccardSimilarity方法和哈希签名函数)