局部敏感哈希(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算法工做流程图:
 
  • 一、分词,把须要判断文本分词造成这个文章的特征单词。最后造成去掉噪音词的单词序列并为每一个词加上权重,咱们假设权重分为5个级别(1~5)。好比:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是表明单词在整个句子里重要程度,数字越大越重要。算法

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

  • 三、加权,经过 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”,“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”。这里做为示例只算了两个单词的,真实计算须要把全部单词的序列串累加。code

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

 

整个过程图为:文档

 

一个例子以下:
 
相关文章
相关标签/搜索