互信息(Mutual Information)实现公文词组搭配功能

互信息(Mutual Information)实现公文词组搭配功能_第1张图片
火狐截图_2019-01-09T14-39-41.479Z.png

在概率论和信息论中,两个随机变量的 互信息转移信息(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,

你可能感兴趣的:(互信息(Mutual Information)实现公文词组搭配功能)