コンテンツにスキップ

0153: テキストのエントロピー

問題

テキスト中の文字の偏りは、シャノンエントロピーで定量化できます。 文字 \(c\) の出現確率を \(p_c\)(出現回数をテキスト長で割った値)とするとき、エントロピーは

\[ H = -\sum_{c} p_c \log_2 p_c \]

で定義されます(単位はビット)。 すべての文字が同じ回数現れるとき \(H\) は最大になり、1種類の文字しか現れないとき 0 になります。

関数 entropy(text) を実装してください。 文字列 text の文字単位のシャノンエントロピーを float で返します。

制約

  • textstr です。文字は 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