最小哈希和局部性哈希理论

来源:互联网 发布:leslie矩阵预测人口 编辑:程序博客网 时间:2024/06/06 15:45

最近在看《大数据-互联网大规模数据挖掘与分布式处理》这本书,觉得里面有些内容还是值得学习的,对于超大规模的文档集合,文档长度很长,文档的个数也很多,这么个情况下,如果寻找相似性比较高的文档对,会有一些问题,比如内存不够用,时间复杂度过大。

首先需要说明两点:

1相似度衡量的一个方法:采用Jaccard相似度,它的数学表达式为:A与B的相似度为A与B的交集除以A与B的并集。

2 文本的特征:采用k-shingle算法,它的具体做法就是选择一个k,把文档中所有长度为k的串作为该文档的特征,即文档特征是长度为k的串的集合。

这本书中提供的2种优化办法:

1对文档长度过长的问题:采用最小哈希的方法,将一个文档的特征由原来的k-shingle法产生的维数降低至哈希函数的个数维。

具体来说,首先需要一个矩阵来表示文档集合,行是词,列是文档,易知这是一个01矩阵M,mij=1表示第j篇文档里出现了第i个词(也就是前面的串)。然后建n个哈希函数,hash(行号)=新的行号,尽可能的不要将同一个行号hash到一起,因此对于任意一个哈希函数处理后,相当于仅仅对矩阵的行做了重新排列,每一次hash行号后,每篇文章的特征用一个值来表示,这个值等于行号变化后从上往下数出现第一个1的行号,也就是最小哈希值。这样n次hash后,每一片文档就产生了n维的特征,最后以此特征表示文档的特征进行相似度计算即可。

这种做法需要一个理论支撑,那就是两个集合经随机排列转换之后得到的两个最小哈希值相等的概率等于这两个集合jaccard相似度。

给个例子:

此例给了2个hash函数,所以最后每一篇文章的特征是2维,每个维度计算结果如下:


第一个集合,H1=1是根据第三列的顺利(这里的顺序从0开始)去第一列找,第三列告诉我们0是最后一行,发现第一列最后一行是0,接着找,1是第一行,第一列的第一行是1,所以找到了结果 H1=1,其他类似。

2 对于文档数目的优化:

可以看到刚才的做法如果文档个数很多,比如几百万个,那么两两进行复杂度计算时间复杂度非常高,对此提出了局部性哈希的做法。

局部性哈希的大概思想是想将每个文档通过哈希放到一个桶里,尽可能的保证桶内的文档对相似度比较高,而桶外的比较低,这样的情况下,我们只需要计算桶内的文档对的相似度,而不必关注位于不同桶的文档对,这样显然能大大减少计算时间。

基于做小哈希的局部哈希法用上面的方法,还需要将哈希后生成的特征矩阵进行分块,每r行为一块,总共分成b块,则b*r=n,n为最小哈希函数的个数。而对于每一块,每个文档都有r维的特征,之后将文档进行哈希,也是尽量保证只有相同特征的文档才会哈希到同一个桶内,然后计算同一桶内的文档相似度,这样的步骤每一块都要执行一次,个人觉得目的第一是为了增加随机性,第二是如果不分块,将一个维度很高的向量进行哈希不是很好处理。



0 0
原创粉丝点击