在概率论和信息论中,两个随机变量的互信息或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息是点间互信息(PMI)的期望值。互信息最常用的单位是bit。
一、互信息的定义
直观上,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 X 和 Y 相互独立,则知道 X 不对 Y提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果 X 是 Y 的一个确定性函数,且 Y 也是 X 的一个确定性函数,那么传递的所有信息被 X 和 Y 共享:知道 X 决定 Y 的值,反之亦然。因此,在此情形互信息与 Y(或 X)单独包含的不确定度相同,称作 Y(或 X)的熵。而且,这个互信息与 X的熵和 Y 的熵相同。(这种情形的一个非常特殊的情况是当 X 和 Y 为相同随机变量时。)详见维基百科:https://en.wikipedia.org/wiki/Mutual_information
二、代码
'''
def compute_mi(self, word_dict, co_dict, sum_tf):
def compute_mi(p1, p2, p12):
return math.log2(p12) - math.log2(p1) - math.log2(p2)
def build_dict(words):
return {item[0]:item[1] for item in collections.Counter(words).most_common()}
mis_dict = dict()
for word, co_words in co_dict.items():
co_word_dict = build_dict(co_words.split('@'))
mi_dict = {}
for co_word, co_tf in co_word_dict.items():
if co_word == word:
continue
p1 = word_dict[word]/sum_tf
p2 = word_dict[co_word]/sum_tf
p12 = co_tf/sum_tf
mi = compute_mi(p1, p2, p12)
mi_dict[co_word] = mi
mi_dict = sorted(mi_dict.items(), key = lambda asd:asd[1], reverse= True)
mis_dict[word] = mi_dict
'''
三、效果
以2W个文档/句子作为训练语料,进行训练,得到结果举例如下:
责任
Top10
倒查@14.352077919813077,
追究@14.214574396063142,
上查@14.140573814619366,
螺丝@14.140573814619366,
拧紧@13.98010914242612,
法律责任@13.799536896784298,
党委政府@13.700001223233384,
当事人@13.593086019316871,
党纪@13.384499397505454,
领会
Top10
原文@16.93704042053423,
党章@16.767115419091922,
准确@16.089043513979284,
差异化@15.989507840428368,
精读@15.76711541909192,
要义@15.76711541909192,
一把@15.252542246262163,
主线@14.76711541909192,
精髓@14.76711541909192,
做实@14.76711541909192,
钥匙@14.352077919813077,