之前的博客中已经介绍了Ranking Relevance的一些基本情况(Click Behavior,和Text Match):http://www.cnblogs.com/bentuwuying/p/6714064.html,这里就不再赘述了。针对之前在计算Ranking Relevance的过程中遇到的问题:Click Behavior对长尾的或者根本没出现过的query-doc pair无效,Term Match无法解决近义词和语义隔离问题,Topic Match解释性差的问题。本篇博客介绍的paper中的这种计算Ranking Relevance的方法能够有效地解决上述的问题:结合了Click Behavior和Text Match两方面的信息,并利用点击日志构成二分图,根据二分图进行传导,学习到query和doc各自的向量表达式,最终收敛之后进行query-doc relevance的计算。

该方法的特点有:

1. 利用二分图的传导,从相似的query(或者doc)中提取term来丰富当前query(或者doc)的term表达。

2. 在二分图的传导过程中,利用query-doc pair的点击信息,来平滑query和doc的vector中各个维度的term weight大小。

解决之前Click Behavior中的Sparsity和Noisy的问题。

该paper的3方面贡献在于:

1. 可以使querydoc在同一空间上生成词向量考虑

2. 对于未曾有点击行为的querydoc也可以进行该空间词向量的估计

3. 最终计算的效率较高,可以用于商业的搜索引擎

1. 已有点击行为的query-doc relevance计算

用Doc表示文档集合,用Query表示query集合,则点击二分图的节点集合为Doc U Query。对于一个query-doc pair:qi和dj,如果它们之间有至少一次点击,则二分图中这两个节点之间会有一条边相连接,且权重为该query-doc pair的点击次数。点击二分图的示例如下图所示。现在假设语料的长度为V,则Query构成的矩阵为|Query|×V,矩阵的每一行代表了一个query的vector表示;以及Doc构成的矩阵为|Doc|×V,矩阵的每一行代表了一个doc的vector表示。那么现在的任务就是如何计算这两个矩阵。

要知道,这个方法的目的是要将所有的query和doc表示成一个公共向量空间上的向量(可以是query的term space,也可以是doc的term space)。它利用二分图的某一边的节点上的conetnt information 初始化该边的节点的vector,然后利用点击信息进行传导,这样就可以在传导过程中,将具有代表性的term的weight提高,将不具有代表性的term的weight降下去。

首先,我们需要初始化二分图中某一边的节点的向量表示,例如,我们选择query这一边的节点,将所有的query进行分词,构成词典,便得到query space上各个query的向量表示了。每一个维度代表了一个term,每个维度(term)可以看成是一个feature,这边是term级别的表示,过去的研究表明,term级别的表示方法解释性较强,便于验证和debug(虽然同时会遇到无法解决近义词和语义隔离问题,不过我们这里介绍的方法可以对这种问题进行解决)。通过让query和doc都使用公共向量空间的表示方式(这里是query space),我们可以消除query与doc的语义隔离问题。

下一步便是query & doc的向量在二分图上的传导了。基本思路是利用query vector结合起来表示在query下有点击的doc的vector,反之亦然。如果某些query之间拥有较多的共同点击的doc,则这些query是相似的query,它们的vector representation应当较为相似,反之doc之间亦然。

当然,我们这样计算的前提是,click information可以很好地表示query-doc的relevance,并且relevance的大小与click number的多少是正相关的。

具体的向量传导步骤如下:

1. 我们假设从query side开始。初始化的时候,每个query都用它自身的term表示成一个vector(利用one-hot方式),每个term的weight与term出现的次数成正比,最后将每个query的vector进行归一化处理。初始化矩阵(包含所有query的vector)可以用表示。

2. 在第n次传导中,我们先利用二分图中有边连接的各个query的vector加权求和,来计算doc的vector矩阵,这个权重即为query-doc的click number,如下式:

3. 下一步就是反过来,利用二分图中有边连接的各个doc的vector加权求和,来更新query的vector矩阵

4. 按2,3中的步骤不断进行迭代,直至收敛,其产出的query和doc的向量就都在一个空间内,可以计算query-doc relevance,同时还可以计算相似度/相关性。

这里以上的图为例再说一下计算过程:

1. 初始化query的向量:

2. 根据上一次query的迭代信息以及与doc的点击信息来更新doc的向量:

3. 然后就是不断的迭代就行了,这样已经很清晰了

了解过一些信息检索或者链接分析的朋友可能会马上想到,这好像Hits这个算法。的确是的,在计算过程中极为相似,不过Hits权重主要是计算HubsAuthority两端的权重,而这里的迭代完得到的是各个向量,有异曲同工之妙。
另外在实际的query量级一般都是百万以上,这样query的语料的量就很大了,而搜索引擎中需要计算的性能要求极高,所以一般进行稀疏存储,并且只取一些重要的term(Top K的term)来对query进行表示。

2. 没有点击行为的query-doc relevance计算

实际应用中,用户搜索之后带来了点击行为的只是一小部分。如果仅按照上述点击传播的方式来计算的话,无query点击的文档将会将会无法得到正常的向量,同时一些新的queryQuery^">(从未有用户搜索过的query)也就无法得到正常的向量数据,所以需要一种对于这种缺失行为的queryQuery^">和docDoc^">进行向量表示估计。

由于在线计算相关性时,对于已有行为的query−doc和缺失行为的query-doc是一视同仁的,因此为了在线计算时不应该因为训练数据产生偏差,所以需要与已有行为的query-doc向量在同一个空间内,同时考虑已有行为的query和doc的向量均已计算得到,我们还借助这些数据来预估缺失行为的向量。

2-1. 提取unit向量

既然没有点击行为的query与doc之间没有任何边连接,那我们可以利用有点击行为的query-doc的信息,通过有点击行为的query进行的边的构造,首先将query分解为各种unit(一般是N-grams,如unigrams,bigrams,trigrams等,但该query进行分解之后不能有overlap),这样就有ui∈unit(qi),如果存在query含有ui,则将ui对应的query之间形成一条虚拟的边,同时称含有ui的所有query的集合为Oui

这种边的构建方式如上图,q1,q2和q3均都包含了yahoo这个词,则在他们之间形成这条虚线的边。
接下来我们可以理解query−doc之间的向量传播方法,我们当然也可以完成unit−doc的传播。
ui会与qi有边相连,而qi与di又有边相连,因此我们可以间接认为ui与di也是有边相连的。
现假设qk包含了ui,同时qk与dj存在点击行为,Pi,k,j表示为这个二折线的权重,则该权重其实为qk与dj的点击次数,那么我们就会有

其演示就是上图的右侧部分,yahoo与d1之间的权重为8,与d2之间的权重为5,既然到了这一步,我们就可以按照上一小节的传播方式来计算,这样就可以巧妙的得到Ui的向量:

上面得到的是关于query上unit的向量,同样的我们也可以从doc这一侧出发,来计算doc相关的unit。

2-2. 计算unit向量权重

有了unit的向量之后,接下来要解决的问题就是如何得到query或者doc的向量了,其实最简单的方法就是将他们各自的unit进行平均即可,不过paper中使用线性回归的方法来解决该权重问题,在进行权重训练时使用最小均方差:

Ti是使用有点击行为的query计算得到的向量,也就是我们所认为的gold-set。这样求出来的W就是各个uniti不同的权重。

2-3. 预估向量

根据上面两个步骤得到的unit的向量和权重之后,得到整体的query或者doc的向量就很方便了,由于unit本身就是query或者doc分解出来的,这里基础数据也都已经计算完成了,所以直接进行加权求和即可:

3. 总结

该方法成功地借助了点击日志,对query-doc relevance进行估计,并且在实现上:

1. 已有点击数据的query和doc的向量直接离线就按完成。

2. 缺失点击的query和doc可以利用离线计算的unit向量,在线直接进行加权求和即可。

3. 对于在线存储均使用稀疏方式并只存top-k,因此存储并不是问题。

4. 在线计算相关性可以直接按相似度计算,复杂度为klogk,所以并不是很高。

4. 参考

1. Learning Query and Document Relevance from a Web-scale Click Graph

2. http://kubicode.me/2016/11/03/Search%20Engine/Learning-Query-And-Document-Relevanec-from-a-Web-scale-Click-Graph/

使用点击二分图计算query-document的相关性的更多相关文章

  1. 使用点击二分图传导计算query-document的相关性

    之前的博客中已经介绍了Ranking Relevance的一些基本情况(Click Behavior,和Text Match):http://www.cnblogs.com/bentuwuying/p ...

  2. ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

    有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...

  3. 基于熵的方法计算query与docs相似度

    一.简单总结 其实相似度计算方法也是老生常谈,比如常用的有: 1.常规方法 a.编辑距离 b.Jaccard c.余弦距离 d.曼哈顿距离 e.欧氏距离 f.皮尔逊相关系数 2.语义方法 a.LSA ...

  4. Xapian索引-文档检索过程分析

    本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1  检索语法 面对不同的检索业务,我们会有多种检索 ...

  5. 计算广告(5)----query意图识别

    目录: 一.简介: 1.用户意图识别概念 2.用户意图识别难点 3.用户意图识别分类 4.意图识别方法: (1)基于规则 (2)基于穷举 (3)基于分类模型 二.意图识别具体做法: 1.数据集 2.数 ...

  6. NLP传统基础(1)---BM25算法---计算文档和query相关性

    一.简介:TF-IDF 的改进算法 https://blog.csdn.net/weixin_41090915/article/details/79053584 bm25 是一种用来评价搜索词和文档之 ...

  7. ie的selectNodes函数和firefox的document.evaluate

    selectNodes() 方法用一个 XPath 查询选择节点. nodeObject.selectNodes(query)query  XPath 查询串. 包含了匹配查询的节点的一个 NodeL ...

  8. Elasticsearch学习笔记(十四)relevance score相关性评分的计算(1)

    一.多shard场景下relevance score不准确问题     1.问题描述:            多个shard下,如果每个shard包含指定搜索条件的document数量不均匀的情况下, ...

  9. Elasticsearch学习笔记(十二)filter与query

    一.keyword 字段和keyword数据类型    1.测试准备数据 POST /forum/article/_bulk { "index": { "_id" ...

随机推荐

  1. 第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)

    前些时候用换了工作,本来是用的前端框架是easyui,后面用的是bootstrap.对于我来说虽然不是新东西,因为原来毕业时候用过一段时间,也不懂什么插件的开发,现在用过easyui后觉得easyui ...

  2. webpack从0开始---(一)

    换了新环境,同时也有了新目标,从webpack开始. webpack:具体是什么,大家还是自行去看吧,这里就不多做介绍了! 传送门---webpack.github.io 网上的安装方法很多,这里我就 ...

  3. 面向对象 "一"

    1:面向对象不是所有情况都适用. 2面向对象编程 a:定义类 calss Foo: 注意顶一个类的时候首字母必须是大写 def (方法一)(self,bb) pass b:根据创建对象,创建和Foo实 ...

  4. 前端资讯周报 3.6 - 3.12: 对学习Javascript最有帮助的三本书,以及HTML标题的迷思

    每周一我都会分享上一周我订阅的技术站点中,和解决问题的过程中阅读到的值得分享的文章. 毕竟个人的阅读量有限,也欢迎大家留言或者私信给我你们阅读到的,对你们前端技术有帮助的任何内容,题材不限,语言不限. ...

  5. Servlet 3.0/3.1 中的异步处理

    在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如访问数据库.调 ...

  6. Oracle-orclEXORIM

    imp pzhdb/hiway@orcl file =d:\pzhsd.dmp fromuser = pzhsd touser=pzhdb:导入 第一个pzhdb为新的用户名 hiway为密码 orc ...

  7. Fundebug上线Node.js错误监控啦

    作为全栈JavaScript错误实时监测平台,Fundebug的Node.js实时错误监测服务上线啦,我们能够帮助开发者及时,高效地发现并且解决Node.js错误,从而提高开发效率,并提升用户体验. ...

  8. 使用 POJO 对象绑定请求参数

    概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值并且支持级联属性.这一特性在日常开发过程中使用频率比较高,开发效率也高,本文主要对 POJO 对象绑定 ...

  9. node.js下mongoose简单操作实例

    Mongoose API : http://mongoosejs.com/docs/api.html // mongoose 链接var mongoose = require('mongoose'); ...

  10. ES6 学习笔记(一)let,const和解构赋值

    let和const let和const是es6新增的两个变量声明关键字,与var的不同点在于: (1)let和const都是块级作用域,在{}内有效,这点在for循环中非常有用,只在循环体内有效.va ...