VADER란?
VADER(Valence Aware Dictionary and sEntiment Reasoner)는 감성 분석을 위한 어휘 사전이자 알고리즘입니다. 앞에서 살펴본 SentiWordNet과의 큰 차이점은 일반적인 감성 어휘 사전의 규칙 외에도 축약형과 기호 등을 고려해 감성 지수를 추출할 수 있다는 점인데요. 그래서 주로 축약형 표현이나 특수 문자가 많이 사용된 소셜 미디어 텍스트를 분석할 때 자주 사용됩니다.
VADER는 아래 명령어로 설치할 수 있습니다.
pip install vaderSentiment
VADER 사용법
아래는 VADER를 사용해 감성 지수를 계산하는 코드입니다. VADER로 감성 분석을 하려면 SentimentIntensityAnalyzer를 생성한 뒤 polarity_scores() 함수를 호출하면 됩니다.
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
senti_analyzer = SentimentIntensityAnalyzer()
text1 = "This is a great movie!"
text2 = "This is a terrible movie!"
text3 = "This movie was just okay."
# VADER 감성 분석
senti_scores_text1 = senti_analyzer.polarity_scores(text1)
senti_scores_text2 = senti_analyzer.polarity_scores(text2)
senti_scores_text3 = senti_analyzer.polarity_scores(text3)
SentiWordNet은 단어의 감성 지수만 확인할 수 있었죠? 그래서 코퍼스의 감성 지수도 각 단어의 감성 지수 합으로 계산했었는데요.
VADER는 단어, 문장, 여러 문장으로 이루어진 코퍼스 등으로 바로 감성 지수를 계산할 수 있습니다. 심지어 코퍼스를 단어 단위로 토큰화해 파라미터로 전달할 필요 없이, VADER 내부 동작에서 필요한 토큰화와 감성 지수 추출 작업을 알아서 해 줍니다. 그래서 그냥 감성 지수 계산을 하고 싶은 코퍼스를 polarity_scores()의 파라미터로 전달하기만 하면 결과가 나옵니다. 정말 간단하죠?
polarity_scores()는 결과로 딕셔너리 형태의 점수들을 반환하는데, 각 키에 대한 설명은 아래와 같습니다.
- neg: 부정 감성 지수
- neu: 중립적인 감성 지수
- pos: 긍정 감성 지수
- compound: 위 세 지수를 적절하게 조합하여 -1 과 1 사이의 감성 지수를 표현한 값
SentiWordNet을 사용할 때에는 긍정 지수에서 부정 지수를 빼서 감성 지수를 별도로 계산해야 했는데요. VADER는 그 작업도 할 필요가 없습니다. VADER 내부에서 동작하는 감성 지수 계산 알고리즘을 통해 알아서 compound값을 제공하기 때문이죠. 해당 값이 -1에 가까우면 부정적인 의미이고, 1에 가까우면 긍정적인 의미로 해석할 수 있습니다
그러면, 위에서 실행한 결과를 따로 확인해 볼까요?
print(senti_scores_text1)
print(senti_scores_text2)
print(senti_scores_text3)
각 문장의 부정 감성 지수, 중립 감성 지수, 긍정 감성 지수 그리고 compound 점수가 잘 출력됩니다.
VADER 감성 분석
SentiWordNet 감성 분석 레슨에서 진행했던 데이터로 VADER 감성 분석도 진행해 볼게요. 먼저 준비된 데이터 프레임은 다음과 같습니다.
df[['review']]
다음으로 df['review']에 적용할 감성 분석 함수인 vader_sentiment() 함수를 만들어 보겠습니다.
def vader_sentiment(text):
analyzer = SentimentIntensityAnalyzer()
# VADER 감성 분석
senti_score = analyzer.polarity_scores(text)['compound']
return senti_score
해당 함수를 df['review'] 에 적용해 보겠습니다.
df['vader_sentiment'] = df['review'].apply(vader_sentiment)
df[['review', 'swn_sentiment', 'vader_sentiment']]
감성 지수는 차이가 조금 있지만 해당 리뷰가 긍정인지, 부정인지 여부는 거의 비슷하게 나왔습니다.
VADER와 관련된 더 자세한 내용은 공식 문서를 통해 확인할 수 있습니다.
출처 코드잇
'Data Analysis > Natural Language Processing(NLP)' 카테고리의 다른 글
띄어쓰기 교정 (0) | 2023.07.05 |
---|---|
VADER 감성 분석 실습 (0) | 2023.07.05 |
SentiWordnet 감성 분석 실습 (0) | 2023.07.05 |
감성 분석 결과 확인 (0) | 2023.07.05 |
감성 분석 적용 (0) | 2023.07.05 |