在Python NLTK中如何计算Vader的“化合物”极性分数?
nlp
nltk
python
18
0

我正在使用Vader SentimentAnalyzer来获取极性分数。之前,我使用概率分数来表示正/负/中性,但是我刚刚意识到“复合”分数范围从-1(最大负数)到1(最大正数)将提供极性的单个度量。我想知道“化合物”分数是如何计算的。是从[pos,neu,neg]向量计算得出的吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

github repo的 “关于评分”一节有描述。

收藏
评论

VADER算法将情感分数输出到4类情感https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L441

  • neg :阴性
  • neu :中性
  • pos :正
  • compound :复合(即总分)

我们来看一下代码,化合物的第一个实例在https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L421进行计算:

compound = normalize(sum_s)

https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L107中定义了normalize()函数:

def normalize(score, alpha=15):
    """
    Normalize the score to be between -1 and 1 using an alpha that
    approximates the max expected value
    """
    norm_score = score/math.sqrt((score*score) + alpha)
    return norm_score

因此,有一个超参数alpha

至于sum_s ,它是传递给score_valence()函数的情感参数的总和https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L413

而且,如果我们追溯此sentiment参数,我们会看到它是在https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L217调用polarity_scores()函数时计算得出的:

def polarity_scores(self, text):
    """
    Return a float for sentiment strength based on the input text.
    Positive values are positive valence, negative value are negative
    valence.
    """
    sentitext = SentiText(text)
    #text, words_and_emoticons, is_cap_diff = self.preprocess(text)

    sentiments = []
    words_and_emoticons = sentitext.words_and_emoticons
    for item in words_and_emoticons:
        valence = 0
        i = words_and_emoticons.index(item)
        if (i < len(words_and_emoticons) - 1 and item.lower() == "kind" and \
            words_and_emoticons[i+1].lower() == "of") or \
            item.lower() in BOOSTER_DICT:
            sentiments.append(valence)
            continue

        sentiments = self.sentiment_valence(valence, sentitext, item, i, sentiments)

    sentiments = self._but_check(words_and_emoticons, sentiments)

查看polarity_scores函数,它的作用是遍历整个SentiText词典,并检查基于规则的sentiment_valence()函数,以将价分分配给情感https://github.com/nltk/nltk/blob/开发/nltk/sentiment/vader.py#L243 ,请参阅http://comp.social.gatech.edu/papers/icwsm14.vader.hutto.pdf的 2.1.1节。

回到综合得分,我们看到:

  • compound分数是sum_s的归一化分数,并且
  • sum_s是基于某些启发式方法和情感词典(又称为情感强度)计算出的化合价和
  • 归一化分数只是sum_s除以其平方再加上增加归一化函数分母的alpha参数。

是从[pos,neu,neg]向量计算得出的吗?

不是真的=)

如果我们看一下score_valence函数https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L411 ,我们会看到复合分数是使用pos之前的sum_s计算的, neg和neu得分是使用_sift_sentiment_scores()计算的,该ss使用来自sentiment_valence()的原始得分sentiment_valence()不含总和_sift_sentiment_scores()来计算单个pos,neg和neu得分。


如果我们看一下这个alpha数学运算,则取决于alpha的值,归一化的输出似乎相当不稳定(如果不受约束的话):

alpha=0

在此处输入图片说明

alpha=15

在此处输入图片说明

alpha=50000

在此处输入图片说明

alpha=0.001

在此处输入图片说明

当它为负数时,它变得时髦:

alpha=-10

在此处输入图片说明

alpha=-1,000,000

在此处输入图片说明

alpha=-1,000,000,000

在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号