本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
最近项目有用到Sim_hash,做个简单记录。
Sim_hash是Google用来处理大量文本去重的算法,属于局部敏感哈希(Locality Sensitive Hashing,LSH),LSH哈希能够使两篇只有小部分改动的文章编码后哈希值具有相似性,既可用于去重,也可用于计算相似度。对于只有小部分改动的两篇文章,在计算他们之间的相似度时,如果采用md5,两篇文章的md5编码值差异会非常大。但使用局部敏感哈希可以使相似的文章哈希编码后聚集在一起,删除符合阈值条件的文章,达到去重的效果。
一、算法流程
1)分词:对文本进行去停用词、分词,提取n个关键词和关键词的tf-idf权重来表征文章。如下图分词及权重。
2)关键词哈希编码:每个关键词通过hash函数生成固定位数二进制哈希。
3)权重编码:二进制编码中0调整为-1变为权重向量,与权重相乘。
4)权重编码叠加:将所有权重编码纵向求和,得到最终的文章权重。
5)二值化:按正数为1负数为0的规则将文章权重二值化。
6)汉明距离相似度:排除汉明距离小于阈值的文章,一般设置为3。汉明距离计算速度快,思路简单,原理是计算两个二值化编码相同位置处的不同值的个数。
二、Sim_hash整体流程
测试效果
需求:来了一个相似文章推荐需求,需要推荐出与文章内容相似的数据,但又不能完全相似。利用目前库中已有的POI标签和POI权重数据,结合simhash算法,计算出每个文章poi_sim_hash,计算距离
数据:线上拉取10W文章数据
测试结果:下图为随机抽样的测试结果(第一条为查询数据),基本符合预期效果。前期还可以使用类目和发布时间进行前置过滤,减少数据量。