2016-11-08 1 views
-3

私はテキストのエントロピーを見つける必要があります。エントロピー(テキストのためのpython)

私はシャノンエントロピーを使いたいです。

私の入力は、本のテキスト文書(すべての単語)とその頻度で構成される辞書です。出力は、すべての単語の観測確率のエントロピーでなければなりません。 BOEは、言葉と周波数からなる辞書で、コードが動作するように、私は最初の文字列に変換しtransfrom

import math 

def shannon(string): 
     prob = [ float(string.count(c))/len(string) for c in dict.fromkeys(list(string)) ] 
     entropy = sum([ p * math.log(p)/math.log(2.0) for p in prob ]) 
     return entropy 

:今、私のコードは次のようです。しかし、これがこの場合の正しいエントロピーであるかどうかはわかりません。

+1

あなたの関数は 'word_map'を使用しません。 –

+0

すべての操作を何度もやり直したり元に戻したりします。例えば。 'boe'は' dict'です。それを 'str'に変換し、' list'に、 'dict'に戻します。どうしたの? –

+1

私は、あなたが本当にやろうとしていること、あなたの入力が何であるか、どのようにそれらを使いたいのかについていくつか注意深く考える必要があると思います。その後、(再び注意深く)あなたの考えをコードに書いてください。あなたがここに持っているのは、境界線のようなぎこちなさです。 –

答えて

2

私はあなたのテキストの(文字ではなく)エントロピーを求めています。また、テキスト中の単語の総数で割った単語の頻度であることをP(w)を定義していること:

from math import log2 

def shannon(boe): 
    total = sum(boe.values()) 
    return sum(freq/total * log2(total/freq) for freq in boe.values()) 

shannon(boe) 

確率は、総単語数が必要です。あなたが外部でそれを渡さないなら、あなたはすべての頻度の合計としてそれを得ることができます:sum(boe.values())。関数の戻り値はp * log2(1/p)であり、pfreq/totalです。

関連する問題