短文本合并重复(去重)的简单有效做法
不大合适的SimHash
前些日子看了Charikar SimHash的介绍《Simhash算法原理和网页查重应用》,核心思想是用一个f位的hash值来表示文件的特征值,然后使用hash值之间的Hamming距离来衡量相似性。输入的是一个文档的特征集合,输出的是f位的二进制数S。
于是用来测试短文本(长度在8个中文字符~45个中文字符之间)相似性,做法很简单:
1.将短文本做分词,得到分词数组,数组每一个元素都转为hash字符串。
2.利用simhash算法来计算分词数组的simhash值。
3.利用simhash的similarity算法计算simhash1和simhash2的相似度。
这种做法的缺点是:
1.误判率高。
如下图所示,
SimHash可能不适合做这种短标题的重复度判断,虽然SimHash在空间消耗和计算复杂性方面相对Shingle和BloomFilter占优。
介绍一下2009年2月份我们做Twitter锐推榜时是如何做的
Twitter中对于热门事件的中文表达多种多样,转发时又往往会追加很多格式的各种内容,造成了相似内容的短文本的信息指纹不同,在这种情况下,段国成认为需要先为短文本抽取标签,再通过标签来计算相似度进行锐推合并。
1.短文本抽取标签的方法:
1.1. 剔除所有英文、数字、标点字符;
1.2. 剔除所有Twitter用户名;
1.3.分词,并标注词性,仅保留实体词性,如名词、动词;(技巧一!)
1.4.过滤掉常用实体词(常用实体词是通过对历史锐推训练而得,即建立自己的停止词表);(技巧二!)
1.5.计算保留实体词的词频,并以此为权重,选择权重大的词语作为标签;
1.6.标签数组长度大于一个阈值(如3),才认为是有信息量的锐推,否则忽略。(技巧三!)
2.合并相似短文本(即我们所说的Retweet)方法:
2.1.以每个标签作为Shingle特征(即核心思想还是“一个数据段分成若干Shingle,每个Shingle计算出一个hash值,然后组成一个以hash值为元素的数组,以此作为特征值或叫信息指纹来表示这个数据段”);
2.2.以网页去重领域中改进的Shingle方法来进行计算近期内(目的:缩小计算范围)锐推的相似度(Shingle算法的核心思想是将文本相似性问题转换为集合的相似性问题,改进的Shingle方法的时间复杂度近似于线性);
2.3.对相似程度大于一定阈值的、不同信息指纹的热门锐推,再次扫描出来,将它们的热度进行合并。
以上结果就构成了 @rtmeme 的运算机制。它特别适合处理十几个、几十个汉字的短文本合并重复,适用于微博领域。
也看到有人这么做:先Shingle再SimHash,不知道是否适合海量短文本合并重复,回头试试看。
注:本文出自http://www.cnblogs.com/zhengyun_ustc/archive/2012/06/12/sim.html