zoukankan      html  css  js  c++  java
  • 《信息检索导论》第五章总结


    一、索引压缩概述


    使用压缩的目的:

    (1)因为我们想要把尽量多的数据放入内存,因此压缩能够达到这个目的;

    (2)从磁盘到内存的传输时间会缩短;

    压缩分类:

    (1)无损压缩:压缩后的数据能还原全部信息;

    (2)有损压缩:压缩后会丢失一些信息;

    如果有损压缩后丢失的信息用户并不关心,则有损压缩也是可以接受的;


    二、Heaps定律


    通过整个文档集词条数来估计词项数目;

    主要思想:随着文档集增加,词项数目会增加,并且没有上限;

    M=kT^b;


    三、Zipf定律


    通过词项在文档集中的词频排名来估计词项之间的词频比例;

    如果词项A出现次数排名第一,词项B出现次数排名第二,词项C出现次数排名第三,则A出现次数是B出现次数的两倍,则A出现次数是C出现次数的1/3;


    四、词典压缩


    虽然与倒排记录表相比,词典的空间很小,但是为了能够把词典全部都放在内存中,我们必须要对其进行压缩;


    1.词项定长存储


    固定词项分配大小为20B;

    需要空间:M*(20+4+4)=M*28;

    缺点:

    (1)大部分单词都少于20B,浪费空间;

    (2)对于某几个大于20B的单词也不能存储;


    2.词项作为一个字符串


    将每个词项合并,并组成一个长字符串;

    对于每个词项增加一个指针;

    需要空间:M*(8+4+4+3)=M*19;

    相比之前,减少了1/3;

     

    3.按块存储


     将词典分组,分成n块,并且只有每个块的第一个词项有指针指向长字符串;

     在长字符串的每个词项前面添加一个词项长度;

     


    如果每个块大小为4,则每个块可以减少3个指针,加上4个字节表示4个词项的长度;

    因此需要空间:M(4+4+8)+M/4*3-M=M(16-1/4);

    相比之前又减少了15M/4;

    但是每个块越大,压缩率越大,则查询的时间就越长;

    因为一开始先通过二分搜索查找到词项所在块的入口,然后线性搜索找到词项;

    二叉树高度计算方法:

    已知n个结点,这些节点构成的二叉树的高度为:

     

    如果给定高度为n,则满二叉树的节点个数为

     


    4.前端编码


    对于3的改进方法是对于长字符串的编排进行改进;

    我们可以提取公共前缀;

    比如原来8automate9automatic,可以变成automat*1e.2ic;

    此方法能够减少存储空间;


    五、posting压缩


    一般来说词项出现频率高,则posting连续两个docID不会相差(gap)太远,比如:

    the --->   10000    10001    10002;

    如果我们通过记录两docID的间距,则会大大减少存储的空间;

    the --->    10000    1    1;

    压缩率越高,解压缩时间就越长;

    1.VB编码

    规则:

    (1)编码结果是整数个字节;

    (2)每个字节的第一位是延续位,如果为1,则表示是最后一个字节,否则,则表示不是最后一个字节;

    (3)每个字节的其他7位为正常编码位;

    举例:

    3    --->    1 0000011;

    注意:可变字节编码的解码消耗比起可变位编码消耗要低得多;

    一个字节用VB编码的最大间距是127;2^7-1;因为如果需要编码,则说明此数肯定不是0,因此从1开始;

    2.一元编码

    如果为数n,则n个1后面添一个0;

    举例:5  --->    111110

    3.gamma编码

    规则:

    (1)不记录最高位的1;比如12    --->    100;

    (2)编码分为长度和偏移(长度指的是偏移的长度)

    (3)长度采用一元编码,根据偏移的长度进行编码;

    (4)偏移采用(1)的编码;

    举例:12    --->   1110(长度),100(偏移);

    编码长度:2log(G)+1;

    总结:gamma编码能够压缩成原始posting的1/4,即如果原来posting为400M,则现在gamma编码后只需要100M即可;

    注意:

    (1)gamma编码永远是基数位;

    (2)前缀无关即解码结果唯一性;

    4.最优编码长度

    如果数G,则最优编码为log(G);

    举例:如果为12,则最优编码为4;

    5.Universal code

    和最优编码长度只相差常数个倍数的编码方式,gamma就是一个universal code;


    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求
    [Swift通天遁地]四、网络和线程-(3)线程组:使用DispatchGroup(调度组)对线程进行分组管理
    [Swift通天遁地]四、网络和线程-(2)通过BlockOperation实现线程的队列
    [Swift]LeetCode253.会议室 II $ Meeting Rooms II
    [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁
    [Swift]LeetCode252.会议室 $ Meeting Rooms
    [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector
    [Swift]LeetCode250.计数相同值子树的个数 $ Count Univalue Subtrees
    [Swift]LeetCode249.群组偏移字符串 $ Group Shifted Strings
    [Swift]LeetCode248.对称数 III $ Strobogrammatic Number III
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058355.html
Copyright © 2011-2022 走看看