如何找出英语的熵

时间:2012-03-07 15:40:07

标签: nlp entropy

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

1 个答案:

答案 0 :(得分:13)

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

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

  2. 迭代其中的字符并计算每个字符的出现频率

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

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

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

  6. <强>注意事项:

    • 这个孤立符号通常被称为 Shannon的英语的熵估计。 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))