搜索引擎基础概念(1)—— 倒排索引

  “ 吾有三剑,唯子所择;皆不能杀人,且先言其状。一曰含光,视之不可见,运之不知有。其所触也,泯然无际,经物而物不觉。二曰承影,将旦昧爽之交,日夕昏明之际,北面而察之,淡淡焉若有物存,莫识其状。其所触也,窃窃然有声,经物而物不疾也。三曰宵练,方昼则见影而不见光,方夜见光而不见形。其触物也,騞然而过,随过随合,觉疾而不血刃焉。此三宝者,传之十三世矣,而无施于事。匣而藏之,未尝启封。”   —— 《列子·汤问》

  倒排索引(Inverted Index):倒排索引是搜索引擎数据存储的结构与形式,是实现单词-文档矩阵的一种具体存储形式。通过倒排索引,我们可以根据单词快速的获取包含这个单词的文档列表。倒排索引主要由两个部分组成:单词词典和倒排文件。

  一:单词-文档矩阵

    单词-文档矩阵是表达单词与文档之间所具有的一种包含关系的概念模型,图1-1展示了其含义。图1-1每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。

                       

                                    图1-1 单词-文档矩阵

    从纵向即文档这个维度来看,每列代表了该文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其他单词。从横向即单词这个维度来看,每行代表了哪些文档包含了这个单词。比如对于词汇1来说,文档1和文档4包含了词汇1,而其他文档不包含词汇1。矩阵中其他行列亦可作此解读。

    搜索引擎的索引其实就是实现了单词-文档矩阵的具体数据结构。可以有不同的方式来实现上述概念模型,比如倒排索引、签名文件、后缀树等方式。但是各项实验数据表明,倒排索引是单词到文档影身关系最佳实现方式。

   
  二:倒排索引基本概念

  • 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象。相比网页来说,涵盖更多形式,比如 Word、PDF、html、XML、关系型数据库的一条记录等不同格式的文件都可以称为文档,再比如一封邮件、一条短信、一条微博也可以称为文档。
  • 文档集合(Document Collection):由若干文档构成的集合称为文档集合。比如海量的互联网网页或者说大量的电子邮件或者说一批关系型数据库数据,都是文档集合的具体例子。
  • 文档编号(Document ID):在搜索引擎内部,会为文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理。每个文档的内部编号即称为文档编号,后面会用 DocID 来便捷地代表文档编号。
  • 单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。
  • 倒排索引(Inverted Index):倒排索引是实现单词—文档矩阵的一种具体存储形式。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:单词词典和倒排文件。
  • 单词词典(Lexicon):搜索引擎通常的索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息及指向倒排列表的指针。
  • 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称为倒排文件,倒排文件是存储倒排索引的物理文件。

    关于这些概念以及之间的关系,图1-2可以清晰的看出来:

                      

 

  三:倒排索引简单实例

    倒排索引从逻辑结构和基本思路上讲非常简单。下面我们通过具体实例来进行说明。

    假设文档集合包含 5 个文档,每个文档内容如图 1-3 所示,在图中最左端一栏是每个文档对应的文档编号,我们的任务就是对这个文档集合建立倒排索引。

                    

                               图1-3 文档集合

    中文和英文等语言不同,单词之间没有明确的分隔符号,所以首先要用分词系统将文档自动切分成单词序列,这样每个文档就转换为由单词序列构成的数据流。为了系统后续处理方便, 需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引(参考图 1-4)。在图 1-4 中,“单词 ID”一列记录了每个单词的单词编号,第 2 列是对应的单词,第 3 列即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为 1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。

                    

                             图1-4   最简单的倒排索引

    之所以说图 1-4 所示的倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息。图 1-5 是一个相对复杂些的倒排索引,与图 1-4 所示的基本索引系统相比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是一个很重要的计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。在图 1-5 所示的例子里, 单词“创始人”的单词编号为 7,对应的倒排列表内容有(3;1),其中 3 代表文档编号为 3 的文档包含这个单词,数字 1 代表词频信息,即这个单词在 3 号文档中只出现过 1 次,其他 单词对应的倒排列表所代表的含义与此相同。

                    

                              图1-5 带有单词词频信息的倒排索引

    实际的倒排索引还可以记载更多的信息,如图 1-6 所示的索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的文档频率信息(对应图 1-6 的第 3 列) 及单词在某个文档出现位置的信息。

                  

                        图1-6 带有单词频率、文档频率和出现位置信息的倒排索引

    文档频率信息代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是一个非常重要的因子。而单词在某个文档中出现位置的信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此是因为这个信息对于搜索系统来说并非必需,位置信息只有在支持短语查询的时候才能够派上用场。

    以单词“拉斯”为例,其单词编号为 8,文档频率为 2,代表整个文档集合中有两个文档包含 这个单词,对应的倒排列表为{(3;1;<4>),(5;1;<4>)},其含义为在文档 3 和文档 5 出现过这个 单词,单词频率都为 1,单词“拉斯”在两个文档中的出现位置都是 4,即文档中第 4 个单词 是“拉斯”。

    如图 1-6 所示的倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此,区别无非是采取哪些具体的数据结构来实现上述逻辑结构。

    有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词 “Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程,具体实现方案本书第 5 章会做详细描述。

 

转载于:https://www.cnblogs.com/yaokaizhi/p/9742290.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(20):巩固练习

//用运算符判断2019是不是闰年 /①、普通年能被4整除且不能被100整除的为闰年。 &#xff08;如2004年就是闰年,1901年不是闰年&#xff09;地球公转示意图②、世纪年能被400整除的是闰年。 (如2000年是闰年&#xff0c;1900年不是闰年) ③、 对于数值很大的年份能整除3200,但同…

汇编软件的安装与实验一

软件的安装在课程邮箱里有详尽的介绍&#xff0c;但在安装调试的时候还是出了一点小问题&#xff0c;创建虚拟盘符的时候&#xff0c;我将masm文件夹前面套上了一层名为masm文件夹&#xff0c;导致虚拟盘符创建之后无法使用debug。 随后就是实验 实验1.1写入程序段并且执行 a命…

upc 9519 New Game

New Game 时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 157 解决: 53[提交] [状态] [讨论版] [命题人:admin]题目描述 Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工&#xff0c;获得了提前试玩的机会。现在她正在试图通过一个迷宫。这个迷宫有一些特…

java学习(21):移位运算符

//移位运算符 public class test{ public static void main(String[] args){ int num3; //向左移位 System.out.println(“移位之前的二进制为”Integer.toBinaryString(num)); int moveleftnum<<2; System.out.println(“移位之后的值为”moveleft); //向右移位 int num…

Datagridview绘制

#region 绘制private void dataGridView_main_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e){int status_column_index 14;//会诊状态所在列DataGridViewRow row dataGridView_main.Rows[e.RowIndex];//获取行DataGridViewCell cell row.Cells[15];//按钮…

java学习(22):if语句

/任务 1&#xff1a;if语句 编写控制台java程序&#xff0c;使用Scanner 对象相关方法从控制台接收用户输入学生年龄&#xff0c; 如果输入的年龄大于18&#xff0c;则输出“你是一个成年人了&#xff0c;该有担当了&#xff01;/ import java.util.Scanner; public class test…

java学习(23):if..else

/任务2&#xff1a;if else 语句 编写控制台java程序&#xff0c;模拟银行取款的功能。 使用Scanner对象相关方法从控制台接收用户输入的银行卡账号和密码&#xff0c; 与预先定义好的银行卡账号密码相同则输出用户名密码正确&#xff0c;可以取款&#xff1b;如果账号或者密码…

android 面试汇总二

AnimationQ&#xff1a;Android中有哪几种类型的动画&#xff1f; 技术点&#xff1a;动画类型参考回答&#xff1a; 常见三类动画 View动画&#xff08;View Animation&#xff09;/补间动画&#xff08;Tween animation&#xff09;&#xff1a;对View进行平移、缩放、旋转和…

java学习(24):if..else...if

/任务3&#xff1a;if… else if…. else if….else语句 编写控制台java程序&#xff0c;模拟根据有多少钱买车的功能。 使用Scanner对象相关方法从控制台接收用户输入有多少钱&#xff0c; 单位为万。如果输入的钱数量大于等于100万&#xff0c;则输出“可以买奔驰” &#xf…

java学习(25):三目运算符

/任务4&#xff1a;三目运算符 编写控制台java程序&#xff0c; 使用Scanner对象相关方法从控制台接收两个整数&#xff0c;比较他们的大小/ import java.util.Scanner; public class test04{ public static void main(String[] args){ Scanner in new Scanner(System.in); Sys…

java学习(26):switch

/扩展练习&#xff1a; 任务5&#xff1a;switch语句 编写控制台Java程序&#xff0c;使用Scanner对象相关方法接收用户输入的年份和月份&#xff0c; 输出这个月有多少天。(提示:闰年计算方法为&#xff1a;能被4整除单不能被100整除&#xff1b;或者能被400整除就是闰年。)/ …

java学习(27):巩固练习

/1 使用Eclipse编写控制台应用程, 使用while循环在控制台打印10行10列的如下图形 □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ …

java学习(28):switch

/2使用Eclipse编写控制台应用程, 使用while循环输入如下图形 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 6…

java学习(29):大神指导(巩固练习)

/3使用Eclipse编写控制台应用程&#xff0c;使用do while循环处理从控制台接收不定数量的学生英语成绩&#xff0c; 统计不及格(小于60分)的成绩个数&#xff0c;大于等于90分的优秀成绩数量&#xff0c; 计算所有成绩的总分、平均分并输出相关统计结果到控制台/ import java.u…

java学习(30):巩固练习

/4使用Eclipse编写控制台应用程&#xff0c;利用for循环打印一个等腰三角图形/ public class test04 { public static void main(String[] args){ int x; int y; int z; for(x1;x<4;x)//外循环控制行数&#xff0c;总共四行 { for (y1;y<4-x ;y ) {//打印小星星前面的空格…

java学习(31):for循环

/5使用Eclipse编写控制台应用程&#xff0c;利用for循环计算输入的两个整数的最大公约数和最小公倍数。/ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner innew Scanner(System.in); System.out.println(“输入两个整数”);…

java学习(32):巩固练习

/6使用Eclipse编写控制台应用程&#xff0c;利用循环模仿一个用户的注册&#xff0c; 输入用户名和密码&#xff0c;判断用户输入的用户名是否长度位于4到16个字符之间&#xff0c; 如果不满足要求则应能够让用户重写输入&#xff0c;判断密码长度是否在6到16个字符之间 &#…

java学习(34):巩固练习

/1 使用Eclipse编写控制台应用程, 提示老师预计输入&#xff1f;个学生成绩&#xff0c;接收此数后&#xff0c;最为创建int类型数组的大小限制&#xff0c; 使用循环统计包含N个元素的数组&#xff0c;对包含的成绩进行统计&#xff0c;计算如下&#xff1a; 共接收成绩数量是…

artTemplate/template.js模板将时间戳格式化为正常的日期

1&#xff1a;引用<script type"text/javascript" src"../js/artTemplate/template.js"></script> 2&#xff1a;在正常渲染中引入方法 | timestamp: yyyy-MM-dd hh:mm:ss <div>开始时间<span>{{value.endTime | timestamp: yyyy-…

java学习(35):巩固练习

/2使用Eclipse编写控制台应用程,将给定的如下数组进行互换存储&#xff0c;互换原则如下所示 源整型数组 { 56,28,15,999,30,65,12,77} 互换后数组元素排列 {77, 12,15,999,30,65, 28, 56}/ public class test04 { public static void main(String[] args){ int[] arr{56,28,15…