감정 분석은 문서의 주관적인 감성/의견/감정/기분 등을 파악하기 위한 방법으로 소셜 미디어, 여론조사, 온라인 리뷰, 피드백 등 다양한 분야에서 활용되고 있다. 감성 분석은 문서 내 텍스트가 나타내는 여러 가지 주관적인 단어와 문맥을 기반으로 감성 수치를 계산하는 방법을 이용한다. 이러한 감성 분석은 머신러닝 관점에서 지도 학습과 비지도 학습 방식으로 나눌 수 있다.
1. 지도학습은 학습 데이터와 타깃 레이블 값을 기반으로 감성 분석 학습을 수행한 뒤 이를 기반으로 다른 데이터의 감성 분석을 예측하는 방법으로 일반적인 텍스트 기반의 분류와 거의 동일
2. 비지도학습은 'Lexicon'이라는 일종의 감성 어휘 사전을 이용한다. Lexicon은 감성 분석을 위한 용어와 문맥에 대한 다양한 정보를 가지고 있으며, 이를 이용해 문서의 긍정적, 부정적 감성 여부를 판단한다.
지도학습 기반 감성 분석 - IMDB 영화평
HTML 형식에서 추출해 <br/> 태그가 여전히 존재한다. <br/> 문자열은 피처로 만들 필요가 없기 때문에 삭제해야 한다. pandas의 DataFrame/Series는 문자열 연산을 지원하기 위해 str 속성을 이용한다. DataFrame/Series 객체에서 str 적용하면 다양한 문자열 연산을 수행할 수 있다. replace()를 str에 적용해 <br/>태그를 모두 공백으로 바꾸었다. 또한 영어가 아닌 특수문자/숫자 역시 감성 분석을 위한 피처로는 별 의미가 없다 따라서 이들도 모두 공란으로 전환해야 한다. 숫자/특수문자를 찾고 이를 변환하는 것은 정규 표현식을 이용했다. 파이썬의 re 모듈은 편리하게 정규 표현식을 지원한다. 정규 표현식 [^a-zA-Z]의 의미는 영어 대/소문자가 아닌 모든 문자를 찾는 것이다. re.sub("[^a-zA-Z]"," ",x)는 영어 대/소문자가 아닌 모든 문자를 찾아서 공란으로 변경한다.
감상평 텍스트를 피처 벡터화한 후에 ML분류 알고리즘을 적용해 예측 성능을 측정해보았다.
TF-IDF 기반 피처 벡터화의 예측 성능이 조금 더 나은 것을 알 수 있다.
비지도학습 기반 감성 분석
비지도 감성 분석은 Lexicon을 기반으로 하는 것이다. 위의 지도 감성 분석은 데이터 세트가 레이블 값을 가지고 있었다. 하지만 많은 감성 분석용 데이터는 이러한 결정된 레이블 값을 가지고 있지 않다. 이러한 경우 Lexicon은 유용하게 사용될 수 있다.
Lexicon은 일반적으로 어휘집을 의미하지만 여기서는 주로 감성만을 분석하기 위해 지원하는 감성 어휘 사전이다. 감성 사전은 긍정 감성 또는 부정 감성의 정도를 의미하는 수치를 가지고 있으며 이를 감성 지수(Polarity score)라고 한다. 이 감성 지수는 단어의 위치나 주변 단어, 문맥, POS(Part Of Speech) 등을 참고해 결정된다. 이러한 감성 사전을 구현한 대표격은 NLTK 패키지이다. NLTK는 많은 서브 모듈을 가지고 있으며 그중에는 감성 사전인 Lexicon 모듈도 포함되어있다.
WordNet은 NLP에서 제공하는 방대한 영어 어휘 사전이다. WordNet은 단순한 어휘 사전이 아닌 semantic 분석을 제공하는 어휘 사전이다 시맨틱이란 간단히 말하면 '문맥상 의미'이다. '말'이라는 것은 상황, 문맥, 화자의 몸짓, 어조에 따라 다르게 해석될 수 있다. 즉, 동일한 단어나 문장이라도 다른 환경과 문맥에서는 다르게 표현되거나 이해될 수 있다. 언어학에서 이러한 시맨틱을 표현하기 위해서 여러 가지 규칙을 정해왔으며, NLP패키지는 시맨틱을 프로그램적으로 인터페이스 할 수 있는 다양한 방법을 제공한다.
WordNet은 다양한 상황에서 같은 어휘라도 다르게 사용되는 어휘의 시맨틱 정보를 제공하며, 이를 위해 각각의 품사로 구성된 개별 단어를 Synset이라는 개념을 이용해 표현한다. Synset은 단순한 하나의 단어가 아니라 그 단어가 가지는 문맥, 시맨틱 정보를 제공하는 WordNet의 핵심 개념이다. NLTK의 감성 사전이 감성에 대한 사전 역할을 제공한 장점은 있지만 아쉽게도 예측 성능은 그리 좋지 못하다는 단점이 있다. 그래서 실제 업무 적용은 NLTK가 아닌 다른 감성 사전을 적용하는 것이 일반적이다.
1. SentiWordNet: NLTK패키지의 WordNet과 유사하게 감성 단어 전용의 WordNet을 구현한 것이다. WordNet의 Synset 개념을 감성 분석에 적용한 것이다. WordNet의 Synset별로 3가지 감성 점수를 할당한다. 긍정감성, 부정감성, 객관성 지수가 바로 그 셋이다. 객관성 지수는 긍정/부정 감성 지수와 완전히 반대되는 개념으로 단어가 감성과 관계없이 얼마나 객관적인지를 수치로 나타낸 것이다. 문장별로 단어들의 긍정 감성 지수와 부정 감성 지수를 합산하여 최종 감성 지수를 계산하고 이에 기반해 감성이 긍정인지 부정인지 결정한다.
2. VADER: 주로 소셜 미디어의 텍스트에 대한 감성 분석을 제공하기 위한 패키지이다. 뛰어난 감성 분석 결과를 제공하며, 비교적 빠른 수행 시간을 보장해 대용량 텍스트 데이터에 잘 사용되는 패키지이다.
3. Pattern: 예측 성능 측면에서 가장 주목받는 패키지이다.
synsets() 호출 시 반환되는 것은 여러 개의 Synset객체를 가지는 리스트이다. 위를 보면 총 18개의 서로 다른 Semantic을 가지는 synset 객체가 반환되었다. Synset('present.n.01')와 같이 Synset 객체의 파라미터 'present.n.01'은 POS 태그를 나타낸다. 'present.n.01'에서 present는 의미, n은 품사, 01은 present가 명사로서 가지는 의미가 여러 가지 있어서 이를 구분하는 index이다.
WordNet은 어떤 어휘와 다른 어휘 간의 관계를 유사도로 나타낼 수 있다. synset 객체는 단어 간의 유사도를 나타내기 위해서 path_similarity() 메서드를 제공한다. 이를 활용해서 단어들의 상호 유사도를 파악해보았다.
SentiWordNet은 WordNet의 synset과 유사한 Senti_Synset 클래스를 가지고 있다. SentiWordNet 모듈의 senti_synsets()은 WordNet 모듈이기 때문에 synsets()와 비숫허게 Senti_Synset 클래스를 리스트 형태로 반환한다.
Sentiment 객체는 단어의 감성을 나타내는 감성 지수와 객관성을 나타내는 객관성 지수를 가지고 있다. 감성 지수는 다시 긍정 감성 지수와 부정 감성 지구로 나뉜다. 어떤 단어가 전혀 감성적이지 않으면 객관성 지수는 1이되고, 감성 지수는 모두 0이 된다. 아래는 father라는 단어와 fabulous라는 두 개 단어의 감성 지수와 객관성 지수를 나타낸다.
IMDB 영화 감상평 감성 분석을 SentiWordNet Lexicon 기반으로 분석을 해보았다. 대략적인 프로세스는 아래와 같다.
1. 문서를 문장 단위로 분해
2. 다시 문장을 단어 단위로 토큰화하고 품사 태깅
3. 품사 태깅된 단어 기반으로 synset 객체와 senti_synset 객체를 생성
4. Senti_synset에서 긍정 감성/부정 감성 지수를 구하고 이를 모두 합산해 특정 임계치 값 이상일 때 긍정 감성으로 그렇지 않을 때는 부정 감성으로 결정
SentiWordNet을 이용하기 위해서 WordNet을 이용해 문서를 다시 단어로 토큰화한 뒤 어근 추출과 품사 태깅을 적용해야 한다. 먼저 품사 태깅을 수행하는 내부 함수를 생성해 보았다.
딱히 만족스러운 결과가 아닌 것을 알 수 있다.
VADER를 이용한 감성 분석
또 다른 Lexicon인 VADER Lexicion은 소셜 미디어의 감성 분석 용도로 만들어진 룰 기반의 Lexicon이다. VADER는 SentimentIntensityAnalyzer 클래스를 이용해 쉽게 감성 분석을 제공한다. NLTK 서브 모듈로 SentimentIntensityAnalyzer를 import 후 감상평 한 개만 감성 분석을 수행해 결과를 보았다.
VADER를 이용하면 매우 쉽게 감성 분석을 수행할 수 있다. 먼저 SentimentIntensityAnalyzer 객체를 생성한 뒤 문서별로 polarity_scores() 메서드를 호출해 감성 점수를 구한 뒤, 해당 문서의 감성 점수가 특정 임계값 이상이면 긍정, 그렇지 않으면 부정으로 판단한다. 'neg'는 부정 감성 지수, 'neu'는 중립적인 감성 지수, 'pos'는 긍정 감성 지수, 그리고 compound score를 기반으로 부정 감성 또는 긍정 감성 여부를 결정한다. 보통 0.1 이상이면 긍정, 그 이하이면 부정으로 판단한다. 임계값 조절도 가능하다.
정확도가 SentiWordNet보다 향상됐고, 특히 재현율은 매우 크게 향상되었다. 이외에도 뛰어난 감성 사전으로 pattern 패키지가 있지만 3.xx 파이썬 버전에서는 완벽하게 지원하지 않는다. 감성 사전을 이용한 감성 분석 예측 성능은 지도학습 분류 기반의 에측 성능에 비해 아직은 낮은 수준이지만 결정 클래스 값이 없는 상황을 고려한다면 어느 정도 만족할만한 예측 수준이다.
'Machine Learning' 카테고리의 다른 글
[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part5 토픽 모델링 (0) | 2021.12.29 |
---|---|
[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part5 토픽 모델링 (0) | 2021.12.27 |
[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part3 뉴스그룹 분류 (0) | 2021.12.13 |
[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part2 BOW (0) | 2021.12.11 |
[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 (0) | 2021.12.09 |
댓글