如何计算字符串的每个字符的位数?(BPC)

New*_*wmu 5 python algorithm nlp machine-learning entropy

我正在阅读的论文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的比特作为评估文本生成计算机模型质量的测试指标.没有参考如何计算.谷歌搜索,我真的找不到任何关于它的东西.

有谁知道如何计算它?Python最好,但伪代码或任何东西都有效.谢谢!

jog*_*pan 11

每个字符的位数是压缩方法性能的度量.它通过压缩字符串然后测量压缩表示总共取多少位,除以原始字符串中有多少个符号(即字符)来应用.压缩版本所占的每个字符的位数越少,压缩方法就越有效.

换句话说,作者使用他们的生成语言模型进行压缩,并假设所得压缩方法的高效性表明潜在生成模型的高准确性.

在第1节中,他们指出:

本文的目的是展示使用新的Hessian-Free优化器训练的大型RNN的功能,方法是将它们应用于预测文本流中下一个字符的任务.这是一个重要的问题,因为更好的字符级语言模型可以改善文本文件的压缩(Rissanen&Langdon,1979)[...]

Rissanen&Langdon(1979)的文章是算术编码的原始描述,这是一种众所周知的文本压缩方法.

算术编码基于生成语言模型运行,例如作者建立的语言模型.给定(可能是空的)字符序列,模型预测接下来可能出现的字符.人类也可以做到这一点,例如,给定输入序列hello w,我们可以猜测下一个字符的o概率:具有高概率(因为hello world是合理的延续),但是像hin hello where can I find..iin中的字符hello winston也具有非零概率.因此,我们可以为这个特定的输入建立字符的概率分布,这正是作者的生成模型所做的.

这与算术编码自然相符:给定已经编码的输入序列,下一个字符的比特序列由可能字符的概率分布确定:具有高概率的字符获得短比特序列,具有低概率的字符获得更长的序列.然后从输入读取下一个字符,并使用从概率分布确定的比特序列进行编码.如果语言模型是好的,那么将以高概率预测字符,因此比特序列将是短的.然后压缩继续下一个字符,再次使用输入到目前为止建立字符的概率分布,确定比特序列,然后读取实际的下一个字符并相应地对其进行编码.

注意,在每个步骤中使用生成模型来建立新的概率分布.所以这是自适应算术编码的一个例子.

在读取和编码所有输入之后,测量结果的总长度(以位为单位)并除以原始未压缩输入中的字符数.如果模型良好,它将以高精度预测字符,因此每个字符使用的位序列平均较短,因此每个字符的总位数将较低.


关于即用型实现

我不知道算术编码的实现,可以轻松集成您自己的生成语言模型.大多数实现都是在运行中构建自己的自适应模型,即它们在读取输入时调整字符频率表.

一个选项可能是从arcode开始.我查看了代码,似乎可以集成您自己的模型,尽管它不是很容易.该self._ranges成员代表语言模型; 基本上如累积字符频率的阵列,所以self._ranges[ord('d')]是小于的所有字符的总的相对频率d(即a,b,c如果我们只假定小写字母字符).您必须在每个输入字符后修改该数组,并将从生成模型获得的字符概率映射到字符频率范围.

  • 优秀的介绍和解释,谢谢! (2认同)