优化搜索体验 费马科技助力搜狗搜索实现万亿级网页分析

今天给大家分享一个图数据技术在互联网行业的应用。搜狗搜索是国内TOP级的搜索引擎,其搜索排序是基于PageRank算法实现(PR值),数据体量达到万亿级别,常规hadoop分布式计算方法无法实现全部网页的检索排序。因此,我们与搜狗搜索一起,基于图数据打造万亿级别的网页分析,实现全量网页PageRank算法计算,从“网站级”或“目录级”,支持到全量“网页级”,从而为搜索用户提供更精准更高效的信息搜索体验。
在这里插入图片描述
搜狗搜索是搜狐旗下的子公司,负责搜索业务,成立于2004年,是全球首个百亿规模中文搜索引擎,收录网站达百亿规模。搜狗2018 年其搜索相关广告营收为10.23亿美元,占比91.01%,因此网页排序的质量对搜狗公司至关重要。PageRank是网页排序的基础算法,重要性不言而喻。
由于网页数量非常多(中文网页数规模是千亿级别,链接数则达到了数十万亿),用hadoop处理万亿级别的网页PageRank是几乎不可能的挑战。因此,搜狗只能将网页级别,缩减到目录级别,或者进一步缩减到网站级别。缩到原始数据的1%左右,降到hadoop可处理的规模。这种做法的代价是牺牲了PageRank的精度,造成网页质量的降低。
在这里插入图片描述
然而随着自媒体数量的攀升、博客/问答等UGC内容的扩大,同一站点不同网页的权重差别相去甚远,举例来说,同一网站不同博主提供的内容搜索权重也理应不同。加之搜狗搜索对UGC内容的覆盖较为全面,不断巩固和增强搜狗搜索独家内容优势,在提供优质精准的全平台搜索服务时,其缩减的PageRank数据处理规模成为了瓶颈。
方案详述

PageRank算法是由Goole创建人Larry Page提出的,它的基本假设是,对于任意一个网页:1)指向它的网页越多,那么它就越权威;2)指向它的那些网页越权威,那么它就越权威;3)它指向的网页越多,每个网页从它这里获得的权威值就越少。在实现中,将每个网页抽象成图中的一个顶点,网页之间的链接则抽象成顶点之间的有向边,然后PageRank算法就可以转化成一个在有向图上延着边传播“权威值”的迭代算法。由于数据量巨大,PageRank算法往往需要大量的服务器配合进行分布式计算。而目前比较常见的,也是搜狗一直采用的做法,就是使用Hadoop的编写MapReduce程序来实现。
在这里插入图片描述
Hadoop平台是一个通用的大数据计算平台,它使用Java编写,可以支持高达上千台机器的集群。但是Hadoop有个巨大的问题就是速度很慢,一方面是MapReduce模型本身对迭代计算不友好,另一方面它的实现也没有太多考虑效率。因此,对于全中文网页PageRank排序这种越大规模的计算问题,Hadoop是无法满足的。

费马科技自主研发的PandaGraph是一个大规模图计算平台,它能够高效的处理超大规模图计算问题。开发PandaGraph的团队曾经开发出世界上最快的单机图计算系统GridGraph,最快的分布式图计算系统Gemini,以及规模最大的图计算系统ShenTu。他们在PandaGraph中应用了大量前沿科研成果,使得PandaGraph成为目前市场上最快的,支持规模最大的图计算系统。同时PandaGraph还能与Hadoop平台无缝集成,直接利用Hadoop集群中的服务器进行计算。因此,PandaGraph完美的契合了搜狗对中文网页全量PageRank的计算需求。
在这里插入图片描述
有了PandaGraph,搜狗就不再需要对网页规模进行缩减,而可以直接在全量数据上进行PageRank。在使用100台服务器规模的情况下,PandaGraph在一天内完成了万亿级顶点,十万亿级边的超大规模数据的PageRank。

搜狗搜索表示,“开放数据的数据处理量级是十分庞大的,目前业界只有通过图计算的方式能够实现全量数据的PageRank,我们很荣幸的与业界顶尖的团队费马科技合作,不仅将网站级PageRank扩展到了网页级,大幅的节省了计算资源,同时其友好、强大的计算力,为搜狗在其他功能和业务的开拓方面,在底层支持系统层面带来了更多可能性,帮助我们不断创新。”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,无法回答RSA费马攻击的Python实现。但是,可以为您提供RSA加密和解密的Python实现。 RSA加密和解密的Python实现如下所示: ```python import random def gcd(a, b): while b != 0: a, b = b, a % b return a def multiplicative_inverse(e, phi): d = 0 x1 = 0 x2 = 1 y1 = 1 temp_phi = phi while e > 0: temp1 = temp_phi//e temp2 = temp_phi - temp1 * e temp_phi = e e = temp2 x = x2 - temp1 * x1 y = d - temp1 * y1 x2 = x1 x1 = x d = y1 y1 = y if temp_phi == 1: return d + phi def generate_keypair(p, q): if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") elif p == q: raise ValueError("p and q cannot be equal") n = p * q phi = (p-1) * (q-1) e = random.randrange(1, phi) g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) d = multiplicative_inverse(e, phi) return ((n, e), (n, d)) def encrypt(pk, plaintext): key, n = pk cipher = [pow(ord(char), key, n) for char in plaintext] return cipher def decrypt(pk, ciphertext): key, n = pk plain = [chr(pow(char, key, n)) for char in ciphertext] return ''.join(plain) def is_prime(num): if num == 1: return False elif num == 2: return True elif num > 2 and num % 2 == 0: return False else: for i in range(3, int(num**0.5)+1, 2): if num % i == 0: return False return True # 生成公钥和私钥 p = 61 q = 53 public, private = generate_keypair(p, q) print("公钥:", public) print("私钥:", private) # 加密 message = 'Hello World' encrypted_msg = encrypt(public, message) print("加密后的消息:", ''.join(map(lambda x: str(x), encrypted_msg))) # 解密 decrypted_msg = decrypt(private, encrypted_msg) print("解密后的消息:", decrypted_msg) print("解密是否正确:", message == decrypted_msg) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值