2016-10-30 21 views
5

Używam Vader SentimentAnalyzer, aby uzyskać wyniki dotyczące polaryzacji. Używałem wyników prawdopodobieństwa dla pozytywnego/negatywnego/neutralnego przedtem, ale właśnie zrozumiałem, że wynik "złożony", w zakresie od -1 (najbardziej neg) do 1 (najbardziej poz.) Zapewniłby pojedynczą miarę polaryzacji. Zastanawiam się, jak obliczono wynik "złożony". Czy to jest obliczane z wektora [pos, neu, neg]?W jaki sposób wynik polaryzacji "złożonej" Vadera oblicza się w Pythonie NLTK?

+0

Kod jest w: https://github.com/nltk/nltk/blob/develop/ nltk/sentiment/vader.py – alvas

Odpowiedz

24

Odszedł wyjścia algorytm wyniki sentyment do 4 klasy nastrojów https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L441:

  • neg: Negatywna
  • neu: Neutralny
  • pos: Pozytywne
  • compound: Związek (tj zagregowany wynik)

Chodźmy za pomocą kodu, pierwsza instancja związku jest https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L421, gdzie oblicza:

compound = normalize(sum_s) 

Funkcja normalize() jest zdefiniowany jako taki w 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 

Więc jest hiper-parametr alpha.

chodzi o sum_s, jest to suma argumentów nastrojów przekazanych do score_valence() funkcji https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L413

A jeśli prześledzić ten sentiment argumentu, widzimy, że jest to obliczone przy wywołaniu funkcji polarity_scores() na https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L217:

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) 

Patrząc na funkcję polarity_scores, co robi jest iterację całego leksykonu SentiText i kontroli z reguły oparte sentiment_valence() celu przypisania th e wartościowość wynik do nastrojów https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L243, patrz punkt 2.1.1 http://comp.social.gatech.edu/papers/icwsm14.vader.hutto.pdf

Więc wracając do wyniku złożonego, widzimy, że:

  • wynik compound jest znormalizowany wynik sum_s i
  • sum_s to suma wartościowości obliczona na podstawie niektórych heurystyk i leksykonu sentymentów (aka. Sentyment Intensity) i
  • znormalizowany wynik to po prostu sum_s podzielony przez jego kwadrat plus parametr alfa, który zwiększa mianownik funkcji normalizacji.

Czy to oblicza się z [pos, Neu, neg] wektora?

Nie bardzo =)

Jeśli spojrzymy na score_valence funkcji https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L411, widzimy, że wynik związek jest obliczane z sum_s przed POS, NEG i neu wyniki są obliczane przy użyciu _sift_sentiment_scores() który oblicza invidiual pos, neg i neu score przy użyciu surowych wyników od sentiment_valence() bez sumy.


Jeśli przyjrzeć się tej alpha mathemagic wydaje wyjście normalizacji jest dość niestabilny (jeśli nie jest nieograniczona), w zależności od wartości 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

Robi Funky gdy jest ujemny:

alpha=-10:

enter image description here

alpha=-1,000,000:

enter image description here

alpha=-1,000,000,000:

enter image description here

+0

Bardzo dobre wyjaśnienie, wydaje się, że brakuje części sqrt na wykresach i equatio ns –

Powiązane problemy