智能信息检索——可变字节码的编码和解码算法实现


《信息检索导论》部分实验python实现汇总请进入此博客查看。

1.实验目的

通过实验,掌握索引压缩的可变字节码VB的编码和解码算法。

2.实验任务与要求

检索系统中的倒排记录表所占空间巨大,因此索引压缩非常关键,可变字节码VB编码利用整数个字节对间距编码和解码,能够在时间和空间上达到一个非常好的平衡点。本实验通过编程实现这个VB的编码和解码过程。

3.实验说明书

⑴功能描述

通过编写编码辅助函数、编码函数、解码函数、间距计算函数和计算倒排记录表函数实现VB的编码和解码过程。当用户输入原始倒排记录表后,系统可以计算输出间距记录表、可变字节码,并通过解码函数对可变字节码进行解码得到原始倒排记录表。

⑵概要设计

分为编码模块与解码模块两个功能模块。

⑶详细设计

  • 总体流程图

图1 总体流程图

  • 编码模块

图2 编码模块

  • 解码模块

图3解码模块

⑷代码实现

  • 编码辅助函数

VBEncodeNumber是编码辅助函数,主要用于倒排记录表的切分与二进制的转换,通过bin函数实现十进制到二进制转换,然后通过字符串的replace函数实现可变字节码末位前缀与其它位的不同。

def VBEncodeNumber(n):
    by, byte = '', []
    while True:
        byte.insert(0, n % 128 + 128)
        if n < 128:
            break
        n = n // 128
    for i in range(len(byte)):
        if i < len(byte) - 1:
           by += bin(byte[i]).replace('0b1', '0') + ' '
        else:
           by += bin(byte[i]).replace('0b', '')
    return by
  • 编码函数

VBEncode实现倒排记录表的循环与VBEncodeNumber的调用。

def VBEncode(numbers):
    bytestream = []
    for n in numbers:
        byte = VBEncodeNumber(n)
        bytestream.append(byte)
    return bytestream
  • 解码函数

VBDecode是解码模块。用于通过可变字节码计算间距表,计算过程中需注意可变字节码末尾前缀的不同,计算结束后通过Countdaopai函数得到原始倒排记录表。

def VBDecode(bytestream):
    numbers = []
    n = 0
    for i in range(len(bytestream)):
        byte = bytestream[i].split(' ')
        l = len(byte)
        for j in range(l):
            if j < 1 - 1:
                by = int('0b1' + byte[j][1: len(byte[j])], 2)
            else:
                by = int('0b' + byte[j], 2)
            n = 128*n + by if by < 128 else 128*(n - 1) + by
        numbers.append(n)
        n = 0
    return numbers
  • 计算倒排记录表间距函数

Countdaopaidis是倒排记录表间距函数,用于计算原始倒排记录表的间距表。

def countdaopaidis(daopai):
    daopaidis = daopai.copy()
    for i in range(len(daopai)):
        if i == 0:
            daopaidis[i] = daopai[i]
        else:
            daopaidis[i] = daopai[i] - daopai[i - 1]
    return daopaidis
  • 计算倒排记录表函数

Countdaopai为计算倒排记录表函数,用于通过间距表计算得到倒排记录表。

def countdaopai(daopaidis):
    daopai = daopaidis.copy()
    for i in range(len(daopaidis)):
        daopai[i] = sum(daopaidis[0: i + 1])
    return daopai
  • 代码补全
daopai = [777, 17743, 294068, 31251336]
print('原始倒排记录表为:\n', daopai, '\n')
daopaidis = countdaopaidis(daopai)
print('间距记录表为:\n', daopaidis, '\n')
bytestream = VBEncode(daopaidis)     
print('可变字节码为:\n', bytestream, '\n')
daopaidis = VBDecode(bytestream)
daopai = countdaopai(daopaidis)
print('解码得到的倒排记录表为:\n', daopai, '\n')    

4.实验成果

运行程序,原始倒排记录表为[777,17743,294068,31251336],得到结果如下图。

图4 实验成果

通过结果图可以看出解码得到的倒排记录表与原始倒排记录表相同,观察可变字节码,最后一位首位数字为1,其它位首位数字为0。

5.程序调试过程

在程序调试过程中,设置原始倒排记录表为[121, 456, 728, 879]。

图5 调试过程

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值