之前流量检测项目针对恶意请求文本做过聚类 , 其中用到计算文本的相识度,文本相似度曾经尝试过用simhash,虽然现在看来在项目中效果并不理想, 但是在文本去重上最用还是很不错的, 以下是对simhash的梳理
首先google出品, 必属精品, 简单高效
1. simhash与传统hash的区别
simhash名字就说明了simhash的用途, 相似的文本具有相识的hash值 .
而普通的hash 只做微小改动hash就相差甚远
以下为百*的例子:(如有看到说侵权的, 百*负责)
两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。
通过simhash计算结果为:
1000010010101101111111100000101011010001001111100001001011001011
1000010010101101011111100000101011010001001111100001101010001011
通过传统hash计算为:
0001000001100110100111011011110
1010010001111111110010110011101
2. simhash思想 (简单,易懂 )
a.分词 (分词算法)
b.hash (每个词算hash值)
c.加权 (hash*权重)
4.合并(doc中每个词hash累加)
5.降维(大于0的维度为1, 小于0的维度为0)
结果比较
TODO 之前效果 有时间会再实现一边
对比其他算法
『百度的去重算法』
百度的去重算法最简单,就是直接找出此文章的最长的n句话,做一遍hash签名。n一般取3。 工程实现巨简单,据说准确率和召回率都能到达80%以上。
『shingle算法』
shingle原理略复杂,不细说。 shingle算法我认为过于学院派,对于工程实现不够友好,速度太慢,基本上无法处理海量数据。