要识别论坛中被大量转载的同一篇文章,初看起来不是一个很难的技术问题,只要生成所有文章的信息指纹,再将相同指纹分组就可以了。至于产生信息指纹的方式,最简单的是用MD5或者SHA等单向Hash函数,如果为了减少存储以及提高性能,同时可以容许一定误差,可以再利用BloomFilter。
但是结合实际情况看一下,就能发现产生这种类别文章的指纹不能简单的用MD5产生,因为当一篇文章被大量复制转载的时候,未必是一字不差的。特别是一些发帖软件为了规避论坛的检查,会有意的将内容进行变形,插入空格,空白字符,或者进行个别词语的替换等等;而只要有哪怕一个字的区别,都会产生全然不同的MD5结果。
还有一个思路是文本向量的匹配,即将文本先分词再向量化之后比较他们在向量空间中的距离,设定一个阈值,距离小于该阈值的文本视为相同。这么做最大的好处是具有很好的抗干扰性,如果阈值调整合理,那么结果会有比较高的招回率。但是缺点也显而易见,即计算量太大,而且事实上把寻找大规模转载贴的问题又扩展成了聚类(Clustering)问题。
我们后来采用的方式是结合了两种方案,即不将全文作为文本向量,而是在文中选取我们认为重要的词汇(重要性可以根据该行业语料库的TF/IDF词频信息判断),保留相应的语序,再生成MD5。这里的基本假设是为了传达相同的信息,大规模转载贴的变形只会发生在相对不重要的词汇上(包含空格,标点等),由于我们的算法会忽略这些元素,只关心核心词汇,因此能够在保证准确度的基础上获得一定抗干扰性。
从部分分析结果看,算法的效果还是不错的,在我们随机选取的近600万的帖子中,查找到了近3万5千条有转载的帖子,而这4万条帖子包含了大约10000条独立的内容;其中一则内容为"所有现车 全部降价出手 .... 交易成功可送车出湖南或代办安全托运”的卖车贴,除了车型,价格,时间略有变化外,在我们的样本集里被转载了近1000次。
当我们忽略转载量小于10的帖子后,剩余的独立内容有370个,而它们的转载总量达到了7878次。我们对转载数取了对数,并按照转载数对内容排名,绘出了下列图表
from:http://blog.csdn.net/CICTech/archive/2009/02/12/3880945.aspx