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

时间:2013-07-22 21:40:05

标签: python algorithm machine-learning nlp entropy

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

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

3 个答案:

答案 0 :(得分:10)

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

换句话说,作者使用他们的生成语言模型,其中包括压缩,并假设得到的压缩方法的高有效性表明高基础生成模型的准确性

在第1节中,他们说:

  

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

Rissanen& Langdon(1979)的文章是arithmetic coding的原始描述,这是一种众所周知的文本压缩方法。

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

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

请注意,生成模型用于建立新概率分布的每个步骤。所以这是自适应算术编码的实例。

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


关于即用型实施

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

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

答案 1 :(得分:2)

In"使用递归神经网络生成序列"作者:Alex Graves(2014),它被给出为: -log p(X(t + 1)| y(t))在整个数据集上。在此X(t + 1)是正确的符号,y(t)是算法的输出。此条件概率是您分配给正确答案的概率。

因此,如果您的系统输出是概率性的,那么它就是平均预测能力。

答案 2 :(得分:0)

sys库有一个getsizeof()函数,这可能有用吗? http://docs.python.org/dev/library/sys