Chinaunix首页 | 论坛 | 博客
  • 博客访问: 880453
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 嵌入式

2012-03-27 17:39:08

前一阵子和大家分享了一系列排序算法,希望对大家能够有一些帮助。从今天开始,本人打算开展一个新的领域,介绍一下信息检索相关的技术。信息检索技术可以说现如今发展非常迅速,使用也极其广泛,甚至可以说是随处可见。特别是做一些跟搜索引擎,机器学习相关工作时,信息检索的知识无处不在。为了让大家更好的理解信息检索技术,我将分多次对信息检索技术做一个尽可能细致的阐述,难度由浅及深,欢迎大家多多拍砖。

今天先介绍最简单的信息检索技术,布尔检索。

信息检索(IR),通俗的讲,就是要在一个很大的文本(有时可能是其他数据,如图像等)集合中,找到与用户需求相关的可以满足用户需求的非结构化信息。听起来有点拗口,其实就是一种查询,只不过查询的对象是非结构化信息,和查询数据库中的表并不相同。希望这么说能好理解一些。

既然要从文档中找到符合用户需求的信息,那么首先就要解决一个问题,就是如何来表示文档呢?在信息检索中,我们通常使用1代表一个word出现在文档中,0代表没有出现在文档中,很简单。

比如 文档1: I often go to school by bus. 文档2: I am wating for the bus for 20 minutes.

我们如何来用1和0来表示上面的文档呢?很容易想到的方法是将所有的文档和word组成一个矩阵,X方向为文档,Y方向为所有的单词。

    文档1  文档2  文档3  文档4  ...

I     1    1    0    0

often  1    0    0

go    1    0    0

to    1    0    0

school 1    0    0

by 1    0    0

bus 1    1    0

am 0    1    0

...

这样很容易的就表示了所有的word和文档的对应关系,当用户要查询检索bus时,只需要找到bus对应的行,将是1的文档都取出来,展现给用户不就行了?

确实,这样做可以完成检索的需求,但是仔细想想不难发现,我们假设一篇文档有1000个word,一个文档集有1亿篇文档(这对于搜索引擎来说还远远不够),那么我们需要用1*1011的矩阵来保存这种关系,这对计算机来说显然是无法承受的。

那我们有什么办法来进行优化呢?仔细想想可以看出,虽然数据量很大,但是这个矩阵是极其稀疏的,也就是说1的个数是很少的,绝大多数位置都是0.那么我们为什么要保存那么多的0来占用空间呢?这完全没有必要。于是,著名大倒排索引诞生了。

在介绍倒排索引前,先说正排索引,正排索引就是给定一个文档,可以知道文档中出现的所有word。对比着看,倒排索引就是反过来,给定一个word,看看这个word出现在哪些文档中。下面的图形象的描述了倒排索引的数据结构

I -> 1 2 3 4 5 7 9 22

school -> 1 3

bus -> 1 2 8 9

其中前面的是word,后面的是文档的标号,并且这些标号是按顺序存放的,这更利于后面检索环节的处理。当然上面提到的是最基本的原型,实际的系统中,倒排索引还保存了词频,网页的元数据等各种信息。

有了倒排索引,我们就可以省去大量的空间,大大提高了查询检索的效率。下面我们看看如何进行检索。比如我们有了如下的倒排索引

A -> 2 4 8 16 32 64

B -> 1 2 4 9 16 33

先在用户查询A,那么则返回2 4 8 16 32 64

如果查询A and B 则需要把A和B的倒排索引拿出来,进行一次求交集的运算。其实很简单,只需要O(x+y)的时间操作,就可以得到2 4 16了。

如果用户查询A or B呢?不用我多说了吧,相信大家已经很明白该如何处理了。

以上是本人对布尔检索的一个简单的说明,欢迎大家指正。谢谢

阅读(770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~