言語の孤立したシンボル確率を使用して英語のエントロピーを見つける方法は?
1 に答える
この SO answerで行われている方法で「孤立したシンボル確率」を定義する場合、次のことを行う必要があります。
英文の代表的なサンプル (ニュース記事、ブログ投稿、科学記事、個人的な手紙などを慎重に選択したコーパスなど) を可能な限り大きく取得します。
その文字を繰り返し、それぞれの出現頻度を数えます
頻度を総文字数で割った値を、各文字の確率の推定値として使用します
その確率に、同じ確率の負の対数 (エントロピーの単位をbitにしたい場合は底 2 の対数)を掛けて、各文字のビット単位の平均長を計算します。
すべての文字の平均の長さの合計を取ります。それが結果です。
警告:
この孤立したシンボルのエントロピーは、通常、英語のシャノンのエントロピー推定と呼ばれるものではありません。シャノンは、孤立したシンボルではなく、条件付き n グラム確率に基づいてエントロピーを作成しました。1950 年の有名な論文は、主に最適な n を決定する方法に関するものです。
英語のエントロピーを推定しようとするほとんどの人は、句読点を除外し、すべてのテキストを小文字に正規化します。
上記は、記号が英語の文字(または文字)として定義されていることを前提としています。単語全体、またはテキストの他の単位に対して同様のことを行うことができます。
コード例:
上記の手順を実装する Python コードを次に示します。テキストを小文字に正規化し、句読点やその他の非アルファベット、非空白文字を除外します。英語の代表的なコーパスをまとめて、それを (ASCII としてエンコードして) STDIN で提供することを前提としています。
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))