감정분석 #1 사전활용
감정 분석(sentiment analysis)
텍스트에 어떤 감정이 담겨있는지 분석하는 방법 글쓴이가 어떤 감정을 담아 글을 썼는가?
사람들이 어떤 주제를 긍정적/부정적으로 느끼는가?
- 감정 사전 : '감정 단어'와 '감정의 강도를 표현한 숫자'로 구성된 사전 사전을 이용해 문장의 단어에 감정 점수를 부여한 다음 합산
- 감정 단어의 종류
word : 감정 단어 polarity : 감정의 강도
- word
한 단어로 된 단일어, 둘 이상 단어 결합된 복합어
이모티콘: ^^ , ㅠㅠ
- polarity
5가지 정수(+2, +1, 0, -1, -2)
+ : 긍정 단어, - : 부정 단어, 0 : 중성 단어
- 기본적인 전처리
고유 번호 변수 만들기: 댓글 내용 같아도 구별할 수 있도록
html 특수 문자 제거하기: 웹에서 만들어진 텍스트는 html 특수 문자 포함되어 내용 알아보기 불편 textclean::replace_html() : html 태그를 공백으로 바꾸기
stringr::str_squish() : 중복 공백 제거
특수 문자와 두 글자 미만 단어 포함하기: 감정 사전의 특수 문자, 모음, 자음으로 된 두 글자 미만의 이모티콘 활용
- 토큰화(tokenization)
토큰(token): 텍스트의 기본 단위(ex: 단락, 문장, 단어, 형태소)
토큰화: 텍스트를 토큰으로 나누는 작업
# 필요한 library
library(dplyr) # select(), filter(), mutate(), summarize()함수를 학습 library(readr) # 플랫 파일을 데이터프레임으로 바꾸는 것과 연관 library(stringr) # 주로 문자열 데이터를 다루는 함수 library(tidytext) # 텍스트 포맷의 데이터를 여러 토큰(token) 단위로 쪼개서 분석하는데 필요한 라이브러리 library(textclean) #전처리 library(ggplot2) # 막대그래프 만들기 library(tidyr) # wide form |
# 자주쓰이는 코딩용어
# str_squish() %>% # 중복 공백 제거
# as_tibble() # tibble로 변환
# str_replace_all("[^가-힣]", " ") # 한글만 남기기
# token = extractNoun # 명사 기준
# token = "characters" # 문자 기준
# token = "words" # 띄어쓰기 기준
# token = "sentences" # 문장 기준
# input = value # 토큰화할 텍스트
# output = word # 토큰을 담을 변수명
# # # # # 감정 사전 활용
#1 파일 불러오기
dic <- read.csv("C:/sentiment.csv") Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec, : invalid multibyte string at '<e3><85><a0>?<a0>' |
# 오류 해결 방법,
# 일반적으로 fileEncoding과 encoding파라미터를 확인하면 된다.
# 한글 관련된 인코딩 : utf-8, CP949, euc-kr
dic <- read.csv("C:/sentiment.csv",header=TRUE, stringsAsFactors = TRUE,fileEncoding = "UTF-8",encoding = "CP949") |
#2 긍정단어 & 부정단어 확인
#긍정단어 dic %>% filter(polarity==2) %>% arrange(word) #부정단어 dic %>% filter(polarity==-2) %>% arrange(word) |
#4 이모티콘
dic %>% filter(!str_detect(word, "[가-힣]")) %>% arrange(word) |
- 한글이 아닌것 filter
#5 pos(긍정),neg(부정),neu(중성) 단어 분류 단어count
dic %>% mutate(sentiment = ifelse(polarity >= 1, "pos", ifelse(polarity <= -1, "neg", "neu"))) %>% count(sentiment) |
# 문장의 감정 점수 구하기
df <- tibble(sentence = c("디자인 예쁘고 마감도 좋아서 만족스럽다.", "디자인은 괜찮다. 그런데 마감이 나쁘고 가격도 비싸다.")) df |
#1 단어 기준으로 토큰화
df <- df%>% unnest_tokens(input=sentence, output=word, token="words", drop=F) df |
- unnest_tokens(drop = F)
원문 제거하지 않기
단어가 어느 문장에서 추출됐는지 알기위함
#2 단어에 감정 점수 부여하기
df <- df %>% left_join(dic,by="word") %>% mutate(polarity=ifelse(is.na(polarity),0,polarity)) df |
- left_join() : word 기준 감정 사전 결합
- 감정 사전에 없는 단어 polarity NA → 0 부여
#3 문장별로 감정 점수 합산하기
score_df <- df %>% group_by(sentence) %>% summarise(score=sum(polarity)) score_df |