SentiWordNet과 SentiSynset
SentiWordNet은 WordNet과 유사한 영어 어휘 사전입니다. 하지만 Synset별로 긍정 지수, 부정 지수, 객관성 지수를 할당해 준다는 차이가 있습니다. 여기에서 객관성 지수란 감성 지수와 반대되는 개념으로, 해당 단어가 얼마나 감성적 어조와 관계 없는지를 보여 주는 수치입니다.
그러면 SentiWordNet을 이용해 특정 단어의 감성 지수를 한번 확인해 볼게요. 먼저, sentiwordnet을 불러옵니다.
from nltk.corpus import wordnet as wn
from nltk.corpus import sentiwordnet as swn
nltk.download('wordnet')
nltk.download('sentiwordnet')
다음으로 Synset에 긍정, 부정, 객관성 지수를 할당한 SentiSynset을 구해 볼게요. happy라는 단어의 SentiSynset을 구한 다음에 Synset과 어떻게 차이가 있는지 비교해 보겠습니다.
print("wordnet-happy: ", wn.synsets('happy'))
print("sentiwordnet-happy: ", list(swn.senti_synsets('happy')))
WordNet의 Synset과 SentiWordNet의 SentiSynset의 결과가 거의 동일하게 나오네요. 하지만 SentiSynset에는 감성을 나타내는 지수가 할당돼 있다고 했죠? 해당 값들은 아래 함수들로 구할 수 있습니다.
- 긍정 감성 지수 함수: pos_score()
- 부정 감성 지수 함수: neg_score()
- 객관성 지수 함수: obj_score()
happy의 SentiSynset 중 첫번째 요소(happy.a.01)를 가지고 긍정, 부정, 객관성 지수를 구해 보겠습니다.
happy_sentisynsets = list(swn.senti_synsets('happy'))
pos_score = happy_sentisynsets[0].pos_score()
neg_score = happy_sentisynsets[0].neg_score()
obj_score = happy_sentisynsets[0].obj_score()
print(pos_score, neg_score, obj_score)
해당 단어의 최종 감성 지수로는 긍정 지수에서 부정 지수를 뺀 값이 사용됩니다. 즉 happy라는 단어의 감성 지수는 0.875가 되겠네요.
print(pos_score - neg_score)
긍정 지수, 부정 지수, 객관성 지수는 0과 1 사이의 값을 갖습니다. 그리고 긍정 지수에서 부정 지수를 뺀 감정 지수는 -1과 1 사이의 값을 갖습니다. -1에 가까우면 부정적인 의미를, 0에 가까우면 중립적인 의미를, 1에 가까우면 긍정적인 의미를 가진 단어로 해석할 수 있습니다.
특정 품사의 SentiSynset 찾기
단어는 품사에 따라 문맥상 의미가 달라진다고 했죠? 따라서 단어가 어떤 품사로 사용됐는지에 따라 감성 지수의 결과도 달라집니다.
그렇기 때문에 분석에 사용할 품사인 단어의 SentiSynset을 특정해서 찾는게 필요합니다. 해당 방법을 한번 알아볼게요. 실습으로 hard의 품사가 형용사일 때와 부사일 때의 감성 지수를 구하고 서로 비교해 보겠습니다.
가장 먼저 해당하는 품사의 Synset을 구해야 합니다.
adj_synsets = wn.synsets('hard', wn.ADJ)
adv_synsets = wn.synsets('hard', wn.ADV)
위와 같이 구하면 여러 Synset들이 결과로 나오는데요. 가장 보편적인 의미로 사용되는 첫번째 Synset을 가져와서 분석에 활용해 볼게요. 먼저 해당 값을 각 변수에 저장합니다.
adj_synset = adj_synsets[0]
adv_synset = adv_synsets[0]
다음, 해당 Synset의 '단어, 품사, 순번' 정보를 swn.senti_synset()의 파라미터로 넣어 줍니다. Synset의 '단어, 품사, 순번' 정보를 찾는 데에는 name() 함수가 사용됩니다.
adj_senti_synset = swn.senti_synset(adj_synset.name())
adv_senti_synset = swn.senti_synset(adv_synset.name())
print(adj_senti_synset)
print(adv_senti_synset)
형용사 hard는 부정적인 의미로 나오지만, 부사인 hard는 중립적인 의미네요. 이렇게 단어의 품사에 따라 감성 지수는 다르게 나옵니다. 때문에 SentiWordNet으로 감성 분석을 할 때에는 원하는 품사의 SentiSynset을 찾는 것이 중요합니다.
'Data Analysis > Natural Language Processing(NLP)' 카테고리의 다른 글
감성 분석 적용 (0) | 2023.07.05 |
---|---|
감성 지수 구하기 실습 (0) | 2023.07.05 |
WordNet (0) | 2023.07.04 |
감성 분석이란? (0) | 2023.06.18 |
패딩(Padding) (0) | 2023.06.18 |