텍스트마이닝

감정분석 #1 사전활용

yul_S2 2022. 12. 14. 10:06
반응형

감정 분석(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

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형