我正在使用 Vader SentimentAnalyzer 来获取极性分数。我之前使用了正/负/中性的概率分数,但我刚刚意识到“复合”分数,范围从 -1(最负)到 1(最正)将提供一个单一的极性度量。我想知道“复合”分数是如何计算的。是从 [pos, neu, neg] 向量计算的吗?
2 回答
VADER 算法将情绪分数输出到 4 类情绪https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L441:
neg
: 消极的neu
: 中性的pos
: 积极的compound
: 复合(即总分)
让我们看一下代码,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#L107normalize()
中定义为:
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#L217polarity_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/情绪/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
在 pos、neg 和neu 分数是使用_sift_sentiment_scores()
计算invidiual pos、neg 和neu 分数的方法计算的,该分数使用来自sentiment_valence()
没有总和的原始分数。
如果我们看一下这个alpha
数学,似乎归一化的输出相当不稳定(如果不受约束),取决于 的值alpha
:
alpha=0
:
alpha=15
:
alpha=50000
:
alpha=0.001
:
当它是负数时它会变得很时髦:
alpha=-10
:
alpha=-1,000,000
:
alpha=-1,000,000,000
:
github repo上的“About the Scoring”部分有描述。