close_btn
조회 수 14076 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files 수정 삭제
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files 수정 삭제

감성분석이란?

글에서 감성을 읽어내고 객관적인 정보를 추출하는 것으로 

POINT!!!는 추출한 감성을 객관적이고 체계적으로 수치화 하는 것이다.



마텍.PNG



감성분석의 현위치

어도비 소셜의 예측 퍼블리 ; 제품/서비스 사용자 오피니언 조사, 업체에 대한 부정적 의견 모니터링, 소비자 트렌드 추적 등

IBM의 소셜 애널리틱스 ; 실시간으로 소비자 감성 분석 및 즉각적인 대응방안 제시

sk 플래닛의 smart insight; 하둡기반 텍스트 마이닝, 오피니언 마이닝 플랫폼 b2b 서비스 제공

sas의 advanced customer experience 등

다양한 솔루션들이 서비스 중이지만 감성 분석은 다른 분야에 비해 아직 굉장히 굉장히 더디다 

일단 감성어 사전이 없으면 아무것도 할 수 없고, 감성어 사전으로 분석하는 것도 정확도가 굉장히 떨어진다.

또한 일상언어 비속어 등 일반 속어에 대해 분석이 굉장히 어렵다


감성 분석 3단계


1. 데이터 수집


2. 주관성 탐지 : 사용자 주관이 드러난 곳만 도려내자 

   보통 텍스트 구성요소를 긍정 부정 중립 객관 4가지로 분


3. 극성 탐지 : 사용자의 감성을 좋고 싫고 양 극으로 보내자

   긍정 부정 단어를 정량화 / 각 단어에 점수 혹은 가중치 부여하여 / 전체 텍스트가 어디에 속하는지 분류



감성어 사전

오픈한글                : 지금 서비스 제공안함
KOSAC                  : 약4천개 미만의 어휘집 
(http://word.snu.ac.kr/kosac/corpus.php) 에서 신청
SentiWordNet        : 다양한 외국어 어휘집 
Liwc                     : 영어 어휘집
   

=====코드설명 - 예제-===============================================================

  library(tidytext) 
sentiments
  # tidytext 패키지안에 sentiments 라는 감성어 사전이  내장되어 있다
---------------------------------------------------------------
> sentiments
# A tibble: 23,165 × 4
          word sentiment lexicon score
         <chr>     <chr>   <chr> <int>
1       abacus     trust     nrc    NA
2      abandon      fear     nrc    NA
3      abandon  negative     nrc    NA
4      abandon   sadness     nrc    NA
5    abandoned     anger     nrc    NA
6    abandoned      fear     nrc    NA
7    abandoned  negative     nrc    NA
8    abandoned   sadness     nrc    NA
9  abandonment     anger     nrc    NA
10 abandonment      fear     nrc    NA
# ... with 23,155 more rows
-----------------------------------------------------------------------------
#어휘집에는 유니그램 기반, 3가지 종류의 어휘집이 있으며 긍정/부정으로 분류하기 위한 점수와 감정을 각 단어들에 할당
#유니그램이란 단어의 속성을 긍정/부정 두가지로 분류하는 것으로 최근에는 n-gram을 사용하여 언어의 속성을 n개로 구분

get_sentiments("nrc")
#NRC 어휘집은 : 긍정, 부정, 분노, 기대감, 혐오감, 두려움, 기쁨, 슬픔, 놀라움 및 신뢰 범주로 단어 구분
--------------------------------------------------------------------------
# A tibble: 2,476 × 2
         word score
        <chr> <int>
1     abandon    -2
2   abandoned    -2
3    abandons    -2
4    abducted    -2
5   abduction    -2
6  abductions    -2
7       abhor    -3
8    abhorred    -3
9   abhorrent    -3
10     abhors    -3
# ... with 2,466 more rows
--------------------------------------------------------------------------------------
get_sentiments("afinn")
#AFINN 어휘집은 : 긍정/ 부정 단어들을 각각 -5에서 +5점 사이 점수들 준다
---------------------------------------------------------------------------------------
# A tibble: 2,476 × 2
         word score
        <chr> <int>
1     abandon    -2
2   abandoned    -2
3    abandons    -2
4    abducted    -2
5   abduction    -2
6  abductions    -2
7       abhor    -3
8    abhorred    -3
9   abhorrent    -3
10     abhors    -3
# ... with 2,466 more rows
-----------------------------------------------------------------------------------------------------------
get_sentiments("bing")
#bing 어휘집 : 단어를 긍정 부정으로만 분류
------------------------------------------------------------------------------------------------
# A tibble: 6,788 × 2
          word sentiment
         <chr>     <chr>
1      2-faced  negative
2      2-faces  negative
3           a+  positive
4     abnormal  negative
5      abolish  negative
6   abominable  negative
7   abominably  negative
8    abominate  negative
9  abomination  negative
10       abort  negative
# ... with 6,778 more rows
--------------------------------------------------------------------------------------------------

이제 제인 오스틴의 책을 가지고 감성 분석 실시!

library(janeaustenr)
library(dplyr)
library(stringr)

#제인 오스틴의 책 뽑고 각 챕터별로 구별해보자
tidy_books <- austen_books() %>%
  group_by(book) %>%
  mutate(linenumber = row_number(),
         chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]", 
                                                 ignore_case = TRUE)))) %>%
  ungroup() %>%

  unnest_tokens(word, text)   # word를 기준으로 텍스트를 행마다 하나의 토큰화
#감성분석의 첫번째 단계는 하나의 텍스트를 토큰화를 통해 여러 단락으로 쪼개는 것이다.
---------------------------------------------------------------------------------------------------
> tidy_books
# A tibble: 217,609 × 4
                  book linenumber chapter  word
                <fctr>      <int>   <int> <chr>
1  Sense & Sensibility          1       0 sense
2  Sense & Sensibility        113       1 sense
3  Sense & Sensibility        159       1 sense
4  Sense & Sensibility        563       4 sense
5  Sense & Sensibility        566       4 sense
6  Sense & Sensibility        575       4 sense
7  Sense & Sensibility       1394       9 sense
8  Sense & Sensibility       1425      10 sense
9  Sense & Sensibility       1584      10 sense
10 Sense & Sensibility       1699      11 sense
# ... with 217,599 more rows

-----------------------------------------------------------------------------------------------
data(stop_words) 
tidy_books <- tidy_books %>% anti_join(stop_words)
#불필요한 단어들 of to a/an 등 과 같은 불필요 단어 제거하는 함수
# 지금의 예는 단어를 중심으로 감성 분석을 실시하지만
(좀 더 정확한 감성분석을 위해서) 단어가 사용된 문법을 고려하기위해 
이러한 단어들을 없애지 않는 경우가 많다.
--------------------------------------------------------------------------------------

library(tidyr) # 데이터 프레임 형태에만 적용되는데 파워풀한 전처리 패키지

janeaustensentiment <- tidy_books %>%
  inner_join(get_sentiments("bing")) %>%     # 책을 긍정 부정 단어로만 분류
  count(book, index = linenumber %/% 80, sentiment) %>%
  spread(sentiment, n, fill = 0) %>% #각 열에 부정과 긍정느낌인지 부여
  #spread(데이터 프레임, 피벗으로 뺄 열 이름  , value로 나타낼 열)
  #텍스트를 너무 많은 열로 나누면 나중에 전체 열의 감성을 합하거나 평균을 낼 때 0이 되는 경우가 있다
  mutate(sentiment = positive - negative) #책에서 지금 감정이 어떤 상태인지 긍정인지 부정인지 나타냄

--------------------------------------------------------------------------------------------------------------------
> janeaustensentiment
Source: local data frame [920 x 5]
Groups: book, index [920]

                  book index negative positive sentiment
                <fctr> <dbl>    <dbl>    <dbl>     <dbl>
1  Sense & Sensibility     0       16       26        10
2  Sense & Sensibility     1       19       44        25
3  Sense & Sensibility     2       12       23        11
4  Sense & Sensibility     3       15       22         7
5  Sense & Sensibility     4       16       29        13
6  Sense & Sensibility     5       16       39        23
7  Sense & Sensibility     6       24       37        13
8  Sense & Sensibility     7       22       39        17
9  Sense & Sensibility     8       30       35         5
10 Sense & Sensibility     9       14       18         4
# ... with 910 more rows
--------------------------------------------------------------------------------------------------------------------
#nrc라는 어휘집에서 joy라는 감정을 나타내는 단어만 가져오자
nrcjoy <- get_sentiments("nrc") %>% 
    filter(sentiment == "joy")
------> nrcjoy----------------------------------------------------------------------------------------------
# A tibble: 689 × 2
            word sentiment
           <chr>     <chr>
1     absolution       joy
2      abundance       joy
3       abundant       joy
4       accolade       joy
5  accompaniment       joy
6     accomplish       joy
7   accomplished       joy
8        achieve       joy
9    achievement       joy
10       acrobat       joy
# ... with 679 more rows
--------------------------------------------------------------------------------------------------------------

# "Emma" 책 중에서 nrcjoy와 매칭되는 부분을 기준으로 결합
#엠마라는 책에서 joy라는 감정을 나타내는 단어 빈도수 카운트
tidy_book %>%
  filter(book == "Emma") %>%
  inner_join(nrcjoy) %>%
  count(word, sort = TRUE)
# A tibble: 303 × 2------------------------------------------------------------------------
      word     n
     <chr> <int>
1     good   359
2    young   192
3   friend   166
4     hope   143
5    happy   125
6     love   117
7     deal    92
8    found    92
9  present    89
10    kind    82
# ... with 293 more rows  
-------------------------------------------------------------------------------------------------------------------

#감정변화 시각화
library(ggplot2)
#제인 오스틴 책들의 감성변화를 긍정과 부정으로 시각화해보자
ggplot(janeaustensentiment, aes(index, sentiment, fill = book)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~book, ncol = 2, scales = "free_x")

캡쳐 책 감성.PNG
# 앞서 본  긍정단어에서 부정 단어를 뺀 sentiment를 활용하여 감정의 변화를 나타낸다 

#filter()를 사용하여 관심있는 책만 보자
pride_prejudice <- tidy_books %>% 
  filter(book == "Pride & Prejudice")

#pride and prejudice라는 책에서 각각 감성어 사전에 해당하는 감정들을 추출해보자
#기본적으로 감성의 변화는 sentiment(긍정단어 개수-부정단어 개수)를 활용하여 나타낸다 
afinn <- pride_prejudice %>% 
  inner_join(get_sentiments("afinn")) %>% 
  group_by(index = linenumber %/% 80) %>% 
  summarise(sentiment = sum(score)) %>% 
  mutate(method = "AFINN")

#bing과 nrc라는 감성어를 동시에 사용하여 감성을 추출해보자
bing_and_nrc <- bind_rows(pride_prejudice %>% 
                            inner_join(get_sentiments("bing")) %>%
                            mutate(method = "Bing et al."),
                          pride_prejudice %>% 
                            inner_join(get_sentiments("nrc") %>% 
                                         filter(sentiment %in% c("positive", 
                                                                 "negative"))) %>%
                            mutate(method = "NRC")) %>%
  count(method, index = linenumber %/% 80, sentiment) %>%
  spread(sentiment, n, fill = 0) %>%
  mutate(sentiment = positive - negative)

bind_rows(afinn, 
          bing_and_nrc) %>%
  ggplot(aes(index, sentiment, fill = method)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~method, ncol = 1, scales = "free_y")

캡처감성.PNG
==================================================================================

한계점
위의 예시는 감성어 사전을 기반으로 단어만 가지고 감성을 판별했다
제인 오스틴 패키지에 있는 책들은 단어만 가지고 분석이 용이하게 정제되어 있지만
실제로 감성 분석을 위한 텍스트들은 보다 러프하다. 또한 일상 언어에서 사용되는 단어들이 갖는 뜻은 대단히 유연하지만
감성어 사전은 단어가 갖는 값이 고정되어 있어 정확한 분석이 어렵다 그리고 양질의 감성어 확보도 어렵 
 ->>>> 보통 분석하려는 주제에 맞게 감성어 사전을 다시 세팅하는 경우가 많다. 
또한
기계적으로 긍정/ 부정 단어의 횟수만 가지고 텍스트 전체의 의미를 해석 할 수 없다

예시
1) 갤놋7은 2.3Ghz의 고성능 cpu 탑재로 보다 강력한 성능을 자랑합니다
2) 5.3인치 슈퍼A몰RE드 디스플레이는 저전력의 높은 해상도를 자랑합니다
3) 후먼 1200만 화소, 전면 500만 화소 f1.7로 보다 선명한 카메라를 지원합니다
4) 그러나 배터리가 불안정해 터질 위험이 있습니다

컴퓨터는 이 구문을 통해 긍정으로 인식할 확률이 높다.
so, 문장단위로 텍스트를 분석하는 "속성"단위 분석 필요
속성이란 대상의 여러 특징들을 의미하는데 성능 카메라 해상도 등이 그것이다 
속성명찾고 / 각 속성에 해당하는 감성어 찾고 / 그 감성어를 분류한 후/각 속성에 해당하는 전체 감성을 종합하여 판단해야 한다


근데 또 문제점!
통상 자연어 처리는 형태소 분석 / 구문 분석 / 의미 분석 순인데 / 한국어는 형태소 분석도 어려움 

최근에는 딥러닝기반, 특히 뉴럴 네트워크 기반  감성분석이 활발, 기존 학습 분류기에 비해 훠얼씬 나은 성능 보여줌
감성어 사전을 구축하지 않고 감성을 분석하려 시도하고 있다.


============================================= Reference ===============================
idg tech report - 감성분석의 이해
Data Dictionary 기반의 R Programming을 통한 비정형 Text Mining Algorithm 연구 논문
Text mining with R
영화 리뷰 감성분석을 위한 텍스트 마이닝 기반 감성 분류기 구축 연구 논문
http://rpubs.com/lgendrot/sentiment


List of Articles
번호 제목 글쓴이 날짜 조회 수
7 텍스트 마이닝 3장 - Analyzing word and document frequency: tf-idf 곽대훈 2017.05.20 4333
6 텍스트 마이닝 4장 - Relationships between words file 연다인 2017.05.17 4640
5 텍스트 마이닝 5장 - tidying and casting dtm and corpus objects file 유누리 2017.05.14 5469
» 텍스트 마이닝 2장 감성분석 1 file 호잇짜 2017.04.11 14076
3 3/29 텍스트마이닝 - 파이썬 기초1 1 file 2017.04.05 5720
2 3/29 텍스트마이닝 1장 tidy text format 1 file cys109 2017.04.05 4738
1 3/29 텍스트 마이닝 - 파이썬 기초 2 2 file 허능호 2017.04.03 4701
Board Pagination ‹ Prev 1 Next ›
/ 1

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5