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代码制作configure文件示例
Jul 28 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Python分支结构(switch)操作简介
Jan 17 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
python基于socket函数实现端口扫描
May 28 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
手把手教你用Django执行原生SQL的方法
Feb 18 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之生成GIF动画的实现方法
2013/06/07 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
jquery 列表双向选择器之改进版
2013/08/09 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
python+opencv识别图片中的圆形
2020/03/25 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
贷款承诺书范文
2014/05/19 职场文书
运动会加油口号
2014/06/07 职场文书
写景作文评语集锦
2014/12/25 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
中秋节慰问信
2015/02/15 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
Java基于字符界面的简易收银台
2021/06/26 Java/Android
Golang解析JSON对象
2022/04/30 Golang