附注:用BigInteger类型来存储64位的hash码 http://doc.java.sun.com/DocWeb/api/all/java.math.BigInteger 很好用,xor()异或、BigInteger.bitLength()取位长、.bitCount()取位为1的个数。 simHash算法流程: 1): 计算simHash码 a). 字符串String分词得到tokens; b). 计算每个tokens的64位Hash码; c). 按Hash码的位进行标记,1则标记为1、否则标记为-1; d). 把每个tokens的Hash码按位进行统计求和; e). 进行签名,大于0则为1,否则为0,得到64位simHash指纹。 2): 把64位simHash码均分为汉明距离n+1块,方便后续查找的所有近邻simHash码; 3): 计算两个simHash码的汉明距离, 方法一:给出simHash的64位二进制码字符串:str1.charAt(i) != str2.charAt(i); 方法二:给出simHash的int值:先做异或,然后统计异或后二进制位数为1的个数 问题!?:simHash在短文本的可行性! 测试相似文本的相似度与汉明距离 测试文本:20个城市名作为词串:北京,上海,香港,深圳,广州,台北,南京,大连,苏州,青岛,无锡,佛山,重庆,宁波,杭州,成都,武汉,澳门,天津,沈阳 相似度矩阵: simHash码: 勘误:0.667, Hm:13 是对比的msg 1与2。 可见:相似度在0.8左右的Hamming距离为7,只有相似度高到0.9412,Hamming距离才近到4,此时,反观Google对此算法的应用场景:网页近重复。 … 继续阅读 →