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常用的日期时间处理方法示例
Feb 08 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
Zookeeper接口kazoo实例解析
Jan 22 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
Jun 28 Python
python按比例随机切分数据的实现
Jul 11 Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 Python
浅析NumPy 切片和索引
Sep 02 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
python爬虫中抓取指数的实例讲解
Dec 01 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
收音机的保养
2021/03/01 无线电
MySQL连接数超过限制的解决方法
2011/07/17 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
input的focus方法使用
2010/03/13 Javascript
javascript数组去掉重复
2011/05/12 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
Python中常用信号signal类型实例
2018/01/25 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
python实现批量图片格式转换
2020/06/16 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python 同时读取多个文件的例子
2019/07/16 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
搞笑获奖感言
2014/01/30 职场文书
中专自我鉴定
2014/02/05 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
保研专家推荐信范文
2015/03/25 职场文书
普通员工辞职信范文
2015/05/12 职场文书
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电