본문 바로가기

* [R_Python] 데이터분석 정리/[Python] 텍스트마이닝

[자연어처리] 2. 감정 분석

감정 분석은 중요하면서도 가장 어려운 부분이라고 생각합니다.

 

텍스트 마이닝은  결국 사람들의 글을 모아서 글들을 취합하고 통계내는 과정인데

그를 통해서 결과적으로 긍정적인 반응이 많은지, 부정적인 반응이 많은지가 알고 싶어하기 때문에

중요한 부분이 될 것 입니다.

 

그러나, 단어만 보고 단순하게 긍/부정을 판단하면 오해의 소지가 생길 수 있습니다.

앞 뒤 맥락을 이해하지 못해 비꼬는 말투를 긍정으로 보게 될 수도 있고,

사람의 어투에 따라 긍정의 반응을 부정으로 해석하는 경우도 종종 발생하기 때문입니다.

 

아래 이론은 실제 실무에서 적용하기에는 어려운 부분이 있지만,

감정 분석의 기초가 되는 부분이라서 한 번 숙지해둘 필요는 있어 보입니다.

 

 

 

 

2. 감정분석

 

[접근방식]

  • ① 사람이 작성한 규칙 기반 알고리즘 사용 
    • 키워드에 부여된 수치 점수 취합
    • 맥락을 이해하지 못해 제대로된 해석의 어려움이 있음
    ② 컴퓨터가 자료로 부터 배우는 기계 학습 모형 사용
    • 분류명 붙은 문장(문서집합)을 이용해 훈련
    • 정답이 붙은 대량의 자료 필요 (시간과 비용 소모)
  •  

1) 규칙 기반 감정 분석기 (사람이 작성한 규칙 기반 알고리즘)

  • 영어 : VADER
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
sa = SentimentIntensityAnalyzer()
scores = sa.polarity_scores(doc)
scores['compound']

# 사전 : SentimentIntensityAnalyzer.lexicon

 

2) 기계 학습 모형

  • 분류명이 붙은 대량의 텍스트 문서를 구해야 함
  • 용도에 맞게 훈련 자료를 분리 필요
  • 문장 성격이 달라지면 어휘가 늘어나기 때문에 고려 필요
## 예시

# 데이터로드
from nlpia.data.loaders import get_data
movies = get_data('hutto_movies')
# movies.head().round(2) : print

# 토큰화
from nltk.tokenize import casual_tokenize
bags_of_words = []

from collections import Counter # (키,값) 사전 객체 만들기
for text in movies.text:
		bags_of_words.append(Counter(casual_tokenize(text)))
df_bows = pd.DataFrame.from_records(bags_of_words)
df_bows = df_bows.fillna(0).astype(int)

# 감성분석 실행 (베이즈모형)

from sklearn.naive_bayes import MultinomialNB

nb = MultinomialNB()
nb = nb.fit(df_bows, movies.sentiment > 0)
pred_y = nb.predict_proba(df_bows)
pred_y = [i[1] for i in pred_y]
movies['predicted_sentiment'] = (np.array(pred_y) * 8) - 4   #-4~4 값으로 변환
movies['error'] = (movies.predicted_sentiment - movies.sentiment).abs() #mae
movies.error.mean().round(1)  
movies['sentiment_ispositive'] = (movies.sentiment > 0).astype(int)
movies['predicted_ispositive'] = (movies.predicted_sentiment > 0).astype(int)

movies

 

Source : 파이썬으로 배우는 자연어 처리 인 액션