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