『IR 信息检索入门必看』#9 网页排序(简明)

访问博客查看 本文 最新内容,排版更美观ヾ(•ω•`)o 如有错误欢迎指出~

IR 信息检索系列笔记:

当我们在一个小的文档库中查询时,即使 query 很模糊,我们只要返回所有相关文档即可,甚至不需要猜测用户的查询需求。

但如果在一个大的文档集中查询时(比如谷歌),往往可以返回大量的相关文档。如果基于相关度的 ranking,往往无法区分哪些文档该呈现在最前面,甚至可能时一些低质量的网页对于某些词的词频很高,从而排在了前面。

此时我们就不能只聚焦与「相关度」,PageRank 算法通过计算一个页面的「重要度」,从而判别网页质量,得到排序。

基本思想

如何衡量「重要度」?用点击率、权威性?然而,这些数据都是爬虫无法爬取到的,同时也难以正确衡量。

科学家们从 Bibliometrics (文献计量学) 中借鉴了如下观点:

  • Bibliographic coupling (引文耦合):两篇文章具有相近的引用。
  • Co-citation (协同引用):两篇文章被大量其他文章同时引用。
  • Impact factor (影响因子):一个期刊中的文章的年平均被引次数,衡量了一个期刊的「重要度」。

例如,最权威的 SCI 往往只收录其认为重要的期刊,也只记录其中的期刊相互引用的次数。当一篇文章被 SCI 收录的文章引用时,通常也可以说明其有一定的影响力——即重要度的「传递」。

对于文献引用的可视化,我们通常称为 Citation Graph,通常是一个 Directed Acyclic Graph (有向无环图,DAG),因为较早的文章无法修改而引用后来的文章。

在网页中,我们可以 Hyperlinks (超链接) 来类比引用,从而形成一个 Hyperlink Graph,区别是这类图中可以有环路。

从而引出网页排序的基本假设:

  • The rank of a web page is higher if many pages link to it.
  • Links from highly ranked pages are given greater weight than links from less highly ranked pages.

PageRank Algorithm

基于上述假设,我们很容易可以得到当前页面的链入、链出数。但是,要怎么知道链入当前页面的前序页面,其重要度是多少呢?

随机游走模型 | Random Walk Model

在一个封闭的 Hyperlink Graph 中,随机选取一个页面作为访问起点,随机选取其链出的页面进行访问,再对下一个页面重复上述操作。

大量重复后,统计每个结点被访问的频率,用频率近似概率后,我们可以发现访问概率较大者通常有着较多的链入,或者其链入页面也有着较大的访问概率。用公式表示就是:
\mathrm{Pr}\left( P_i \right) =\mathrm{Pr}\left( P_i\mid P_1 \right) \mathrm{Pr}\left( P_1 \right) +\mathrm{Pr}\left( P_i\mid P_2 \right) \mathrm{Pr}\left( P_2 \right) +\cdots +\mathrm{Pr}\left( P_i\mid P_N \right) \mathrm{Pr}\left( P_N \right)
其中 \mathrm{Pr}\left( P_i\mid P_1 \right) 表示从编号为 1 的网页跳转到编号为 i 的网页的概率,其计算方式为:
\mathrm{Pr}\left( P_i\mid P_1 \right) =\begin{cases} 0\text{,如果}P_1\text{到}P_i\text{没有链入}\\ \frac{1}{m}\text{,}m\text{为}P_1\text{的链出数}\\ \end{cases}

矩阵表示 | Matrix Representation

w_i=\mathrm{Pr}\left( P_i \right),则 \boldsymbol{w}=\left[ \mathrm{Pr}\left( P_1 \right) ,\mathrm{Pr}\left( P_2 \right) ,\cdots ,\mathrm{Pr}\left( P_N \right) \right] ^T,再令 \boldsymbol{B}_i=\left[ \mathrm{Pr}\left( P_i\mid P_1 \right) ,\mathrm{Pr}\left( P_i\mid P_2 \right) ,\cdots ,\mathrm{Pr}\left( P_i\mid P_N \right) \right],则有:

w_{i}=B_i\cdot \boldsymbol{w}

特别地,当 i 取遍 1 到 N 的所有值后, 得到矩阵形式:
\boldsymbol{w}=B\cdot \boldsymbol{w}
其中 B 称作标准化链接矩阵,矩阵中的每个元素代表列号对应的 Page 链入行号对应的 Page 的概率,每列之和为 1。当一个页面没有链出时,这一列全为 0。

于是我们可以用迭代方法求解这个方程的稳定解 \boldsymbol{w}_k——即我们想求的访问概率向量,也就是重要度向量。只需要将 \boldsymbol{w}_0 设为全 1 向量(因为一开始随机访问到每个页面的概率都相同),不断代入即可。

阻尼迭代 | PageRank with Damping

然而,现在存在的问题是,上面的所有推导都是建立在理想状态下的,即假设所有网页组成的这个有向图是强连通的。

当 Hyperlink Graph 存在 link loops (循环陷阱),即存在一个小的子图,只有链入没有链出,所有随机游走的用户到了这几个网页后,就如同进了黑洞一般,一直在里面“打转”,出不来了。

这样就使得当游走次数趋于无穷时,最终陷阱中结点的访问次数远大于其他结点。这样会使得计算出的 \boldsymbol{w} 向量中,陷阱外的结点访问概率都为 0。

PageRank 算法最终采用了阻尼因子(damping factor)的修正,使得进入陷阱后仍有机会跳出循环。
\boldsymbol{w}_k=d\boldsymbol{w}_0+\left( 1-d \right) B\cdot \boldsymbol{w}_{k-1}
其中 \boldsymbol{w}_0 为全 1 向量,d 是实验确定的常数,通常取 0.15。

结合相关度 | Combined Method

有了重要度向量后,当有查询时,我们只需要先确定命中文档(至少有一个 term 与 query 相同的文档),再将其用重要度排序即可。

然而,这样做的缺点是,没有考虑到查询和文档的相关性——即,有可能一篇文档虽然有相同的 term,但主题却相去甚远。

于是,有人提出了结合 Term Weighting 和 PageRank 的方法,在确定命中文档后,利用传统的权重计算方法,计算出 query 和每个 doc 的相似度 s_j。再和重要度 p_j 线性加权算出排序指标:
c_j=\lambda s_j+\left( 1-\lambda \right) p_j
其中 \lambda 为实验确定的常数。

PageRank 算法缺点

  1. 忽略了查询,则忽略了 query 和 doc 主题相关性,导致结果的相关性降低。

  2. 没有过滤广告链接和功能链接(例如常见的分享链接)。这些链接通常没有什么实际价值,前者链接到广告页面,后者常常链接到某个社交网站首页。

  3. 对新网页不友好。因为即使是非常好的新页面也不会有很多链入,要成为一个高重要度的页面仍需要很长时间的推广。

主题敏感 PR | Topic-Sensitive PageRank

在实际的网络中,PageRank 算法还存在「主题漂移」问题,特别对于大量随意交互外链的站点,会导致搜索引擎返回主题无关结果。

同时,前面的讨论提到,PageRank 忽略了 query 的主题相关性,也导致了结果的相关性降低。同一查询词在不同语境下,语义上指向的可能是不同的主题,但 PageRank 无论如何都是返回「重要度」最高的页面。

理想情况下,应为每个用户的偏好维护一套专用的「主题重要度」向量,但面对海量用户这种方法显然不可行。所以搜索引擎一般会选择一种称为主题敏感的折中方案。

基本思想 | Basic Idea

基本假设:在 PageRank 的随机游走模型中,用户倾向于选择具有同一个主题的链出网页。

基于这个假设,可以预定义几个话题类别,例如体育、娱乐、科技等等,对于某个网页来说,对应某个主题类型都有相应的 PageRank 分值,然后想办法关联用户的话题倾向,根据用户的话题倾向排序结果。

矩阵形式 | Matrix Form

与原始的 PageRank 不同,新的算法对出度为 0 的网站加以处理以保证收敛性。引入了向量 \boldsymbol{d} 来指示某一个网页是否出度为 0,若为 0 则对应项为 1。
d_{i}= \begin{cases}1 & \text { if } \operatorname{deg}(j)=0 \\ 0 & \text { otherwise }\end{cases}

向量 \boldsymbol{p} 来表示访问各个网页的概率均等,代替 \boldsymbol{w}_0 的写法:

\boldsymbol{p}=\left[\frac{1}{n}\right]_{n \times 1}

两个矩阵的乘积所得的矩阵 D 表示出度为 0 的网页将以均等概率访问其他网页。与前述提到的矩阵 B 具有互补的特性,补充了在随机游走模型中,一个网页出度为 0 时的访问页面的情况。这样做使得最终矩阵的每一列之和都为 1。
D=\boldsymbol{p} \times \boldsymbol{d}^{T}
则最终排名的计算方法为:
\boldsymbol{Rank} =d \boldsymbol{p} + (1-d)(B+D) \cdot \boldsymbol{Rank}

偏置向量 | ODP-Biasing

主题的预定义参考了 ODP (Open Directory Project) 网站,利用 ODP 中 16 个顶级分类下的 URLs 生成了 16 组偏置 PageRank 向量 (biased PageRank vectors)。

为了实现这一点,算法中采用了新的向量 \boldsymbol{v_j}=\boldsymbol{p},针对每个主题有:
v_{j i}=\left\{\begin{array}{cl} \frac{1}{\left|T_{j}\right|} & i \in T_{j} \\ 0 & i \notin T_{j} \end{array}\right.
其中 T_{j} 表示在契合第 j 个主题的网页集合。包含在这些网页中的页面被赋予较大的跳转概率值,而其他网站则相对减少。

查询打分 | Query-Time Importance Score

此外,还需要在给定一个查询 q 的时候,估算出该查询落在某个主题 c_j 的概率。文章使用了朴素贝叶斯分类器(naive-Bayes classifier),将查询 q 中的每个 term 分词记作 q_i,利用贝叶斯公式:
P\left(c_{j} \mid q\right)=\frac{p\left(c_{j}\right) \cdot P\left(q \mid c_{j}\right)}{P\left(q\right)} \propto P\left(c_{j}\right) \cdot \prod_{i} P\left(q_{i} \mid c_{j}\right)
P\left(q_{i} \mid c_{j}\right) 则容易用统计的方法估计出来,对于 P\left(c_{j}\right) 则采用先验概率的方法,根据用户的查询历史(上下文)进行动态调整。

计算出了查询落在各个主题的概率后,再用这个概率对各个主题下的 Rank 向量进行线性加权,即可得到最终排序用的评分:
s_{q d}=\sum_{j} P\left(c_{j} \mid q^{\prime}\right) \cdot r_{j d}

HITS: Hyperlink-Induced Topic Search

这里再介绍一种基础的网页排序算法——基于超链接追敏的主题排序,对于一个查询,不再返回单一的网页排名,而是同时返回两个列表:

  • 包含链接的 Hub 网页,收录了主题相关的权威网页链接。
  • 包含内容的 Authority 网页,有着与主题相关的高质量内容。

那么,如何排序这两个列表呢?

基本假设

  • 一个好的 Hub 网页指向该主题的许多 Authority 网页。
  • 一个好的 Authority 网页被许多好的 Hub 网页指向。

基于这两个假设,我们可以提出两个指标来衡量每个页面:枢纽值(Hub Scores)和权威值(Authority Scores),这两种值是互相依存、互相影响的。

  • 枢纽值,指的是页面上所有出链指向页面的权威值之和。
  • 权威值,指的是页面的所有入链所在的原页面的枢纽值之和。

算法步骤 | HITS Algorithm

  1. 找出 root set:根据用户 query 中的 term,在文档集中找出包含至少一个 term 的的文档,使他们构成 root set。

  2. 找出 base set:在 root set 的基础上,找出集合中网页链入或链出并且不在 root set 中的网页,并把他们加入到集合中,从而构成 base set。

  3. 计算每一个网页的枢纽值 h(x) 和权威值 a(x),初始时,所有 h 值和 a 值均为 1。

  4. 迭代更新两个值直至收敛。为了防止两个值太大,可以在每次迭代后归一化。归一化的指标不重要,因为我们只关注相对排名。

  5. 返回两个值分别排序的列表。

HITS 算法缺点

  1. 尽管限制了计算对象在 base set 中,但在线计算效率还是太低,不如 PR 快。
  2. 主题漂移现象仍未解决。如果在集合里包含与查询主题无关的页面,且含有大量相互链接,可能会排到前列。这种现象被称为紧密链接社区现象。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容