0153: テキストのエントロピー¶
問題¶
テキスト中の文字の偏りは、シャノンエントロピーで定量化できます。 文字 \(c\) の出現確率を \(p_c\)(出現回数をテキスト長で割った値)とするとき、エントロピーは
\[
H = -\sum_{c} p_c \log_2 p_c
\]
で定義されます(単位はビット)。 すべての文字が同じ回数現れるとき \(H\) は最大になり、1種類の文字しか現れないとき 0 になります。
関数 entropy(text) を実装してください。
文字列 text の文字単位のシャノンエントロピーを float で返します。
制約¶
textはstrです。文字は Unicode のコードポイント単位で数えます。- 空文字列に対しては
0.0を返します。 - 対数の底は 2 とします。
- 返り値が
-0.0にならないようにします。
例¶
>>> entropy("")
0.0
>>> entropy("aaaa")
0.0
>>> entropy("abab")
1.0
>>> round(entropy("abcabcabc"), 6)
1.584963
>>> round(entropy("aab"), 6)
0.918296
発展¶
文字単位のかわりに単語単位でエントロピーを求める関数を書き、同じ英文に対する両者の値を比べてください。 また、2文字組(バイグラム)のエントロピー \(H_2\) を求め、\(H_2 - H\)(直前の1文字を知ったときの条件付きエントロピー)が単独の \(H\) より小さくなることを、自然言語のテキストで観察してください。
参考¶
- 『Python Distilled』第1章「文字列」
- 『Python Distilled』第1章「辞書」
- 情報量 - Wikipedia