221007

AIVILLAIN·2022년 10월 7일
0

오공완

목록 보기
18/25

감성 분석(Sentiment Analysis)

실습 코드

문서의 주관적인 감성/의견/감정/기분 등을 파악하기 위한 방법
문서 내 텍스트가 나타내는 여러 가지 주관적인 단어와 문맥을 기반으로 감성 수치를 계산
긍정 감성 지수, 부정 감성 지수
이 지수를 합산해 긍정 감성 또는 부정 감성 결정

  • 지도학습은 학습 데이터와 타깃 레이블 값을 기반으로 감성 분석 학습을 수행한 뒤 이를 기반으로 다른 데이터의 감성을 예측하는 방법, 일반적인 텍스트 기반 분류와 거의 동일
  • 비지도학습은 Lexicon이라는 감성 어휘 사전 이용
    감성 분석을 위한 용어와 문맥에 대한 다양한 정보를 가지고 있으며, 이를 이용하여 문서의 긍정적, 부정적 감성 여부 판단

IMDB 영화평

kaggle competitions download -c word2vec-nlp-tutorial
labeledTrainData.tsv 사용

비지도학습 기반 감성 분석

Lexicon 기반
지도 감성 분석은 데이터 세트가 레이블 값을 가지고 있음
많은 감성 분석용 데이터는 이러한 결정된 레이블 값을 가직 ㅗ있지 않음
이런 경우 Lexicon은 유용하게 사용될 수 있음
(한글 지원 이 당시 없음)

Lexicon은 감성만을 분석하기 위해 지원하는 감성 어휘 사전
감성 사전은 긍정 감성 또는 부정 감성의 정도를 의미하는 수치를 가지고 있으며 이를 감성 지수라고 함
단어의 위치나 주변 단어, 문맥, POS 등을 참고하여 결정됨

NLP에서 제공하는 WordNet 모듈은 방대한 영어 어휘 사전
시맨틱 분석을 제공하는 어휘 사전
시맨틱이란 문맥상 의미를 뜻함
다양한 상황에서 같은 어휘라도 다르게 사용되는 어휘의 시멘틱 정보 제공
각 품사로 구성된 개별 단어를 Synset(Sets of cognitive synonyms)이라는 개념을 이용하여 표현
Synset은 단순한 하나의 단어가 아닌 단어가 가지는 문맥, 시맨틱 정보를 제공

NLTK의 감성 사전이 감성에 대한 훌륭한 사전 역할을 제공하지만, 예측 성능은 그리 좋지 못함
실제 업무 적용은 NLTK 패키지가 아닌 다른 감성 사전을 적용하는 것이 일반적

  • SentiWordNet
    NLTK 패키지의 WordNet과 유사하게 감성 단어 전용 WordNet 구현
    3가지 감성 점수를 할당
    긍정, 부정, 객관성 지수
  • VADER
    소셜 미디어 텍스트에 대한 감성 분석 제공을 위한 패키지
  • Pattern
    파이썬 2.X버전에서만 동작

SentiWordNet을 이용한 감성 분석

WordNet 기반의 synset을 이용
synsets() 호출 시 반환되는 것은 여러 개의 Synset 객체를 가지는 리스트
Synset 객체의 파라미터는 POS 태그를 나타냄
’present.n.01’에서 present는 의미, n은 명사 품사, 01은 present가 명사로서 가지는 의미가 여러가지 있어 이를 구분하는 인덱스
synset 객체는 POS(품사), 정의(Definition), 부명제(Lemma) 등 시맨틱적 요소 표현 가능

어휘 간의 관계를 유사도로 나타낼 수도 있음
synset 객체는 단어 간의 유사도를 나타내기 위해 path_similarity() 메서드 제공

SentiWordNet은 WordNet의 Synset과 유사한 Senti_Synset 클래스를 가짐
SentiSynset 객체는 단어의 감성을 나타내는 감성 지수와 객관성을 나타내는 객관성 지수를 가짐
감성 지수는 긍정 지수, 부정 지수로 나뉨
어떤 단어가 전혀 감성적이지 않으면 객관성 지수는 1이 되고 감성 지수는 모두 0이 됨

IMDB 영화 감상평 분석 수행

  1. 문서를 문장 단위로 분해
  2. 문장을 단어 단위로 토큰화하고 품사 태깅
  3. 품사 태깅된 단어 기반으로 synset 객체와 senti_synset 객체 생성
  4. Senti_synset에서 긍정 감성/부정 감성 지수를 구하고 이를 합산하여 특정 임계치 값 이상일 때 긍정 감성, 그렇지 않을 때 부정 감성으로 결정

VADER를 이용한 감성 분석

소셜 미디어 감성 분석 용도로 만들어진 룰 기반 Lexicon
SentimentIntensityAnalyzer 클래스를 이용한 감성 분석 제공
NLTK 서브 모듈로 제공될 수도 있고 단독 패키지로 제공될 수도 있음
객체 생성 후 문서별로 polarity_scores() 메서드를 호출하여 감성 점수 구한 뒤 해당 문서의 감성 점수가 특정 임계값 이상이면 긍정, 그렇지 않으면 부정으로 판단
딕셔너리 형태의 감성 점수 반환
neg는 부정 감성 지수, neu는 중립 감성 지수, pos는 긍정 감성 지수, compound는 neg, neu, pos score를 조합하여 -1~1사이 감성 지수를 표현한 값
compound score를 기반으로 부정, 긍정 감성 여부 결정
보편적으로 0.1이상이면 긍정, 그 이하이면 부정 감성으로 판단하나 상황에 따라 임계값 조정

토픽 모델링

실습 코드

문서 집합에 숨어 있는 주제를 찾아내는 것
많은 문서가 있을 때 사람이 이 문서를 다 읽고 핵심 주제를 찾는 것은 시간이 많이 소모됨
머신러닝 기반 토픽 모델링을 적용하여 숨어 있는 중요 주제를 효과적으로 찾을 수 있음

자주 사용되는 기법은 LSA(Latent Semantic Analysis), LDA(Latent Dirichlet Allocation)
토픽 모델링 LDA와 차원 축소 LDA는 약어만 같을 뿐 서로 다른 알고리즘

사이킷런은 LDA 기반 토픽 모델링을 LatentDirichletAllocation 클래스로 제공
Count 기반 벡터화 변환하여 LDA 사용
LDA는 Count 기반의 벡터화만 사용

문서 군집화

실습 코드

비슷한 텍스트 구성의 문서를 군집화하는 것
동일한 군집에 속하는 문서를 같은 카테고리 소속으로 분류할 수 있으므로 앞에서 소개한 텍스트 분류 기반 문서 분류와 유사
텍스트 분류 기반 문서 분류는 사전 결정 카테고리 값을 가진 학습 데이터 세트가 필요한 반면 문서 군집화는 학습 데이터 세트가 필요 없는 비지도학습 기반으로 동작

군집별 핵심 단어 추출

KMeans 객체는 각 군집을 구성하는 단어 피처가 군집의 중심을 기준으로 얼마나 가깝게 위치해 있는지 clustercenters라는 속성으로 제공
배열 값으로 제공되며 행은 개별 군집, 열은 개별 피처를 의미
각 행의 배열 값은 각 군집 내의 피처의 위치가 개별 중심과 얼마나 가까운지를 상대적인 값으로 나타낸 것
1에 가까울수록 중심과 가까운 값을 의미

문서 유사도

실습 코드

문서와 문서 간의 유사도 비교는 일반적으로 코사인 유사도 사용
벡터와 벡터 간의 유사도 비교 시 벡터의 크기보다는 백터의 상호 방향성이 얼마나 유사한지에 기반
두 벡터 사이의 사잇각을 구해서 얼마나 유사한지 수치로 적용

두 벡터 사잇각

유사하거나, 관련이 없거나, 아예 반대 관계가 될 수 있음
두 벡터 A와 B의 코사인 값
벡터 A와 B의 내적 값은 두 벡터의 크기를 곱한 값의 코사인 각도 값을 곱한 값
두 벡터의 내적을 총 벡터 크기의 합으로 나눈 것이 유사도 코사인 값

문서를 피처 벡터화 변환하면 차원이 매우 많은 희소 행렬이 되기 쉬운데 희소 행렬 기반에서 문서와 문서 벡터간의 크기에 기반한 유사도 지표는 정확도가 떨어지기 쉬움
문서가 매우 긴 경우 단어의 빈도수도 더 많을 것이기에 이러한 빈도수에만 기반해서는 공정한 비교가 어려움

profile
소신있는 오픈마인드

0개의 댓글