计算两个数据集的概率分布的熵 - 文本分析& C#中的情绪

时间:2011-09-27 02:16:36

标签: c# math statistics

我正在使用一个1.6M的推文语料库来训练一个天真的贝叶斯情绪引擎。

我有两个n-gram字典(Dictionary<string,int>,其中string是我的n-gram,int是我的语料库中n-gram的出现次数) 。第一个列表是从正面推文中提取的,第二个列表是从负面推文中提取的。在一篇关于这个主题的文章中,作者抛弃了常见的n-gram(即n-gram不强烈表示任何情绪,也没有表明句子的客观性。这样的n-gram在所有数据集中均匀出现)。我在概念上很清楚这一点,但他们提供的公式植根于数学,而不是代码,我无法破译我应该做的事情。

我花了几个小时在网上搜索如何做到这一点。我找到了搜索引擎的熵计算的例子,它通常计算字符串的熵,最常见的代码块是ShannonsEntropy。

我对这个领域也比较陌生,所以我敢肯定我的无知在这方面起了一定的作用,但我希望有人能帮助推动我朝着正确的方向发展。总结一下:

给出两个词典,PosDictionary&amp; NegDictionary,如何计算相同n-gram的熵?

Psuedo-code很好,我想它看起来像这样:

foreach(string myNGram in PosDictionary) {
    if(NegDictionary.ContainsKey(myNGram) {
        double result = CalculateEntropyOfNGram(myNGram);
        if(result > someThetaSuchAs0.80) {
            PosDictionary.Remove(myNGram);
            NegDictionary.Remove(myNGram);
        }
    }
}

认为这是我需要采取的过程。我不知道CalculateEntropyOfNGram函数是什么样的......

(编辑) Here is the link用于描述熵/突出过程的pdf(第5.3节)

1 个答案:

答案 0 :(得分:1)

本文中的等式(10)给出了定义。如果您在阅读等式时遇到问题,那么

就是一个简短的符号
    H(..) = -log(p(S1|g)) * p(S1|g)  - log(p(S2|g)) * p(S2|g) - ....