python实现simhash算法实例


Posted in Python onApril 25, 2014

Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本,64bit也相似,论文中k的经验值为3。该方法的缺点如优点一样明显,主要有两点,对于短文本,k值很敏感;另一个是由于算法是以空间换时间,系统内存吃不消。

python实现simhash算法实例

#!/usr/bin/python
# coding=utf-8
class simhash:    #构造函数
    def __init__(self, tokens='', hashbits=128):        
        self.hashbits = hashbits
        self.hash = self.simhash(tokens);
    #toString函数    
    def __str__(self):
        return str(self.hash)
    #生成simhash值    
    def simhash(self, tokens):
        v = [0] * self.hashbits
        for t in [self._string_hash(x) for x in tokens]: #t为token的普通hash值           
            for i in range(self.hashbits):
                bitmask = 1 << i
                if t & bitmask :
                    v[i] += 1 #查看当前bit位是否为1,是的话将该位+1
                else:
                    v[i] -= 1 #否则的话,该位-1
        fingerprint = 0
        for i in range(self.hashbits):
            if v[i] >= 0:
                fingerprint += 1 << i
        return fingerprint #整个文档的fingerprint为最终各个位>=0的和
    #求海明距离
    def hamming_distance(self, other):
        x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1)
        tot = 0;
        while x :
            tot += 1
            x &= x - 1
        return tot
    #求相似度
    def similarity (self, other):
        a = float(self.hash)
        b = float(other.hash)
        if a > b : return b / a
        else: return a / b
    #针对source生成hash值   (一个可变长度版本的Python的内置散列)
    def _string_hash(self, source):        
        if source == "":
            return 0
        else:
            x = ord(source[0]) << 7
            m = 1000003
            mask = 2 ** self.hashbits - 1
            for c in source:
                x = ((x * m) ^ ord(c)) & mask
            x ^= len(source)
            if x == -1:
                x = -2
            return x
             

if __name__ == '__main__':
    s = 'This is a test string for testing'
    hash1 = simhash(s.split())
    s = 'This is a test string for testing also'
    hash2 = simhash(s.split())
    s = 'nai nai ge xiong cao'
    hash3 = simhash(s.split())
    print(hash1.hamming_distance(hash2) , "   " , hash1.similarity(hash2))
    print(hash1.hamming_distance(hash3) , "   " , hash1.similarity(hash3))

 

Python 相关文章推荐
python中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
python中map()函数的使用方法示例
Sep 29 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python日志logging模块使用方法分析
May 23 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
Python实现把类当做字典来访问
Dec 16 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
python实现DNS正向查询、反向查询的例子
Apr 25 #Python
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 #Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 #Python
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 #Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 #Python
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 #Python
Python 时间操作例子和时间格式化参数小结
Apr 24 #Python
You might like
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Django的数据模型访问多对多键值的方法
2015/07/21 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
求职信模版
2013/11/30 职场文书
美容院营销方案
2014/03/05 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
2014年电厂工作总结
2014/12/04 职场文书
美术教师求职信范文
2015/03/20 职场文书
工作年限证明范本
2015/06/15 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript