倒排文件的应用

倒排文件,其实出现在了《数据结构》的最后一节~~~不过从来没看过,今儿不小心再遇到这个术语时,百度了一下。

然后发现估计半年前某师兄参加某个面试,就说到了倒排文件。

 

从百度百科贴过来的:

 

一、何为倒排文件

      倒排文件:用记录的非主属性值(也叫副键)来查找记录而组织的文件叫倒排文件,即次索引。倒排文件中包括了所有副键值,并列出了与之有关的所有记录主键值,主要用于复杂查询。
  在搜索引擎收集完数据的预处理阶段,搜索引擎往往需要一种高效的数据结构来对外提供检索服务。而现行最有效的数据结构就是“倒排文件”。倒排文件简单一点可以定义为“用文档的关键词作为索引,文档作为索引目标的一种结构(类似于普通书籍中,索引是关键词,书的页面是索引目标)。

 

二、倒排文件应用举例

1)基于属性的倒排
  在一个带结构的记录文件中,如数据库文件等。文件里存放的都是一条接着一条的整齐的记录,每个记录又可分为一个个的属性。检索过程往往要求找出,在某个或者某些属性上满足一定条件的记录集合。像这一类的检索我们称为基于属性的检索。
  比如北大里某次活动的学生报名登记表文件,部分信息如下:
  001 xxx142 张三 男 18 元培
  002 xxx205 李四 女 17 哲学
  003 xxx187 王五 男 19 生物
  004 xxx325 赵六 女 18 元培
  而我们利用倒排文件来实现上述非关键码的查询,就能大大提高速度。对于前面的情况设计倒排表如下:
  男 001,003
  女 002,004
  16
  17 002
  18 001,004
  19 003
  20
  元培 001,004
  生物 003
  哲学 002
  由此可见,有了倒排文件,我们就可以将查询变成几个集合之间的交,并等运算,得到的最后结果即时我们要求的,这样不用挨个读取记录,且参与运算的数据大大减少,基本可以不用多次读写磁盘而直接在内存里进行运算,大大提高了检索速度。 有了这样的倒排表后,前面的查询就很容易了。如找出院系为“元培”的所有学生(简单查询),可以在院系倒排表中,取出属性值为“元培”的那一行倒排表,它里面包含的所有编号对应的记录就是所求的记录。又如找出年龄在18到20之间的所有学生(范围查询),我们可以把年龄倒排表中18,19和20这三行所对应的三个编号集合做并运算,最后结果就是我们要找的。而找出年龄在19岁以上的所有男生(逻辑查询),这个我们找出19岁以上的所有编号集合,用并运算合在一起,再同性别倒排表中的男生那一行的集合做与运算,最后就能得到正确结果。
  2) 基于文本的倒排
  倒排文件也可以应用于非结构化的信息检索里面,如大量正文的文本索引。尤其当今搜索引擎需要对海量的正文文本信息进行检索的情况下,倒排文件的使用尤其重要。
  对多个正文文本建立索引的基本思想就是,把正文看成一个一个的关键词的集合,然后用这些词组成一些适合快速检索的数据结构。一个倒排文件就是一个已经排好序的关键词的列表,其中每个关键词指向一个倒排表,该表中记录了该关键词出现的文档集合以及在该文档中的出现位置。如北大某院图书馆论文集的部分倒排表:
  关键词
  倒排表(所在文档编号,出现次数, 出现位置)
  KMP
  (#3307, 2, 5, 43)(#4615, 3, 0, 19, 34, 70, 143)
  最小支撑树
  (#2519, 1, 267)(#6742, 3, 19, 322, 526)……
  贪心算法
  (#2948, 3, 45, 267, 587)(#3693, 5, 39, 423, 765,809,1024)……
  ……
  ……
  这样一来,当要检索关于KMP方面的文章时,可直接取出其倒排表即可得知,编号为3307和4615的文章都是包含KMP这个关键词的,且能知道包含了多少次,以及在各个文档中的具体出现位置。如果同时需要“最小支撑树”和“贪心算法”两方面的文章,则可以直接将两个倒排表取交集,就能得到所有符合条件的集合。如此可以免去在整个图书馆里每一篇文档里去逐个查找的代价,从而可以轻松快捷的得到结果。

 

      于这样一个正文倒排文件的建立通常需要如下几个步骤:

      首先是文本切词,即以人工或者机器自动的方式把一篇文档里的可能成为关键词的词组划分出来。在汉语等东方语言中,因为词与词之间没有空格,所以怎样把词组从句子中完整的切分出来,需要专门的研究。这需要自然语言理解技术(natural language processing,属人工智能研究的一个分支)的支持。然后是得到各个关键词的集合,对于每个关键词建立它的倒排表,然后把所有倒排表按关键词排序存入文件,形成倒排文件。

      文件中除了记录那个关键词对应哪些文档外,还应该有关键词在文档中的出现位置和出现次数等。然而最后得到的倒排文件往往还是很大,关键词很多,所以还需要对倒排文件里的关键词再次建立索引结构。对关键词进行索引的常用技术有散列和B+树等,当然如果关键词能全部放入内存,也可以使用二叉查找树来建立索引。??)


  由于倒排索引支持高效检索,所以应用相当广泛。当然,对倒排表进行集合运算也需要一些运算空间,更大的缺点在于,当文件发生变化时,要同时维护更新这些索引,而这种更新的工作量会很大,所以它比较适合于当大文件里面内容比较稳定的情况下。尤其像光盘上的数据检索等就会是它最理想的应用场所之一。


  对这类文件的往往会进行这样的一些查询,如:找出院系为“元培”的所有学生(简单查询),找出年龄在18到20之间的所有学生(范围查询),找出年龄在19岁以上的所有男生(逻辑查询)等等。如果没有倒排表,我们则只能顺序从头到尾的一条一条检查记录,判断是否符合条件。这样当文件很大的时候,往往要多次读写磁盘会耗费相当大的时间。就算之前我们把记录按照关键码排序,也仍无法使用普通的检索方式来提高效率,因为查找的条件不是和关键码相关的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值