gpt4 book ai didi

python - Python NLTK 中的 Vader 'compound' 极性分数是如何计算的?

转载 作者:IT老高 更新时间:2023-10-28 21:05:58 31 4
gpt4 key购买 nike

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

最佳答案

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

  • 否定:否定
  • neu:中性
  • pos:正面
  • compound:复合(即总分)

让我们看一下代码,compound 的第一个实例位于 https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L421 ,它在哪里计算:

compound = normalize(sum_s)

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

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/develop/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 ,我们看到复合分数是用 sum_s 计算的,然后使用 _sift_sentiment_scores() 计算单个 pos、neg 和 neu 分数来计算 pos、neg 和 neu 分数使用来自 sentiment_valence() 的原始分数,没有总和。


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

alpha=0:

enter image description here

alpha=15:

enter image description here

alpha=50000:

enter image description here

alpha=0.001:

enter image description here

当它是负面的时候会变得很时髦:

alpha=-10:

enter image description here

alpha=-1,000,000:

enter image description here

alpha=-1,000,000,000:

enter image description here

关于python - Python NLTK 中的 Vader 'compound' 极性分数是如何计算的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325980/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com