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 25 Python
Python中优化NumPy包使用性能的教程
Apr 23 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
django允许外部访问的实例讲解
May 14 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
pandas 快速处理 date_time 日期格式方法
Nov 12 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
使用python绘制二维图形示例
Nov 22 Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
Protoss魔法科技
2020/03/14 星际争霸
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
javascript来定义类的规范小结
2010/11/19 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中使用SAX解析xml实例
2014/11/21 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2015年科室工作总结
2015/04/10 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript