天天看点

谈热文榜的自动去重

泛digg式的热文系统需要有重复内容检测机制。

通常的重复内容是同一个站点下的同一个story,只不过链接不同罢了(这在国内论坛很常见,帖子的链接有好多种变换,实际上指向的都是同一个帖子)。此时用文本相似性计算(document similarity algorithm)即可解决。

当你提交给digg一个链接时,它就已经开始了重复检测,在你填写标题和描述之前。如果它怀疑你可能提交了一个重复文章,那么它会立刻提示你,如下所示:

谈热文榜的自动去重

可见,人主观上认为的内容重复,和机器模拟判定(复杂的算法也可以很好逼近,比如论文抄袭检测系统,但对于digg来说,肯定要求算得快且准),还是有些距离的。

国内总是有特殊情况。

比如转贴满天飞。而且多半是转载到大站或名博的文章被推荐被分享的几率远远大于原创站点。

比如国人架设的wordpress的rss feed,总是先输出一个中文编码(就是把博文标题urlencode了)的链接,然后同一篇文章隔一会儿又输出一个英文链接。于是经常两个链接都有人推荐和分享。

比如新浪博客,很多人(包括名博们)经常反复编辑同一篇文章,导致编辑器把同一篇文章保存为n多份,导致同一篇博文一发就是三五篇,链接还都不同,崩溃啊。

比如cnbeta,转贴第三方的文章后,输出的rss是摘要输出。此时,大家往往分享的是它。这带来两个问题:一,摘要很短,不足以与原文判定是否重复;二,cnbeta投递者往往会修改原文标题,要么加几个字,要么加助词或符号(估计是seo的需要)。

比如solidot,以点评夹带原文摘录的方式发布。也是同样的问题:文字内容很短,还加了编辑的文字,更加影响相似性计算;标题往往与原文不同。

比如一些名博转载别人文章时,总会在最前面加上自己的点评,这样就略微影响文本相似性计算。

后来确实有很多人反映这个问题,同一篇文章很有可能重复上榜三、四次,比如谷奥发布一次,cnbeta转载一次,solidot点评一次,keso’s view一次,煎蛋转载一次等等。

现在的重复内容检测逻辑是:

首先对文章内容较长的,是基于shingle的重复检测办法;

其次对文章很短的,比如cnbeta摘要输出的rss内容,比如solidot,比如南方报业旗下的rss内容,先提取标签,然后计算文章的标签相似度。

这两种办法算起来很快,但未必总能检测出来重复,继续积累吧。

继续阅读