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?
Odpowiedz
Odszedł wyjścia algorytm wyniki sentyment do 4 klasy nastrojów https://github.com/nltk/nltk/blob/develop/nltk/sentiment/vader.py#L441:
neg
: Negatywnaneu
: Neutralnypos
: Pozytywnecompound
: 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 wyniksum_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
:
alpha=15
:
alpha=50000
:
alpha=0.001
:
Robi Funky gdy jest ujemny:
alpha=-10
:
alpha=-1,000,000
:
alpha=-1,000,000,000
:
Bardzo dobre wyjaśnienie, wydaje się, że brakuje części sqrt na wykresach i equatio ns –
- 1. W jaki sposób oblicza się em?
- 2. W jaki sposób oblicza się scikit-learn GridSearchCV best_score_?
- 3. W jaki sposób Matlab oblicza linie konturu?
- 4. W jaki sposób Java oblicza liczby ujemne?
- 5. Jaki jest domyślny fragment pakietu narzędzi NLTK w Pythonie?
- 6. W jaki sposób operator size2 C++ oblicza rozmiar?
- 7. W jaki sposób Amazon RDS oblicza wskaźnik I/O?
- 8. W jaki sposób 32-bitowa maszyna oblicza podwójną precyzję numer
- 9. W jaki sposób Android oblicza pamięć podręczną i rozmiar danych?
- 10. W jaki sposób MediaWiki oblicza ścieżkę do pliku?
- 11. W jaki sposób ** zostało zaimplementowane w Pythonie?
- 12. Znajdź rymowanie za pomocą NLTK w Pythonie
- 13. W jaki sposób usługa zwraca wynik do działania
- 14. W jaki sposób zwraca wynik innej funkcji niż drukowanie?
- 15. W Pythonie, w jaki sposób uzyskać bieżącą ramkę?
- 16. W jaki sposób weryfikujesz podpis RSA SHA1 w Pythonie?
- 17. W jaki sposób wątek.Thread dać resztę jego kwantowej w Pythonie?
- 18. Jak oblicza się md5Hash dla com.google.appengine.api.blobstore.BlobInfo
- 19. W jaki sposób weryfikujesz interfejsy oparte na kaczkach w pythonie?
- 20. W jaki sposób można zaimplementować rekurencyjne wyrażenie regularne w pythonie?
- 21. W jaki sposób Unicode jest wewnętrznie reprezentowany w Pythonie?
- 22. W jaki sposób rozpakowujesz bardzo duże pliki w pythonie?
- 23. W Pythonie 2.5, w jaki sposób mogę zabić podproces?
- 24. Orange vs NLTK dla klasyfikacji treści w Pythonie
- 25. Używanie własnego korpusu do klasyfikacji kategorii w Pythonie NLTK
- 26. W jaki sposób implementuje się fractions.limit_denominator python?
- 27. W jaki sposób metody rozszerzeń łączą się
- 28. W jaki sposób implementuje się Wami Recorder?
- 29. W jaki sposób używa się layoutIfNeeded?
- 30. W jaki sposób wdraża się std :: tuple?
Kod jest w: https://github.com/nltk/nltk/blob/develop/ nltk/sentiment/vader.py – alvas