C# 计算两个数据集的概率分布熵-文本分析和;C语言中的情感#

C# 计算两个数据集的概率分布熵-文本分析和;C语言中的情感#,c#,math,statistics,C#,Math,Statistics,我正在使用160万推特语料库来训练一个朴素的贝叶斯情感引擎 我有两个n-gram字典(Dictionary,其中string是我的n-gram,而int是我语料库中n-gram出现的次数)。第一个列表从正面推文中提取,第二个列表从负面推文中提取。在一篇关于这一主题的文章中,作者放弃了常见的n-图(即,不强烈表示任何情感或句子客观性的n-图。此类n-图在所有数据集中均匀出现)。我在概念上非常理解这一点,但他们提供的公式植根于数学,而不是代码,我无法解释我应该做什么 我花了几个小时在网上搜索如何做到

我正在使用160万推特语料库来训练一个朴素的贝叶斯情感引擎

我有两个n-gram字典(
Dictionary
,其中
string
是我的n-gram,而
int
是我语料库中n-gram出现的次数)。第一个列表从正面推文中提取,第二个列表从负面推文中提取。在一篇关于这一主题的文章中,作者放弃了常见的n-图(即,不强烈表示任何情感或句子客观性的n-图。此类n-图在所有数据集中均匀出现)。我在概念上非常理解这一点,但他们提供的公式植根于数学,而不是代码,我无法解释我应该做什么

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

我对这个领域也比较陌生,所以我确信我的无知在其中扮演了一个角色,但我希望有人能帮助我朝着正确的方向前进。总结如下:

给定两个字典,
PosDictionary
&
NegDictionary
,如何计算相同n-gram的熵

Psuedo代码很好,我想它看起来像这样:

foreach(string myNGram in PosDictionary) {
    if(NegDictionary.ContainsKey(myNGram) {
        double result = CalculateEntropyOfNGram(myNGram);
        if(result > someThetaSuchAs0.80) {
            PosDictionary.Remove(myNGram);
            NegDictionary.Remove(myNGram);
        }
    }
}
我想这就是我需要采取的步骤。我不知道的是,
calculateEntropyFnGram
函数是什么样子的

(编辑) 对于用于描述熵/显著性过程的pdf(第5.3节)

本文中的等式(10)给出了定义。如果你在阅读方程式时遇到问题,这是一个简短的符号

    H(..) = -log(p(S1|g)) * p(S1|g)  - log(p(S2|g)) * p(S2|g) - ....
文中等式(10)给出了定义。如果你在阅读方程式时遇到问题,这是一个简短的符号

    H(..) = -log(p(S1|g)) * p(S1|g)  - log(p(S2|g)) * p(S2|g) - ....

你能给一个到出版物的链接吗?你能给一个到出版物的链接吗?那就是说“S1给定g的概率”——比如,给定一个n-gram,它在我的S1列表中的概率是多少?所以类似于(我的内存计数)/(我的内存计数+总内存计数)?我没有读足够深的文章来知道S1和g是什么。但你必须根据计数来估计概率。类似于“p(g)=ng/N”的东西,如果ng计算g,N是您所指集合的大小。这正是我所需要的。谢谢那么说“S1给定g的概率”——比如,给定一个n-gram,它在我的S1列表中的概率是多少?所以类似于(我的内存计数)/(我的内存计数+总内存计数)?我没有读足够深的文章来知道S1和g是什么。但你必须根据计数来估计概率。类似于“p(g)=ng/N”的东西,如果ng计算g,N是您所指集合的大小。这正是我所需要的。谢谢