Rocchio算法
一、引子
查询扩展(Query Expansion)是信息检索领域的一个重要话题。
一方面。用户本身可能会出错,他会输入一些错别字,比方把“冯小刚”,错写成“冯晓刚”;或者某个复杂的专有名词。用户自己也不是非常清楚。比如图灵当年研究的Entscheidungsproblem,由于这个词非常生僻,你可能仅仅隐约记得 En...ch...dungsproblem。现代IR要求面对用户的错误输入或者不完整的输入也能给出尽量相关的查询结果,这就须要用到查询扩展。还有一方面,自然语言本来就具有多意性,比如当你输入java时,它可能指一种计算机语言,也可能是印尼的一座岛,甚至是某个品种的咖啡豆。这些问题也要借助查询扩展来加以应对。
你可能会想到使用通配符(wildcard)来协助查询,这也的确能够解决上述我们列举的部分问题。事实上现代IR系统基本都有这方面的设计,但这还远远不够。
为了应对语言本身的模糊性(ambiguity),我们还须要一些对query进行优化、提炼,从而使其更加明白。这方面的策略主要分成两类,即全局性方法和局部性方法。
全局性方法主要借助同义词词典或者WordNet之类的工具。对原query进行补充推荐。主要策略包含:
- 利用 terms 或 phrases 的共现性来向用户建议更进一步的(或者有助于查询更加明白的)补充terms。比如:[java] → ([java indonesia] | [java coffee] | [java programming])?
- 向 query 中直接添加原terms的同义词、反义词、派生词等,比如:[cat] → [cat feline jaguar animal puss . . . ]
- 建立一个自己主动的同义词词典(automatic thesaurus),然后在collection中寻找有关的terms,从而向 query 中添加联想词,比如:[olympics] → [medal record rio champion torch . . . ]
局部性方法则基于最初查询的结构来又一次制定query。这当中最重要的概念就是“relevance feedback”。
二、Relevance feedback
首先明白。如今我们要做的事情是改进优化我们的terms,事实上就是添加很多其它的辅助信息或限制条件。比如用户输入的查询关键词是java,我们对它进行改进追加一些信息,变成 java programming(如果我们有非常大把握猜測出用户想查询的是一门计算机语言)。
那这个被添加的信息programming,除了上面提供的那几条策略之外,还有其它方法吗?一个非常不错的主意就是,从(比如输入java后得到的)query 结果中找出一些信息来作为查询扩展(这也就是局部性方法的基本策略)。
而这样的局部方法的核心就是 relevance feedback。在一个“true relevance feedback”中,用户能够把检索到的文档标识成相关或者不相关。
相关的文档将得到正值的权重,而不相关的文档则得到负数的权重。可是如今更为popular的方法是“pseudo-relevance feedback”,简称PRF。当然,仅仅有IR系统觉得相关的内容才会检索出来,所以得到的结果都是相关的。但如今我们如果排名靠前的结果就是相关。反之靠后的就不相关。
这就是称其为pseudo的原因。
并且这是我们兴许算法赖以存在的一个非常重要的基本如果。
以下总结通过RF进行查询扩展的基本步骤:
三、与Rocchio 算法
Rocchio算法 源自 1970年代 建立的SMART IR 系统。
它以在 IR 系统建立的 RF 方法为基础,通过查询的初始匹配文档对原始查询进行改动以优化查询的方法。该算法如果大部分用户都有一个大致的概念。以保证他们能够判定哪些文档是否与查询主题相关。
Rocchio算法 提供了一种将相关反馈信息融到向量空间模型(VSM。Vector Space Model)的方法。假定我们要找一个最优查询向量q ,它与相关文档之间的类似度最大且同一时候又和不相关文档之间的类似度最小。若Cr表示相关文档集,Cnr表示不相关文档集。那么我们希望找到的最优的 q 就是
当中。sim() 函数用于计算类似度。
採用余弦类似度计算时,能够将相关文档与不相关文档区分开的最优查询向量为:
这就是说。最优的查询向量等于相关文档的质心向量和不相关文档的质心向量的差。下图能够帮助我们来理解这个公式。如果图中红色叉所表示不相关文档,圆圈表示相关文档(注意为了便于理解,我们这里讨论欧几里得距离,而非余弦距离)。你可能会觉得既然我们是想找出相关的文档,并且相关文档的质心是离全部相关文档都近期的一个点,那这个点不就是最优查询吗?从下图来看。显然如果你选择相关文档的质心。那么不相关文档离这个质心的距离与其它相关的点是相等的。所以事实上它也会被囊括进来。
注意前面我们也讲过。在全部被检索出来的文档中,如果排名靠前的结果就是相关,反之靠后的就不相关。所以如果我们选择一个离相关质心尽量接近同一时候又离不相关质心尽量偏离的点,可能会比相关文档的质心向量更偏离各个相关文档。但同一时候也会更加偏离不相关文档,排序之后,相关文档会更加靠前,而不相关文档由于排序靠后也就变成不相关的了。
然而,这个发现并没有什么意义,由于检索本来的目的就是要找相关文档。而全部的相关文档集事先却是未知的。可是我们能够依据这个思路的启发来进行变型改造,于是便得出了本文要讨论的Rocchio 算法(一种用在IR系统中的相关反馈算法)。在一个真实的IR中,假定我们有一个用户查询,并知道部分相关文档和不相关文档的信息,则能够通过例如以下公式得到改动后的查询向量q:
当中。 q0 是原始的查询向量,Dr 是已知的相关文档集合(即 top results in PRF),Dnr 为不相关文档集合。α、β 及γ 是上述三者的权重。这些权重能够控制判定结果和原始查询向量之间的平衡:如果存在大量已推断的文档,那么会给β 及γ 赋予较高的权重。这些权值能够凭经验或对文本数据的认识在赋值,也能够通过实验来调试赋值。
改动后的新query从q0 開始,向着相关文档的质心向量靠近了一段距离。而同一时候又与不相关文档的质心向量远离了一段距离。
新查询能够採用常规的VSM进行检索。通过减去不相关文档的向量。我们非常easy保留向量空间的正值分量。在Rocchio 算法中。文档向量中的权重分量如果为负值,那么该分量将会被忽略,换言之,此时会将该分量权重设为0。下图给出了应用相关反馈技术的效果示意图。
RF 能够同一时候提高recall 和 precision。然而,实际表明该技术在一些recall比較重要的场景下对于提高recall非常有帮助。这当中的部分原因在于它对查询进行了扩展,还有一个原因是应用的场景所带来的结果:在期望高recall的情况下,能够估计用户可能会花很多其它时间来浏览结果并进行重复搜索。
正反馈往往比负反馈更有价值,因此在非常多IR系统中。会将參数设置成 γ < β。一个合理的取值是α = 1、β = 0.75 及γ = 0.15。
实际上,非常多系统,都仅仅同意进行正反馈,即相当于设置 γ = 0。
还有一种做法是,仅仅取检索系统返回结果中排名最高的标记为不相关的文档进行负反馈,此时。公式中的|Dnr| = 1。
四、一个样例
參考文献:
Manning, Christopher D; Raghavan, Prabhakar; Schütze, Hinrich; Introduction to information retrieval, Cambridge University Press 2008.
最新文章
- 使用EF CodeFirst 创建数据库
- Json学习笔记
- 通信原理实践(一)&mdash;&mdash;音频信号处理
- Orcle基本语句(一)
- vbox进行克隆时时启动eth0时问题
- OC基础--成员变量的封装
- 判断滑动方向UITableView
- android110 jni01
- win8 64位操作系统 Microsoft Visual Studio 2010在IIS上调试 “此任务要求应用程序具有提升的权限”等问题
- activity中实现Spinner绑定
- (转载)PHP使用empty检查函数返回结果时报Fatal error: Can&#39;t use function return value in write context的问题
- mongoDb +Java+springboot
- 使用CSS设置滚动条样式以及如何去掉滚动条的方法
- TCP 连接关闭及TIME_WAIT探究
- H5之postMessage 。实现跨域
- 检测 web项目 404 500 状态的 页面
- English Conversations You Can Download for Free (Spoken English MP3/Audio Files)
- protobuffer、gRPC、restful gRPC的相互转化
- Fiddler 手机抓包介绍
- php中经常使用的string函数