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入门篇之数字
Oct 20 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
Python复数属性和方法运算操作示例
Jul 21 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
pytorch中图像的数据格式实例
Feb 11 Python
Python 日期与时间转换的方法
Aug 01 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
Python 批量下载阴阳师网站壁纸
May 19 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 数组的一个悲剧?
2011/05/11 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
jQuery1.6 使用方法二
2011/11/23 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
js实现简易计算器功能
2019/10/18 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python多线程之事件Event的使用详解
2018/04/27 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python使用knn实现特征向量分类
2018/12/26 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
如何通过python实现全排列
2020/02/11 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
顶碗少年教学反思
2014/02/21 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server