jog*_*pan 13
如果我们按照这个SO答案中的方式定义"孤立符号概率" ,我们必须执行以下操作:
获取有代表性的英文文本样本(可能是精心挑选的新闻文章,博客文章,一些科学文章和一些个人信件),尽可能大
迭代其字符并计算每个字符的出现频率
使用频率除以字符总数作为每个字符概率的估计值
通过将其概率乘以相同概率的负对数来计算每个字符的平均位长(如果我们希望熵单位为位,则为2的对数)
取所有字符的所有平均长度的总和.结果就是这样.
注意事项:
这种孤立符号熵不是通常被称为香农的英语熵估计.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))
Run Code Online (Sandbox Code Playgroud)