文本近似hash
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本近似hash相关的知识,希望对你有一定的参考价值。
参考技术A 主要介绍Min Hashing(用于降维)和Locality Sensitive Hashing(简称LSH,局部敏感哈希)(用于查找)Jaccard相似度是用来描述两个集合间的相似度的,其计算方法如下(假设有两个集合A,B):
假如我们把一整篇文章看成一个长的字符串,那么k-shingle就是这篇文档中长度为k的任意字符子串。所以,一篇文章就是很多个不同的k-shingle的集合。
尽管用k-shingle的方式来表示每篇文章,然后再通过判断每篇文章中shingle集合的相同元素的数量,就可以得出文章的相似度;但是,一篇文章得到的shingle集合的元素个数是很多的。假定k=4,那么每个shingle中就会有4个字符,存在内存中就至少需要4个字节;那么要以这种方式存下一篇文章的所有shingle,需要的内存空间大概是原文档大小的4倍(假设原文档大小为100K,那么存下这篇文档的所有shingle则需要400K)内存开销极大。
假设现在有4个集合,分别为S1,S2,S3,S4;其中,S1=a,d, S2=c, S3=b,d,e, S4=a,c,d,所以全集U=a,b,c,d,e
构建集合的特征矩阵是为了计算集合的最小哈希。
为了计算最小哈希,首先对特征矩阵的行进行打乱(也即随机调换行与行之间的位置),这个打乱是随机的。然后某一列的 最小哈希值 就等于打乱后的这一列第一个值为1的行所在的行号,行号从0开始。
例如,定义一个最小哈希函数h,然后对上面的特征矩阵进行行打乱,原来第一列的顺序为abcde,打乱后为beadc,则新的特征矩阵为:
对于列S1,从这一列的第一行往下走,直到遇到第一个1,所在的行号则为这一列的最小哈希值。所以这4列的最小哈希值依次为h(S1) = 2, h(S2) = 4, h(S3) = 0, h(S4) = 2
在经过行打乱后的两个集合计算得到的最小哈希值相等的概率等于这两个集合的Jaccard相似度。
当然,打乱用permutation太耗时,一般都会用近似的方法生成最小签名。
随机生成n个hash函数,比如 h1(x)=(x+1) mod 5 , h2(x) = (3*x+1) mod 5 ,在spark中是基于 ((1 + index) * a + b) % HASH_PRIME) ,a和b随机生成,HASH_PRIME是一个非常大的奇素数。
具体计算过程参看: 链接
最后得出一个以hash函数值替代集合的矩阵实现了数据压缩。
通过上面的方法处理过后,一篇文档可以用一个很小的签名矩阵来表示,节省下很多内存空间;但是,如果有很多篇文档,那么如果要找出相似度很高的文档,其中一种办法就是先计算出所有文档的签名矩阵,然后依次两两比较签名矩阵的相似度;需要比较 次数。那么我们可不可以只比较那些相似度可能会很高的文档,而直接忽略过那些相似度很低的文档。
求相应的平面参数也有相较随机生成更好的方法,比如PCAH(PCA Hash)通过主成分分析方法学习到转置矩阵w
20160907-Flann
layout | title | categories | tags | date | description | ||
---|---|---|---|---|---|---|---|
post | 近邻查询近似算法库FLANN |
|
| 2016-09-07 02:25:24 -0700 | 近似近邻查询,作为大数据搜索方面的算法层出不穷,其中有基于树和基于hash的最为多见。 |
引言
近似近邻算法在大型应用中是解决搜索的关键技术。而近似近邻算法的研究中,一部分是基于树结构实现的,一部分是基于hash算法。今FLANN是一个开源库,opencv中已经集成了该module.
红黑树
https://blog.csdn.net/weewqrer/article/details/51866488
用途
红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。对于查找、插入、删除、最大、最小等动态操作的时间复杂度为O(lgn).常见的用途有以下几种:
- STL(标准模板库)中在set map是基于红黑树实现的。
- Java中在TreeMap使用的也是红黑树。
- epoll在内核中的实现,用红黑树管理事件块。
- linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块
红黑树 VS AVL树
常见的平衡树有红黑树和AVL平衡树,为什么STL和linux都使用红黑树作为平衡树的实现?大概有以下几个原因:
从实现细节上来讲,如果插入一个结点引起了树的不平衡,AVL树和红黑树都最多需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度
从两种平衡树对平衡的要求来讲,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。
总体来说,RB-tree的统计性能是高于AVL的
FLANN概述
首先阐述了近似结果查询的重要性,通过实验结果分析了最有效的近似nn算法中,随机KD森林是最有效的,另外提出了一个新的方法:优先查找k-means树,尤其是针对视觉任务中常用的二进制特征,提出了多层聚类树。为了应用于大数据环境下,还有分布式环境下nn查找框架。
相关名词定义
- KNN(K-nearest neighbor search):说白了,就是从数据集合了找K个最接近的
- RNN(radius nearest neighbor search):就是返回一定半径范围内的所有数据。当然这个半径有很多不同的定义。
参考文献
以上是关于文本近似hash的主要内容,如果未能解决你的问题,请参考以下文章