local sensitive hash 局部非敏感哈希
在对海量样本进行大规模相似度聚类运算的时候,需要首要考虑的问题是计算耗时。为此我们需要一种应对于海量数据场景的去重方案,可以采取一种叫做 local sensitive hash 局部敏感哈希 的算法,该算法模型可以把文档降维到hash数字,数字两两计算运算量要小很多(google对于网页去重使用的是simhash,他们每天需要处理的文档在亿级别)。simhash是由 Charikar 在2002年提出来的,参考 《Similarity estimation techniques from rounding algorithms》
0x1: 基本概念
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"变成01串,形成我们最终的simhash签名。 如果每一位大于0 记为1,小于0 记为0。最后算出结果为:"1 0 1 0 1 1"
整个过程图为
Relevant Link:
http://blog.jobbole.com/46839/http://jacoxu.com/?p=366https://github.com/yanyiwu/simhashhttps://github.com/leonsim/simhashhttps://github.com/zhujun1980/simhashhttps://github.com/Sin30/simhash-demo/blob/master/simhash.phphttps://github.com/tgalopin/SimHashPhphttp://www.cs.princeton.edu/courses/archive/spr04/cos598B/bib/CharikarEstim.pdf
网友评论