nlp - 如何找出英语的熵

标签 nlp entropy

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

最佳答案

如果我们按照this SO answer的方式定义“隔离符号概率”,则必须执行以下操作:

  • 获取尽可能多的
  • 英文代表性示例(也许是新闻文章,博客文章,一些科学文章和一些个人信件的精心选择的语料库)
  • 遍历其字符并计算每个字符的出现频率
  • 使用频率除以字符总数,作为每个字符概率的估计值
  • 通过将每个字符的概率与相同概率的负对数相乘(以2为底的对数,如果我们希望熵单位为bit)来计算每个字符的平均长度。
  • 取所有字符的所有平均长度的总和。结果就是这样。

  • 警告:
  • 这个孤立的符号熵是而不是,通常称为英语的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))
    

    关于nlp - 如何找出英语的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604460/

    相关文章:

    java - 快速将文本拆分成句子(Java)

    nlp - 为自定义语言设计 TTS(文本转语音)系统的工具包?

    nlp - "pre-built"用于潜在语义分析的矩阵

    java - 需要统计自然语言处理的资源

    c++ - C++ 中的密码强度

    nlp - 如何理解 Bert 模型中返回的隐藏状态?(拥抱脸转换器)

    algorithm - 有哪些快速的熵计算算法

    linux - 为什么ubuntu上的/dev/random生成数据比debian慢?

    c++ - 如何确定二进制字符串的统计随机性?

    python - TensorFlow 有内置 KL 散度损失函数吗?