10

如何使用语言的孤立符号概率找出英语的熵?

4

1 回答 1

17

如果我们按照这个 SO answer中的方式定义“孤立符号概率” ,我们必须执行以下操作:

  1. 获取具有代表性的英文文本样本(可能是精心挑选的新闻文章、博客文章、一些科学文章和一些个人信件的语料库),尽可能大

  2. 遍历其字符并计算每个字符的出现频率

  3. 使用频率除以字符总数,作为每个字符概率的估计值

  4. 通过将其概率乘以相同概率的负对数来计算每个字符的平均长度(如果我们希望熵的单位为bit ,则为以 2 为底的对数)

  5. 取所有字符的所有平均长度的总和。这就是结果。

注意事项:

  • 这种孤立的符号不是通常所说的香农对英语的熵估计。Shannon 将熵基于条件 n-gram 概率,而不是孤立的符号,他在 1950 年的著名论文主要是关于如何确定最优 n。

  • 大多数试图估计英语熵的人会排除标点符号并将所有文本规范化为小写。

  • 以上假设符号被定义为英文的字符(或字母)。您可以对整个单词或其他文本单元执行类似的操作。

代码示例:

这是一些实现上述过程的 Python 代码。它将文本规范化为小写并排除标点符号和任何其他非字母、非空白字符。它假设您已经整理了一个有代表性的英语语料库并在 STDIN 上提供它(编码为 ASCII)。

import re
import sys
from math import log

# Function to compute the base-2 logarithm of a floating point number.
def log2(number):
    return log(number) / log(2)

# Function to normalise the text.
cleaner = re.compile('[^a-z]+')
def clean(text):
    return cleaner.sub(' ',text)

# Dictionary for letter counts
letter_frequency = {}

# Read and normalise input text
text = clean(sys.stdin.read().lower().strip())

# Count letter frequencies
for letter in text:
    if letter in letter_frequency:
        letter_frequency[letter] += 1
    else:
        letter_frequency[letter] = 1

# Calculate entropy
length_sum = 0.0
for letter in letter_frequency:
    probability = float(letter_frequency[letter]) / len(text)
    length_sum += probability * log2(probability)

# Output
sys.stdout.write('Entropy: %f bits per character\n' % (-length_sum))
于 2012-03-08T02:50:25.407 回答