局部敏感哈希(LSH)之simhash和minhash

局部敏感哈希(LSH)之simhash和minhash

minhash

1. 把文档A分词形成分词向量L
2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合
3. 分别得到K个集合中的最小hash,然后组成一个长度为K的hash集合
4. 最后用Jaccard index求出两篇文档的相似度

simhash

1. 把文档A分词形成分词向量L,L中的每一个元素都包涵一个分词C以及一个分词的权重W
2. 对L中的每一个元素的分词C进行hash,得到C1,然后组成一个新的向量L1
3. 初始化一个长度大于C1长度的向量V,所有元素初始化为0
4. 分别判断L1中的每一个元素C1的第i位,如果C1i是1,那么Vi加上w,否则Vi减去w
5. 最后判断V中的每一项,如果第i项大于0,那么第i项变成1,否则变成0
6. 两篇文档a,b分别得到aV,bV
6. 最后求出aV和bV的海明距离,一般距离不大于3的情况下说明两篇文档是相似的

SimHash的工作原理

SimHash算法工作流程图:
<span>局部敏感哈希(LSH)之simhash和minhash</span>
<span>局部敏感哈希(LSH)之simhash和minhash</span>
 
  • 1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

  • 2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。

  • 3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。

  • 4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

  • 5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

 

整个过程图为:

<span>局部敏感哈希(LSH)之simhash和minhash</span>

 

一个例子如下:
<span>局部敏感哈希(LSH)之simhash和minhash</span>
 
<span>局部敏感哈希(LSH)之simhash和minhash</span>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119557.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Eclipse+ADT+Android SDK 搭建安卓开发环境「建议收藏」

    Eclipse+ADT+Android SDK 搭建安卓开发环境「建议收藏」Eclipse+ADT+AndroidSDK搭建安卓开发环境要求必备知识windows7基本操作。运行环境windows7(64位); eclipse-jee-luna-

    2022年7月3日
    36
  • lua字符串截取_lua删除数组元素

    lua字符串截取_lua删除数组元素localstr=”helloworld!”string.sub(str,1,string.len(str)-1)–hellowordstring.sub(str,起始位置,整个字符串的长度)–获取指定位置长度的字符串string.len(目标字符串)–获取字符串的长度

    2022年10月6日
    2
  • 茂名石化乙烯项目_茂名市天源石化有限公司

    茂名石化乙烯项目_茂名市天源石化有限公司“现在看起来很好,但过程真的不容易。”一直分管茂南石化工业园的区政协副主席、区政府党组成员卢飞说,工业园的建成,得益于茂石化炼油厂卫生防护距离搬迁安置项目,而卫生防护安置搬迁拆迁的工作过程非常艰辛。栽下梧桐树,引来金凤凰。随着园区的加快建设和基础设施的日臻完善,一个个好项目、大项目先后落户园区。园区分管领导抓住优势,紧紧围绕主导产业和产业发展方向,进一步明确招商思路,不断扩充优质产业项目。“其中,总投资18亿元的茂名天源石化丙烯项目落地园区,我们花了很多功夫才争取到这个项目。”卢飞介绍道..

    2022年10月15日
    3
  • redis和zk实现分布式锁有什么区别_redis分布式锁和zk分布式锁区别

    redis和zk实现分布式锁有什么区别_redis分布式锁和zk分布式锁区别前言本文介绍下分布式锁的一个使用场景分享本文的缘由是因为今天在写代码时需要处理一个原子性问题,场景是:业务功能需要先查询数据,再根据数据判断是否要更新数据,在这个查询+更新的过程必然会存在高并发下的原子性问题那么如何解决这个问题呢,那么就要说到我们的主角:分布式锁了分布式锁介绍分布式锁:即在多集群多节点环境下确保只有一个线程可以拿到锁,防止并发出现的问题,类似于synchronized,只不过synchronized不能处理多节点的问题解决上述问题的一种解决方式就是使用分布式锁,虽然性能会比较低

    2025年10月2日
    2
  • pinetwork节点教程_搭建ss教程

    pinetwork节点教程_搭建ss教程文章目录1、简介2、Pi节点安装2.1、操作系统2.2、路由器设置2.3、Docker安装2.4、PiNode安装1、简介    2020年3月31日(太平洋时间)Node软件的测试版上线此,版本号0.015。写下这篇文章时,版本号已更新至0.3.8。Pi节点的安装设置过程稍复杂,在此做个总结。2、Pi节点安装2.1、操作系统2.2、路由器设置2.3、Docker安装2.4、PiNode安装…

    2022年10月8日
    2
  • 究竟开发人员须要掌握多少门语言?「建议收藏」

    究竟开发人员须要掌握多少门语言?

    2022年2月1日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号