博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
simhash的原理和php实现
阅读量:5992 次
发布时间:2019-06-20

本文共 3089 字,大约阅读时间需要 10 分钟。

hot3.png

1 simhash的原理,比较详细的参考链接: 2 simhash的php实现(如下)。主要用到了php的类库gmp 3 ps:oshchina代码编辑器真心难用,大家将就一下。。以后改好哈。希望能改进!! 4 因为工作原因用php重写了simhash算法

m_hashbits = $hashbits; $this->m_hash = $this->simhash($tokens); } //to string public function __toString() { return strval($this->m_hash); } //返回hash值 public function simhash($tokens) { if(!is_array($tokens)) { throw new Exception("tokens should be array"); } $v = array_fill(0,$this->m_hashbits,0); foreach($tokens as $x) { $x = $this->stringHash($x); for($i=0;$i<$this->m_hashbits;$i++) { $bitmask = gmp_init(1); gmp_setbit($bitmask, $i); $bitmask = gmp_sub($bitmask,1); if (gmp_strval(gmp_and($x,$bitmask)) != "0") { $v[$i] += 1; } else { $v[$i] -= 1; } } } $sum = 0; for($i=0;$i<$this->m_hashbits;$i++) { if ($v[$i] >= 0) { $num = gmp_init(1); gmp_setbit($num, $i); $num = gmp_sub($num,1); $sum = gmp_add($sum,$num); } } return gmp_strval($sum); } //求海明距离 public function hammingDistance($other) { $a = gmp_init($this->m_hash); $b = gmp_init($other->m_hash); $c = gmp_init(1); gmp_setbit($c, $this->m_hashbits); $c = gmp_sub($c,2); $x = gmp_and(gmp_xor($a,$b),$c); $tot = 0; while(gmp_strval($x)) { $tot += 1; $x = gmp_and($x,gmp_sub($x,1)); } return $tot; } //求相似度 public function similarity ($other) { $a = floatval($this->m_hash); $b = floatval($other->m_hash); if($a > $b) { return $b/$a; } else { return $a/$b; } } public function stringHash($source) { if(empty($source)) { return 0; } else { $x = ord($source[0]) << 7; $m = 1000003; $mask = gmp_sub(gmp_pow("2", $this->m_hashbits),1); $len = strlen($source); for($i=0;$i<$len;$i++) { $x = gmp_and(gmp_xor(gmp_mul($x,$m),ord($source[$i])),$mask); } $x = gmp_xor($x,$len); if(intval(gmp_strval($x)) == -1) { $x = -2; } return $x; } }}$s = 'This is a test string for testing';$hash1 = new Simhash(explode(" ",$s));$s = 'This is a test string for testing also';$hash2 = new Simhash(explode(" ",$s));$s = 'nai nai ge xiong cao';$hash3 = new Simhash(explode(" ",$s));var_dump($hash1->hammingDistance($hash2) , " " , $hash1->similarity($hash2));var_dump($hash1->hammingDistance($hash3) , " " , $hash1->similarity($hash3));

转载于:https://my.oschina.net/u/218155/blog/176928

你可能感兴趣的文章
Windows下的Redis安装教程
查看>>
box-sizing:border-box的强大之处?
查看>>
深入研究URL编码问题及JavaScript相应的解决方案
查看>>
coreseek/sphinx多条件字段查询
查看>>
常见的免费SMTP服务器有哪些,如何设置
查看>>
Pinyin4jUtil 汉字转拼音
查看>>
java实现图片水印
查看>>
搜索引擎的一个实验
查看>>
socket 编程入门教程(三)TCP原理:4、设计TCP socket的类(下)
查看>>
万能配置的大屏可视化功能来啦~
查看>>
Linux安装git
查看>>
JAVA常见面试题之Forward和Redirect的区别
查看>>
网站目录文件权限的简单安全设置
查看>>
iReport中使用JavaBeanDataSource,父子报表,html标签,自定义格...
查看>>
自定义URL规则,URL传参
查看>>
关于加速和优化网页设计的文档收集
查看>>
Linux无法登录,提示module is unknown并闪退
查看>>
Calendar 日期类的使用
查看>>
Zookeeper-Watcher机制与异步调用原理
查看>>
RAID详解[RAID0/RAID1/RAID10/RAID5]
查看>>