信息检索笔记-索引压缩

2024-05-04 23:08

本文主要是介绍信息检索笔记-索引压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       第一章介绍了信息系统中的两个数据结构:词典及倒排记录表。本文将介绍对两个数据结构的各种压缩技术,这些技术对构建高效的IR系统很关键。

     索引压缩的优点:(1)第一能增加高速缓存利用率。在搜索系统中,如果某个关键字使用频繁,那么我们可以将他放在高速缓存中,这样搜索的时候只需要查一下高速缓存就行了(不要磁盘访问操作),找到之后解压缩就行了。如果索引小了就可以在高速缓存里面放更多的索引,当然就更快了。

   (2)压缩能够加快数据从磁盘到内存的速度。将未压缩的数据块传到内存时间大于压缩以后的传输时间+解压时间。即使会增加内存进行解压缩的开销,但是我们也可以通过加载一个小很多的压缩倒排表来减少I/O时间。

【注】解压算法一定要快。

     本文介绍的无损压缩,而大小写转换、词干还原和停用词剔除属于有损压缩。


词项统计特性

     Heaps定理,词项数目M、文档中词条的个数T有如下关系:

                

不同文档,k值略有不同。因为大小写转换和词干还原会降低词汇量的增长率,而允许加入数字和容忍拼写错误会增加该增长率。由上面的定理我们知道,随着文档数目的增加,词汇量会持续增加而不会达到一个稳定的值。

     Zipf定理:如果t1是文档计中出现最多的词项,而t2是文档集中出现第二多的词项,一次类推,那么排名第i多的词项的文档集频率与1/i成正比。如下:

                

随着词项出现次数的下降,那么出现的频率急剧下降。例如,出现第100多的词项出现频率就很小。


词典压缩

     影响信息检索最重要的一个因素是磁盘访问次数。而如果有部分词典存在磁盘上,那么在处理查询就需要更多的磁盘访问次数。因此词典压缩主要目的就是将词典放入内存,或者说是要把大部分词典放入内存,这样才能获得高的查询吞吐率。

     一般的存储方法(需要28B),400000个词项,需要400000*28=11.2MB,很显然这种方法很是浪费空间。

struct dictionary{char word[20];//20B存储单词int fileFrequency;//4B文档频率Type *reverseIndexPointer;//4B倒排记录指针
}

      下面针对这种浪费空间的方案提出一些改进方法。


(1)将词典存储在单一连续的单元中
     一个改进的办法是将所有的词项存在一个字符串中,而词典中存储一个定位指针。

char word[200000];//所有的单词都存在这个里面
struct dictionary{int index;//指向一个word里面的索引int fileFrequency;//4B文档频率Type *reverseIndexPointer;//4B倒排记录指针
}

(2)按块存储

     在单一连续的单元中,存储一些指针。然后只保留第一个词项的指针。


(3)公共前缀

     在上面的压缩方式里面,我们没有用到公共前缀。实际上按词典排序的单词一般都具有公共前缀,这样具有公共前缀的单词我们不需要存前缀,只需要用一个特殊字符来代替就行了。


倒排记录表的压缩

      倒排记录非常大,例如,800000篇文档,每篇文档200个词条,那么log(800000)=20,所以每个文档ID需要20b,则整个倒排记录表有800000*200*20/8=250MB。所以压缩很重要。

(1)可变字节码(VB)

      因为一些高频词汇出现的文档ID是连续的。例如,the:2888,2889,2890......。这样我们只需要存储第一个数,后面存偏移量就行了。

(2)r编码


后记

     下一篇是基于词项频率-文档频率的文档权重评分。请看:http://blog.csdn.net/lsjseu/article/details/12255761

这篇关于信息检索笔记-索引压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960296

相关文章

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

MySQL索引踩坑合集从入门到精通

《MySQL索引踩坑合集从入门到精通》本文详细介绍了MySQL索引的使用,包括索引的类型、创建、使用、优化技巧及最佳实践,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录mysql索引完整教程:从入门到入土(附实战踩坑指南)一、索引是什么?为什么需要它?1.1 什么

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

一文详解MySQL索引(六张图彻底搞懂)

《一文详解MySQL索引(六张图彻底搞懂)》MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,:本文主要介绍MySQL索引的相关资料,文中通过代码介绍的... 目录一、什么是索引?为什么需要索引?二、索引该用哪种数据结构?1. 哈希表2. 跳表3. 二叉排序树4.

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND