彭琪谈编程

扫描discuz里的垃圾帖

维护过discuz的人一定对各种垃圾广告深恶痛绝,虽然它自带了一个关键词屏蔽功能,但是这并不能有效地解决这个问题。

首先它是一种被动防御机制,没人刷你就不知道该屏蔽什么,而你又不可能时时刻刻守着,所以通常等你发现时已经晚了,对用户已产生了不好的影响,甚至有可能收到有关部门的警告…

其次垃圾商会用各种方式来绕过你的关键词审查,比如:

  • 用空格或全角空格等符号把关键词隔开
  • 用繁体字
  • 用unicode,如小姐浏览器会把它显示为小姐

这是一个道高一尺魔高一丈的循环游戏,你永远处于被动,而且当他们用很多特殊字符来分隔关键词时,你基本上没有什么办法,正则也帮不了你。

过多的关键词还会对你的用户造成影响,比如“小姐”这个词,虽然很多黄色广告都包含,但是正常用户有时也会用到它,因为这个而影响用户发帖,是很不友好的体验。更不要说过多的关键词还会拖慢你论坛的发帖速度。

经过了一番研究后,我发现所有的垃圾贴都有一些共同的特征,为了吸引注意,它们通常都是在很短的时间里刷出来一大片,但是所有的标题都差不多,可能就是中间几个字换了下,例如这样

这样的标题应该都可以用某种计算字符串相似度的算法来做下评估,如果同时存在很多相似度很高的主题,那它们很有可能就是垃圾广告。抱着这个想法我做了下搜索,发现了一个计算编辑距离的算法,而且更棒的是PHP已经带了这个方法,不用自己来实现!有了这个算法,剩下的事就好办了。

因为PHP的这个方法不支持中文,所以得用这个版本。我对这个方法做了下小修改,让它直接返回相似度比例,参考

这个脚本还有一个好处就是能把纯灌水涨积分的帖子也屏蔽了,可谓一举两得。

有三个地方可以根据自己的情况做出调整

  • 一个是相似度,85%算是比较严格的要求,如果垃圾广告花样很多,可以适当降低这个标准
  • 对重复的数量也可以要求更低,至少两条重复就可以判定为垃圾广告,不过有可能误伤用户的重复发帖
  • 频率。如果你的站点比较繁忙,可以适当提到频率。目前这个脚本在我的服务器上跑没有任何负载,如果你的服务器也没什么压力的话,可以压缩间隔或者提高limit来提高处理速度

Comments