您的位置:首页 > 移动开发 > Objective-C

[Efficient Retrieval of the Topk Most Relevant Spatial Web Objects]浅析(一)

2014-05-04 18:06 211 查看
上周去实验室,老师让我去学习一下这篇论文以及配套的代码。因此我决定开博客记录一下学习的笔记,只是短浅的解析,如有错误还请见谅和指出。



为自己科普一下

首先看这篇论文的时候,一开始还挺费劲的,因为有些术语没接触过,还是查了不少相关的资料。

【Top-k】

这篇论文的主题是解决top-k问题的高效检索方法。首先什么是top-k问题呢?简单的来说就是从大量数据中获取符合检索要求的最大(或最小)的K个数据。一般的算法中都采用heap来检索。文章的核心就是根据POI(point of interest)点的位置以及文本相关性来构建IR树,然后再进行高效的检索。

【倒排文件(Inverted file)】

倒排文件简单的说是用于复杂的查询,是一种特殊的文件结构。倒排文件用文档的关键词作为索引。有两种类型,一种是基于属性的倒排文件,一种是基于文本的倒排文件。

【LKT(location-aware top-k text retrieval(LkT) query)】

是文章定义的一种基于位置感知的查询。返回的结果是已经排好序的k个对象

问题提出



假设一个人,位于Q的位置,他要查找“中国餐厅”,因此发出一个Q查询。那么根据top-1,寻找出最符合的那一个对象,是哪一个呢?
已知给出每个对象对应的term矩阵如下:




解决方案

贯穿文章的一个例子就是 假定一个数据集中有8个Objects, 每一个Object有这样的向量定义(O.loc ,O.doc),O.loc是表示位置信息,O.doc为文本描述对象的信息。
根据语言模型(未深究来历)可以得出一个用于排序的函数:



解释这个公式:P就是出现的概率,Q是一句查询,比如Q:keywords = (Chinese restaurant),那么P就是为"Chinese"、"restaurant"在O.doc中出现的概率。
结合距离和文本,得到Objects最终的排序函数为:



maxD和maxP是用来标准化的。是Q.loc与O.loc之间的欧几里得距离。

给定查询Q的关键字以及位置信息Q.loc带入(3)式,令a=0.3,利用(3)式排序得到O1为最符合条件的对象。

基本的算法

这里涉及到了两种算法,第一个是基本的算法,第二个是混合型的算法。根据论文描述,我抽离了一下大概的思想。

Baseline Algorithms

IFO (Inverted File Only)

(一)根据每一个倒排文件,计算所有对象objects的得分。利用上述的公式(3)“+” 右边的那部分。得到Objects得分的一个升序列表(越低分越符合要求)。
(二)根据列表扫描计算空间接近性,直到k个结果为止。
这个算法关键要解决的问题就是:何时停止扫描。在扫描期间,这个算法记录第k个对象的分数,设定它的分数为阈值,threshold表示。这个算法直到有新的对象分数超过阈值就会停止扫描。否则将会检索这个新的对象的位置,结合公式(3)计算,对比阈值,决定是否阈值需要更新。



RIF(R-tree & inverted file)

这个算法主要是运用倒排文件和R树两种策略。倒排文件与上文提到的IFO一样,用来计算得到一个ranking列表。然后这个算法用R树递增的找到最近的对象,对比它们的文本相关性(分数)。在这个算法执行的过程中,记录ranking中一个最小的文本分数,(与IFO不一样,IFO记录第k个对象的分数)记作MinTR,然后结合公式(3)的当下第k个对象的位置,得到一个综合排名得分,记作阈值。
对于一个新的对象,假设有距离dist,如果它的位置和当前的MinTR计算分数超过了阈值,那么这个新的对象会出现在查询结果中。这个算法确保了分数比第k个对象分数低的不会出现在查询结果中。

Hybrid Indexing For Location-Aware-Text Retrieval

IR树定义
IR树本质上是一颗R树,每一个节点含有倒排文件。

对于一个叶子节点N,形式为(O,ractangle,O.di),O代表在数据集D中的对象,rectangle包含O所在的矩形,O,di用来表示O的文档信息。
一个叶子节点有一个指向倒排文件的指针。倒排文件是与R树分开存储的。倒排文件中包含两个主要部分:1.所有的文档关键词 2.一个记录列表集合,每一个记录里,对于一个关键次t有(d,wd,t),d表示包含t的文档,wd,t表示t在文档d中的权重。

对于一个非叶子节点R,形式(cp,rectangle,cp.di),cp是孩子节点节点的地址,rectangle是最小边界矩形(很重要,是查找、删除、插入的关键),cp.di是表示一个伪文档。
伪文档和叶子节点中每一个对象对应的文档是不一样的,它是一个重要的结构,他代表所有孩子节点的文件。比如一个项目t,为文件中记录的是t在所有孩子文档中的权重最大值。这样在查找的时候就可以估计文本相关性。

比如开篇提到的那8个问题,对于那8个对象(叶子节点)的文档假设有如下数据;



解释一下~有倒排文件4、5、6.倒排文件4中存着对于"Chinese"这个关键词中,对象O1文档中权重是5。"Spanish",对象O2的权重是5.以此类推。
对于非叶子节点有如下数据:



对于倒排文件2中有非叶子节点R1和R2,R1.记录Chinese这个权重最大值为5.R2为7.



R树的学习原理感谢http://blog.csdn.net/zhouxuguang236/article/details/7898272这篇博文的作者。本论文的R树构建仅是将MBR概念换成了MBR+InvFile但是论文原理对于我这样初学者来说讲得没有这篇博文详尽,.因此R树原理参考这篇作者的博文:
R树运用了空间分割的理念,这种理念是如何实现的呢?R树采用了一种称为MBR(Minimal Bounding Rectangle)的方法,在此我把它译作“最小边界矩形”。从叶子结点开始用矩形(rectangle)将空间框起来,结点越往上,框住的空间就越大,以此对空间进行分割。



首先我们假设所有数据都是二维空间下的点,图中仅仅标志了R8区域中的数据,也就是那个shape of data object。别把那一块不规则图形看成一个数据,我们把它看作是多个数据围成的一个区域。为了实现R树结构,我们用一个最小边界矩形恰好框住这个不规则区域,这样,我们就构造出了一个区域:R8。R8的特点很明显,就是正正好好框住所有在此区域中的数据。其他实线包围住的区域,如R9,R10,R12等都是同样的道理。这样一来,我们一共得到了12个最最基本的最小矩形。这些矩形都将被存储在子结点中。下一步操作就是进行高一层次的处理。我们发现R8,R9,R10三个矩形距离最为靠近,因此就可以用一个更大的矩形R3恰好框住这3个矩形。同样道理,R15,R16被R6恰好框住,R11,R12被R4恰好框住,等等。所有最基本的最小边界矩形被框入更大的矩形中之后,再次迭代,用更大的框去框住这些矩形。我想大家都应该理解这个数据结构的特征了。用地图的例子来解释,就是所有的数据都是餐厅所对应的地点,先把相邻的餐厅划分到同一块区域,划分好所有餐厅之后,再把邻近的区域划分到更大的区域,划分完毕后再次进行更高层次的划分,直到划分到只剩下两个最大的区域为止。要查找的时候就方便了吧。
下面就可以把这些大大小小的矩形存入我们的R树中去了。根结点存放的是两个最大的矩形,这两个最大的矩形框住了所有的剩余的矩形,当然也就框住了所有的数据。下一层的结点存放了次大的矩形,这些矩形缩小了范围。每个叶子结点都是存放的最小的矩形,这些矩形中可能包含有n个数据。
在这里,读者先不要去纠结于如何划分数据到最小区域矩形,也不要纠结怎样用更大的矩形框住小矩形,这些都是下一节我们要讨论的。
讲完了基本的数据结构,我们来讲个实例,如何查询特定的数据吧。又以餐厅为例吧。假设我要查询广州市天河区天河城附近一公里的所有餐厅地址怎么办?打开地图(也就是整个R树),先选择国内还是国外(也就是根结点)。然后选择华南地区(对应第一层结点),选择广州市(对应第二层结点),再选择天河区(对应第三层结点),最后选择天河城所在的那个区域(对应叶子结点,存放有最小矩形),遍历所有在此区域内的结点,看是否满足我们的要求即可。怎么样,其实R树的查找规则跟查地图很像吧?对应下图:




R树操作。

插入
      R树的插入操作也同B树的插入操作类似。当新的数据记录需要被添加入叶子结点时,若叶子结点溢出,那么我们需要对叶子结点进行分裂操作。显然,叶子结点的插入操作会比搜索操作要复杂。插入操作需要一些辅助方法才能够完成。
来看一下伪代码:
Function:Insert
描述:将新的记录条目E插入给定的R树中。
I1:[为新记录找到合适插入的叶子结点] 开始ChooseLeaf方法选择叶子结点L以放置记录E。
I2:[添加新记录至叶子结点] 如果L有足够的空间来放置新的记录条目,则向L中添加E。如果没有足够的空间,则进行SplitNode方法以获得两个结点L与LL,这两个结点包含了所有原来叶子结点L中的条目与新条目E。
I3:[将变换向上传递] 开始对结点L进行AdjustTree操作,如果进行了分裂操作,那么同时需要对LL进行AdjustTree操作。
I4:[对树进行增高操作] 如果结点分裂,且该分裂向上传播导致了根结点的分裂,那么需要创建一个新的根结点,并且让它的两个孩子结点分别为原来那个根结点分裂后的两个结点。
 
Function:ChooseLeaf
描述:选择叶子结点以放置新条目E。
CL1:[Initialize] 设置N为根结点。
CL2:[叶子结点的检查] 如果N为叶子结点,则直接返回N。
CL3:[选择子树] 如果N不是叶子结点,则遍历N中的结点,找出添加E.I时扩张最小的结点,并把该结点定义为F。如果有多个这样的结点,那么选择面积最小的结点。
CL4:[下降至叶子结点] 将N设为F,从CL2开始重复操作。
 
Function:AdjustTree
描述:叶子结点的改变向上传递至根结点以改变各个矩阵。在传递变换的过程中可能会产生结点的分裂。
AT1:[初始化] 将N设为L。
AT2:[检验是否完成] 如果N为根结点,则停止操作。
AT3:[调整父结点条目的最小边界矩形] 设P为N的父节点,EN为指向在父节点P中指向N的条目。调整EN.I以保证所有在N中的矩形都被恰好包围。
AT4:[向上传递结点分裂] 如果N有一个刚刚被分裂产生的结点NN,则创建一个指向NN的条目ENN。如果P有空间来存放ENN,则将ENN添加到P中。如果没有,则对P进行SplitNode操作以得到P和PP。
AT5:[升高至下一级] 如果N等于L且发生了分裂,则把NN置为PP。从AT2开始重复操作。




我们来通过图分析一下插入操作。现在我们需要插入R21这个矩形。开始时我们进行ChooseLeaf操作。在根结点中有两个条目,分别为R1,R2。其实R1已经完全覆盖了R21,而若向R2中添加R21,则会使R2.I增大很多。显然我们选择R1插入。然后进行下一级的操作。相比于R4,向R3中添加R21会更合适,因为R3覆盖R21所需增大的面积相对较小。这样就在B8,B9,B10所在的叶子结点中插入R21。由于叶子结点没有足够空间,则要进行分裂操作。
插入操作如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: