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实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
python实现下载文件的三种方法
Feb 09 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
Django开发的简易留言板案例详解
Dec 04 Python
python游戏地图最短路径求解
Jan 16 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
python文字转语音的实例代码分析
Nov 12 Python
python实现拼图小游戏
Feb 22 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
Python 可迭代对象 iterable的具体使用
Aug 07 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
一个简易需要注册的留言版程序
2006/10/09 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php查看网页源代码的方法
2015/03/13 PHP
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
详解python单例模式与metaclass
2016/01/15 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
区三好学生主要事迹
2014/01/30 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
人事局接收函
2015/01/30 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
Nginx内网单机反向代理的实现
2021/11/07 Servers