감석분석 작업 로그 : 감성분석(Sentiment Analysis)

- 깔끔한 텍스트 방식(tidytext) : xwMOOC 자연어 처리 

1. 깔끔한 텍스트 데이터 분석 방식

깔끔한(tidy) 데이터 분석 방법론이 정립되어 다양한 분야에 적용되고 있고, 텍스트 데이터(tidyverse)라고 예외는 아니다. 사실 텍스트 데이터는 다양한 형태로 넘쳐자고 있지만 이에 대한 대응은 특히, 한국어를 R언어로 활용한 사례는 많지 않다.

텍스트 데이터를 분석하기 좋은 웹사이트가 여러분의 손을 기다리고 있습니다. 단, 텍스트 데이터는 모두 영어로 되어 있습니다.

텍스트 데이터를 분석하는 다양한 방식이 존재한다. 텍스트 데이터 분석방법으로 무료 전자책 Text Mining with R에 내용을 중심으로 살펴보자.

깔끔한 텍스트 작업흐름

원본 텍스트 데이터가 있다면 이를 unnest_tokens() 함수를 통해 텍스트를 깔끔한 형태로 정제를 한후 dplyr를 활용하여 데이터를 가공한 후에 요약하고 나서 이를 ggplot에 담아 시각화한다.

2. 구텐베르그 전자책 가져오기 {#gutenberg} 1

gutenbergr 팩키지가 있어 힘들게 구텐베르그 프로젝트 웹사이트 들어가서 검색하고 이를 다운로드 받아 R로 가져오는 과정을 자동화해서 R 내부에서 처리할 수 있게 되었다.

2.1. 구텐베르그 메타데이터

구텐베르그 팩키지 메타데이터(gutenberg_metadata)에 구텐베르그 프로젝트에서 관리하는 도서정보가 한 눈에 볼 수 있도록 정리해놨다. 표본으로 100개 뽑아서 살펴보고, 언어별로 어떤 언어가 가장 많은 도서데이터로 추출가능하지 살펴본다.

# 0. 환경설정 ------------------------------
# https://ropensci.org/tutorials/gutenbergr_tutorial.html
# if (!require("devtools")) install.packages("devtools")
# devtools::install_github("ropenscilabs/gutenbergr")
# library(gutenbergr)
# library(tidyverse)
# library(DT)
# library(stringr)

# 1. 구텐베르그 팩키지 사용법 --------------
gutenberg_metadata %>% sample_n(100) %>% 
    datatable()
gutenberg_metadata %>% count(language, sort=TRUE) %>% 
    mutate(percent = n / sum(n),
           cumpcnt = scales::percent(cumsum(percent)))
# A tibble: 103 x 4
   language     n     percent cumpcnt
      <chr> <int>       <dbl>   <chr>
 1       en 42719 0.821566629   82.2%
 2       fr  2658 0.051118334   87.3%
 3       de  1387 0.026674616   89.9%
 4       fi  1341 0.025789949   92.5%
 5       nl   723 0.013904648   93.9%
 6       it   672 0.012923823   95.2%
 7       pt   537 0.010327519   96.2%
 8       es   470 0.009038983   97.1%
 9       zh   408 0.007846607   97.9%
10       el   216 0.004154086   98.3%
# ... with 93 more rows

2.2. 다운로드 가능한 도서

구텐베르그 프로젝트에 등록된 도서가 많지만, 텍스트 분석을 위해서 결국 원문이 이용가능해야 된다. 이를 정리한 것이 gutenberg_works 함수로 이중 100개만 표본으로 뽑아서 어떤 전자책이 다운로드 가능하지 살펴보자. 그리고, 위키피디어 에드거 앨런 포에 대한 저작물을 찾아보자.

# 2. 영문&다운로드 가능 저작물 --------------

gutenberg_works() %>% sample_n(100) %>% 
    datatable()
# gutenberg_works(str_detect(author, "Poe"))

gutenberg_works(author == "Poe, Edgar Allan") %>% 
    datatable()

2.3. 에드거 앨런 포 저작물 다운로드

전자책마다 고유한 식별자가 붙어있다. 예를 들어, 어셔가의 붕괴(The Fall of the House of Usher)는 932, 아몬틸라도의 술통(The Cask of Amontillado)는 1063번으로 고유 ID가 붙어있다.

R에서 도서정보를 저장하는 방식은 데이터프레임 한 행이 도서의 한줄에 해당된다. 따라서, 다운로드받은 두권의 책의 총 행수를 비교하는 방법은 행수를 개수하면 된다.

# 3. 저작물 다운로드 --------------
## 3.1. 책 한권 -------------------
usher_house <- gutenberg_download(932)
datatable(usher_house)
## 3.2. 책 두권 -------------------
poe_books <- gutenberg_download(c(932, 1063), meta_fields = "title")
datatable(poe_books)
poe_books %>% 
    count(title)
# A tibble: 2 x 2
                           title     n
                           <chr> <int>
1        The Cask of Amontillado   330
2 The Fall of the House of Usher   789

3. 감성어 사전

tidytext 팩키지에 감성어 사전(sentiment lexicon)이 3개 포함되어 있다. get_sentiments() 함수에 다음 감성어 사전을 인자로 넣어 깔끔한 텍스트 데이터프레밍과 inner_join하여 텍스트에 포하된 감성을 계량화한다.

  • afinn: 개발자 Finn Årup Nielsen
  • bing: 개발자 Bing Liu와 기여자
  • nrc: 개발자 Saif Mohammad, Peter Turney

깔끔한 텍스트 감성어 작업흐름

4. 에드가 앨런 포우 감성분석

에드가 앨런 포우 전자책을 다운로드 받았으면 이를 텍스트 데이터분석을 위한 형태로 변환을 해야 한다. 이를 위해서 가장 먼저 unnest_tokens() 함수를 활용하여 한행에 한줄로 정리된 텍스트 데이터를 깔끔한 텍스트(tidy text) 형태로 변환을 한다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

# 0. 환경설정 ------------------------------
# library(gutenbergr)
# library(tidyverse)
# library(DT)
# library(stringr)
# library(tidytext)
# library(ggthemes)
# library(extrafont)
# loadfonts()


# 2. 깔끔한 텍스트(tidytext) 변환 ---------

poe_tidy_books <- poe_books %>% 
    group_by(title) %>% 
    mutate(linenumber = row_number()) %>% 
    unnest_tokens(word, text) %>% 
    ungroup()

poe_tidy_books %>% 
    count(word, sort=TRUE)
# A tibble: 2,474 x 2
    word     n
   <chr> <int>
 1   the   732
 2    of   492
 3   and   306
 4     i   282
 5     a   225
 6    in   178
 7    to   171
 8   was   109
 9    he   107
10   his   105
# ... with 2,464 more rows

4.1. 긍정/부정어 활용

포우 두 소설에 사용된 긍정어와 부정어를 살펴본다. negativepositive로 감성사전이 구성된 “bing”을 활용하여 가장 많이 언급된 긍부정어를 시각화한다.

# 3. 감성 분석 -------------------
## 3.1. 긍정/부정 단어 -----------
poe_word_counts <- poe_tidy_books %>% 
    inner_join(get_sentiments("bing")) %>% 
    count(word, sentiment)

top_poe_words <- poe_word_counts %>% 
    group_by(sentiment) %>% 
    top_n(20, n) %>% 
    ungroup() %>% 
    mutate(word = reorder(word, n))

ggplot(top_poe_words, aes(word, n, fill = sentiment)) +
    geom_col(show.legend = FALSE) +
    facet_wrap(~sentiment, scales = "free") +  
    coord_flip() +
    labs(x="", y="")

4.2. 감성 추세

감성 변화를 추세로 나타내기 위해서 소설행을 35줄마다 한 단위로 묶고, positive에서 negative를 빼서 감성을 한 점수로 만들어 내고 이를 각 책장마다 붙인 인덱스(index)에 맞춰 추세를 시각화한다.

## 3.2. 시점별 감성변화 --------

poe_tidy_books %>%
    inner_join(get_sentiments("bing")) %>%
    count(title, index = linenumber %/% 35, sentiment) %>%
    spread(sentiment, n, fill = 0) %>%
    mutate(sentiment = positive - negative) %>%
    ggplot(aes(index, sentiment, fill=title)) +
    geom_col() +
    facet_wrap(~title, scales ="free_x") +
    theme_bw(base_family = "NanumGothic") +
    theme(legend.position = "none") +
    labs(x="", y="감성점수", fill="책제목")

4.3. 감성표현에 많이 사용된 단어

nrc 감성사전을 활용하여 각 감정을 표현하는데 많이 사용된 단어를 상위 10개씩 뽑아보자.

## 3.3. 감정을 표현하는데 많이 사용된 단어 -----

poe_tidy_books %>%
    anti_join(data_frame(word ="usher")) %>% 
    inner_join(get_sentiments("nrc")) %>%
    count(word, sentiment) %>%
    group_by(sentiment) %>%
    top_n(10, n) %>%
    ungroup() %>%
    mutate(word = reorder(word, n)) %>%
    ggplot(aes(word, n, fill=sentiment)) +
    geom_col(show.legend = FALSE) +
    facet_wrap(~ sentiment, scales = "free") +
    coord_flip() +
    theme_bw(base_family = "NanumGothic") +
    theme(legend.position = "none") +
    labs(x="", y="", fill="책제목")

4.4. 두 소설 특정 감성에 많이 동원된 단어

두 소설 특정 감성(negative)에 많이 동원된 단어를 시각화한다.

## 3.4. 두 소설 비교 ---------------------

poe_tidy_books %>%
    anti_join(data_frame(word ="usher")) %>% 
    inner_join(get_sentiments("nrc")) %>%
    filter(sentiment %in% c("negative")) %>% 
    count(word, title) %>%
    group_by(title) %>%
    top_n(10, n) %>%
    ungroup() %>%
    mutate(word = reorder(paste(word, title, sep = "__"), n)) %>%
    ggplot(aes(word, n, fill=title)) +
    geom_col(show.legend = FALSE) +
    facet_wrap(~ title, scales = "free") +
    coord_flip() +
    theme_bw(base_family = "NanumGothic") +
    theme(legend.position = "top") +
    labs(x="", y="", fill="책제목") +
    scale_x_discrete(labels = function(x) str_replace_all(x, "__.+$", ""))

 

[출처] https://statkclee.github.io/text/nlp-sentiment.html

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86308
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78760
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95507
22 Docker에서 SQL Server 컨테이너 이미지 구성 file 졸리운_곰 2020.01.23 1554
21 MSSQL 설치형 한글 환경으로 변경 file 졸리운_곰 2020.01.23 2886
20 PRIMARY KEY 와 FOREIGN KEY 를 전부 뽑아주는 쿼리 졸리운_곰 2018.12.16 1773
19 [MSSQL] CASE 문 . 조건에 따라 값 정하기 ! CASE WHEN THEN 졸리운_곰 2018.07.24 1568
18 Track Data Changes (SQL Server) file 졸리운_곰 2018.07.02 1302
17 Docker가 있는 SQL Server 2017 컨테이너 이미지를 실행 하는 빠른 시작 file 졸리운_곰 2018.06.26 1055
16 [MSSQL] Management Studio 이용해 데이터베이스 생성하기 file 졸리운_곰 2018.06.17 1283
15 [MSSQL - GROUP BY HAVING 을 이용한 중복 데이타 체크] file 졸리운_곰 2018.06.15 1280
14 [SQL] select 한 결과로 update 처리, SQL한문장, How to UPDATE from SELECT in SQL Server 졸리운_곰 2018.01.22 1472
13 UNION으로 결과 집합 조합 졸리운_곰 2017.08.27 1341
12 uniqueidentifier(Transact-SQL) file 가을의곰 2017.06.10 1755
11 하위 쿼리를 사용하여 다른 쿼리 또는 식에 쿼리 중첩 [MS-ACCESS : ms offce suit] 가을의곰 2017.06.10 1639
10 [MS-SQL] 테이블명, 컬럼명 검색 졸리운_곰 2017.04.17 1934
9 DB의 모든 테이블에서 데이터 검색 졸리운_곰 2017.04.17 1717
8 Microsoft SQL Server DBA 가이드-DBA라면 이정도는 알아야한다!!! file 졸리운_곰 2017.01.15 1302
7 SQL Server DBA 가이드 file 졸리운_곰 2017.01.15 1685
6 IDENTITY_INSERT가 OFF로 설정되면 ‘테이블명’ 테이블의 ID 열에 명시적 값을 삽입할 수 없습니다 file 졸리운_곰 2017.01.15 1503
5 MS SQL 서버에서 자동증가, autoincrement 처리 file 졸리운_곰 2017.01.15 1773
4 MS SQL 서버의 날짜, 시간 => 문자열 변환 포멧 설명 졸리운_곰 2017.01.15 1215
3 MS SQL 서버 코딩 표준 가이드 file 졸리운_곰 2017.01.14 1654
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED