python中文本的熵

时间:2016-11-08 21:06:27

标签: python

我需要找到文本的熵。

我想使用香农熵。

所以我的输入是一本字典,包括一本书的文本文件(所有单词)及其频率。输出应该是所有单词的观察概率的熵。现在我的代码是这样的:

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是由单词和频率组成的字典,我首先将其转换为字符串,以便代码起作用。但是,我不确定这是否是这种情况的正确熵。

1 个答案:

答案 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