加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:22:50 所属栏目:Python 来源:网络整理
导读:我正在阅读的论文 http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的比特作为评估文本生成计算机模型质量的测试指标,但没有参考它的计算方法.谷歌搜索,我真的找不到任何关于它的东西. 有谁知道如何计算它? Python最好,但伪代码或任何
我正在阅读的论文 http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的比特作为评估文本生成计算机模型质量的测试指标,但没有参考它的计算方法.谷歌搜索,我真的找不到任何关于它的东西.

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

解决方法

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

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

在第1节中,他们指出:

The goal of the paper is to demonstrate the power of large RNNs trained with the new Hessian-Free optimizer by applying them to the task of predicting the next character in a stream of text. This is an important problem because a better character-level language model could improve compression of text ?les (Rissanen & Langdon,1979) […]

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

算术编码基于生成语言模型运行,例如作者建立的语言模型.给定(可能是空的)字符序列,模型预测接下来可能出现的字符.人类也可以做到这一点,例如,给定输入序列你好w,我们可以猜测下一个字符的概率:o具有高概率(因为hello world是一个似是而非的延续),但是像h中的字符我在哪里可以找到..或者我在你好的温斯顿也有非零概率.因此,我们可以为这个特定的输入建立字符的概率分布,这正是作者的生成模型所做的.

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

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

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

关于即用型实现

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读