之前有介绍过大规模去重算法的设计,可惜没有办法付诸实现,主要是因为没有相应的应用场景,还是停留在纸上谈兵的阶段!这里简单的介绍下新闻去重算法的实现,客户端在基于yahoo shingle算法的基础上进行了封装,便于采用服务的方式来进行调用,这样比较容易进行复用和提高扩展性,利用thrift来进行跨语言的通信,客户端采用Java实现,原有的设计是服务端既提供计算的接口,即根据文本计算它的shingles,又可以在后端提供去重的服务,即根据文档内容查看这个文档和哪些文档内容重复。客户端可以只调用计算shingle的接口在客户端做去重的服务,thrift的接口定义如下:
在原有代码的基础上,增加了两个函数,分别用来以字符串和长整形数组来返回文档的shingles,代码如下:
客户端调用的代码如下所示:
以上是去重的主要代码,应该都可以直接运行的,代码放在news-duplicated上面,通过将文章计算成n个shingles, 如果有一个shingle重复,这篇文章与其它文章重复的概率就非常大了,所以利用以上代码还是很方便的搭建一个去重系统的,前文提到该算法计算速度比较低,但是可以在计算上提高并发效率,剩下的就是查询的问题了,这个应该不是瓶颈,还有一个问题就是,太短的正文不适合采用这种算法,可以考虑用md5来计算hash。
原文:http://blog.csdn.net/hotallen/article/details/19933553