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中的Numeric包和Numarray包使用教程
Apr 13 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
利用python写个下载teahour音频的小脚本
May 08 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python 字典操作提取key,value的方法
Jun 26 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
Python读写操作csv和excle文件代码实例
Mar 16 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 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
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
js变量提升深入理解
2016/09/16 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
Python translator使用实例
2008/09/06 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python自动连接ssh的方法
2015/03/07 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
详解Python sys.argv使用方法
2019/05/10 Python
python地震数据可视化详解
2019/06/18 Python
Pyqt5自适应布局实例
2019/12/13 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
项目开发计划书
2014/01/09 职场文书
五一劳动节活动记录
2014/03/23 职场文书
合作意向书模板
2014/03/31 职场文书
雨花台导游词
2015/02/06 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
停电通知范文
2015/04/16 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS