감정 분석은 중요하면서도 가장 어려운 부분이라고 생각합니다.
텍스트 마이닝은 결국 사람들의 글을 모아서 글들을 취합하고 통계내는 과정인데
그를 통해서 결과적으로 긍정적인 반응이 많은지, 부정적인 반응이 많은지가 알고 싶어하기 때문에
중요한 부분이 될 것 입니다.
그러나, 단어만 보고 단순하게 긍/부정을 판단하면 오해의 소지가 생길 수 있습니다.
앞 뒤 맥락을 이해하지 못해 비꼬는 말투를 긍정으로 보게 될 수도 있고,
사람의 어투에 따라 긍정의 반응을 부정으로 해석하는 경우도 종종 발생하기 때문입니다.
아래 이론은 실제 실무에서 적용하기에는 어려운 부분이 있지만,
감정 분석의 기초가 되는 부분이라서 한 번 숙지해둘 필요는 있어 보입니다.
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 : 파이썬으로 배우는 자연어 처리 인 액션
'* [R_Python] 데이터분석 정리 > [Python] 텍스트마이닝' 카테고리의 다른 글
워드 투 벡터 (Word2Vec) (0) | 2023.02.28 |
---|---|
[자연어처리] 3. TF-IDF 벡터 (0) | 2022.12.07 |
[자연어처리] 1. 단어 토큰화 (0) | 2022.12.05 |