我需要找到文本的熵。
我想使用香农熵。
所以我的输入是一本字典,包括一本书的文本文件(所有单词)及其频率。输出应该是所有单词的观察概率的熵。现在我的代码是这样的:
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
其中boe是由单词和频率组成的字典,我首先将其转换为字符串,以便代码起作用。但是,我不确定这是否是这种情况的正确熵。
答案 0 :(得分:3)
我假设你想要你的文字的单词(而不是字符)熵。此外,您将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)
为p
,函数中的返回值仅为freq / total
。