最近在看《Introduction to Information Retrieval》(中文版为《信息检索导论》,下文简称为“IR”),是最经典的信息检索书籍之一了。由于淞姐要求我细读这本书然后跟同事分享,就有了这个版块,之后会陆续添加后续章节内容。即使是站在巨人的肩膀上了(看了中文版和英文版IR,也从网上搜集了不少内容),但很多细节往往还是需要自己用心体会。从一个读者到一个讲解人,在第一次做分享的时候已经感觉很不容易了,有些东西原来只是一知半解,能自己想清楚但却很难表述。这些内容就是个人的一些读书笔记,希望能给刚好想了解搜索引擎的你带来一些启发。文中会尽量备注英文原版中的术语以免丢失本意。英文电子书可以从官网获取 Introduction to Information Retrieval。
线性扫描和倒排索引
从线性扫描讲起
如果需要从文档集合 D D 中搜索包含某个关键词 的文档,最直接的方法就是从头到尾扫描文档集 D D ,对每个文档 都查看是否包含关键词 k k 。这种线性扫描的方式最为直观易懂,在Unix/Linux系统中的文本扫描命令grep做的就是这种工作。然而,当需要检索的文档规模非常大时,这种线性扫描的方式的效率会变得非常低下。线性扫描的时间复杂度与文档集大小成正比,在大规模文本检索的场景下,线性扫描不再适用。大型的Web搜索引擎需要检索千亿级别数量的网页,如果采用类似grep的线性扫描方式,就需要依次扫描这么多的文本来判断每一个网页是否符合查询要求,这样的检索慢如蜗牛,用户显然无法接受。目前,搜索引擎通过事先给文档建立索引(index)的方法来避免这种线性扫描,使得搜索过程非常快速,这种技术称为倒排索引。
IR中,以《莎士比亚全集》为例子来说明倒排索引的基本知识。这里笔者就重新举个例子吧。假设某文档集中存在这样的三篇文档(还有其他文档不列举),分别是 为“Apple and cat”, d2 d 2 为“I like cat”, d3 d 3 为“I have an apple”,用矩阵表示,当文档d中存在词项t时,矩阵元素(d, t)为1,否则为0:
文档\词项 | apple | and | cat | I | like | have | an | ... . . . |
---|---|---|---|---|---|---|---|---|
d1 d 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ... . . . |
d2 d 2 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |