信息检索笔记-索引压缩

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

相关文章

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识