사회과학 연구를 위한 텍스트 마이닝

목표: 이론에 대한 추론 이끌어 내기

  • 개인과 사회(공동체)에 대한 데이터에서 특정 패턴을 발견하기

  • 추론이란 데이터로부터의 결론이 어떻게 그리고 왜 합당한지를 보여주는 것

  • 데이터 분석을 통해 사회적 현상들 간의 연관성을 도출하고 검증하기 위해서는 다음의 추론방법이 필요함

추론방법의 종류

  • 귀납 논법(Inductive Logic): 데이터 분석으로부터 이론적 일반화/명제 도출

    • 데이터 마이닝이 대표적 귀납법 형태
    • 데이터에서 새로운 변인과 패턴 발견
    • 장점: 1) 이론적 고민과 정교화 투자없이 데이터로부터 결론 도출 가능 2) 유연한 방법으로 데이터의 현실적인 응용 가능성 확대 3) 이전에 알려지지 않은 지식 도출 가능성
    • 단점: 1) 연구 문제 구성 없이 분석을 시작해 목적(함의) 없는 연구 귀결 가능성 2) 선행 연구 지식 기반 없는 연구로 불필요하거나 의미 없는 연구 귀결 가능성 3) 검증된 분석틀 활용 못할 가능성
  • 연역 논법(Deductive Logic): 이론으로부터 도출된 가설을 데이터 분석으로 검증

    • 전통적 사회과학 방법
    • 이론으로 확립된 변인들 통제
  • 귀추, 상정 논법(Abductive Logic): 데이터의 패턴을 잘 설명하는 가설을 선택하는 추론 방식

    • 새로운 생각이나 설명이 도출될 수 있으며 이를 위해선 이론은 물론 데이터에 대한 통찰이 필요
    • 빅데이터 분석에서 가장 중요한 시작점은 데이터에 대한 통찰

Feature Analysis?

분석하고자 하는 텍스트의 의미와 숨은 구조를 가장 잘 보여주는 특징, 성격, 또는 차원이 무엇인지 결정하는 작업

예: 어휘, 동의어, 등장 인물과 관계도, 의미 구조

앞으로 우리가 다루게 될 주제는 대부분 “특징(feature) 추출”과 “지식 공학,” 즉 추출된 정보로부터 지식체계를 구축하는 일

이를 위해서는 숨어있는 언어 구조를 연산 가능한 방식 표시해아 함.

그리고 연산 가능한 방식으로 표시하는 것은 언어를 단위화해야 함, 즉 Tokenization

예: 고유 어휘, 일상적 구문, 문법 단위 등

이러한 작업은 모두 텍스트 자료, 즉 코퍼스에서부터 시작한다.

코퍼스(Corpus)란?

코퍼스는 자연어를 포함하고 있는 관련 문서들의 집합을 말함. 크기는 다양할 수 있음. 중요한 것은, “관련성”

코퍼스는 주석 처리될 수 있음. 주석(Annotation) 처리란 텍스트 또는 문서의 “특징”을 덧붙이는 작업

문서(Document)란?

문서는 텍스트 및 관련 정보를 포함하는 기본 단위 자료: 예: 신문기사, 뉴스, 리뷰

문서는 문단(Paragraph)으로 쪼개질 수 있음. 각 문단은 문서를 구성하는 각각의 아이디어를 표현.

문단은 문장(Sentence)으로 쪼개질 수 있음. 각 문장은 문법 구조를 가지고 있음. 즉, 완결성있는 언어적 표현.

문장은 어휘(Word) 및 문장부호(Punctuation)로 구성되어 있음. 어휘와 부호는 각각의 의미를 내포하고 있지만, 그것들이 함께 사용되며 보다 풍부하고 복잡한 의미를 표현.

마지막으로 어휘는 음절(Syllable), 음소(Phoneme), 접사(Affix) 및 문자(Character)로 구성되고, 이 단위들은 어휘로 조합되어야지만 의미를 표현.

결국, 코퍼스는 어휘 -> 문장 -> 문단 -> 문서 -> 코퍼스라는 위계적 구조로 구성되어 있음.

특정 분야(Domain) 코퍼스

언어학의 이론 검증이나 새로운 언어적 개념 및 이론 제시를 위해서 종종 포괄적 코퍼스(_예: Brown Corpus, Wikipedia Corpus, 또는 Cornell Movie Dialogue Corpus)를 이용.

하지만, 언어 사용 패턴과 그 의미는 분야에 따라 매우 다른 경향을 보임. 예: Credit이라는 어휘는 학교내에서와 은행에서 다른 의미로 사용됨. 따라서 어휘의 의미를 분야 특성에 맞게 학습해야 정확한 예측이 가능

특정 분야에 국한된 코퍼스는 언어 전반에 대한 개념 및 이론을 검증하거나 확장하는데는 비효과적이지만, 텍스트 분석을 통해 정확한(타당성있는) 예측 모델 구축에는 필수적.

특정 분야 코퍼스 구축은 웹스크래핑, API 활용, 또는 RSS 처리 등의 방법을 통해 수집된 자연어 형태의 텍스트를 연산 가능한 구조의 형태로 변환하는 작업(정형화)을 거치게 된다. 그리고, 이 작업은 꽤 복잡하고, 어렵고, 귀찮고, 시간이 오래 걸린다!!!

코퍼스 관리

텍스트 자료의 수집 및 정형화 과정에는 몇가지 고려해야 될 사항들이 있다.

  1. 코퍼스 크기: 연구의 목적 및 기술적 제한사항 고려

  2. 데이터 가공: 수집된 텍스트 자료의 정제와 처리를 통한 구조화 필요 정도 고려

대부분의 가공 전 텍스트 자료는 HTML, JSON, CSV 형태로 제공

코퍼스 구조

코퍼스를 처리 후 분석에 활용하기 위해서는 데이터 구조화하는 것이 필요. 코퍼스 구조는 각 문서의 텍스트(내용)는 물론 문서의 메타정보 및 특징(feature)에 기초해 데이터를 재구성할 수 있는 형태로 조직화하는 것이 중요함.

빅카인즈 자료 구조: 각 문서의 텍스트를 구분해서 저장하고 있을 뿐만 아니라, 문서의 메타정보(Metadata; 저자명, 시간, 장소 등)를 포함시킬 수 있음.

데이터 구조의 장점

  1. 문서를 각각 파일 별로 구분해서 저장할 필요 없어 하나의 데이터로 처리가 손쉬움.
  2. 문서 별로 구별되어 텍스트 처리 과정을 각 문서에 일괄적으로 적용할 수 있음. 예: Tokenization Parsing
  3. 문서의 텍스트 이외에도 메타정보를 표시하고 있기 때문에 이를 기준으로 데이터를 재구성하기 용이

코퍼스 처리

코퍼스의 구조화 및 저장 작업 완료 후에는 코퍼스를 프로그래밍 작업 가능한 형태로 전환시켜야 함.

주의사항: 텍스트의 전처리와 토큰화 및 주석 작업은 컴퓨터 메모리 용량이 고려되어야 함

  1. R objects can be also assigned with characters.
class <- c("text mining", "is simple")
class
## [1] "text mining" "is simple"
print(class)
## [1] "text mining" "is simple"
class = "text mining"

# R is an object-oriented programming language; everything can be assinged to an object
fruits <- c("Apple","Grape","Pear","Apple","Mango","Orange","Mango","Strawberry","Grape","Apple")
sort(fruits) # Return the object, fruits, sorted in alphabetical order for characters
##  [1] "Apple"      "Apple"      "Apple"      "Grape"      "Grape"     
##  [6] "Mango"      "Mango"      "Orange"     "Pear"       "Strawberry"
table(fruits) # See counts of values (elements)
## fruits
##      Apple      Grape      Mango     Orange       Pear Strawberry 
##          3          2          2          1          1          1
unique(fruits) # See unique values (elements)
## [1] "Apple"      "Grape"      "Pear"       "Mango"      "Orange"    
## [6] "Strawberry"
# String data can be a character vector
hello <- c("Hello!", "World", "is", "good!")
print(hello)
## [1] "Hello!" "World"  "is"     "good!"

3-1. Selecting Vector Elements ### By Position

fruits[4] # The fourth element of the vector object, fruits
## [1] "Apple"
fruits[-4] # All but the fourth one
## [1] "Apple"      "Grape"      "Pear"       "Mango"      "Orange"    
## [6] "Mango"      "Strawberry" "Grape"      "Apple"
fruits[2:4] # Elements from the second to the fourth ones
## [1] "Grape" "Pear"  "Apple"
fruits[-(2:4)] # All elements except the second to the fourth ones
## [1] "Apple"      "Mango"      "Orange"     "Mango"      "Strawberry"
## [6] "Grape"      "Apple"
fruits[c(1,5,8)] # Elements the first one and the fifth one
## [1] "Apple"      "Mango"      "Strawberry"

Note that parentheses ( ) follow a certain function and square brakets [ ] select vector elements

  1. You can deal with string objects as follows.
paste(hello, collapse = " ")
## [1] "Hello! World is good!"
hello_paste <- paste(hello, collapse = " ")
strsplit(hello_paste, split = " ")
## [[1]]
## [1] "Hello!" "World"  "is"     "good!"

R functions in the Base Package for text analysis

  1. nchar(): counting the number of characters and the number of bytes
nchar("data")
## [1] 4
# Blank and punctuation marks are also counted 
nchar("text mining") #11? 10? 
## [1] 11
nchar("text, mining") #12? 11.5?
## [1] 12
  1. strsplit(): Sentences are composed of words that consist of characters. In text mining, therefore, we segment sentences into words as tokens, which were pre-processed. Then, we also might need to combine them again.
sent1 <- "Text mining begins with preprocessing and tokenization."
# We split sent1 into seven pieces of words that are separated from each other by white space (blank)
sent1_split <- strsplit(sent1, split=" ") # Parameter (split=" ") specifies a character (here, blank) that separates words as tokens

class(sent1)
## [1] "character"
class(sent1_split)
## [1] "list"
sent1_split
## [[1]]
## [1] "Text"          "mining"        "begins"        "with"         
## [5] "preprocessing" "and"           "tokenization."
class(unlist(sent1_split))
## [1] "character"
sent1_split # returns a list of vectors of words segmented from sent1
## [[1]]
## [1] "Text"          "mining"        "begins"        "with"         
## [5] "preprocessing" "and"           "tokenization."
sent1_split[[1]] # returns the first vector of word segments in the list object, sent1_split
## [1] "Text"          "mining"        "begins"        "with"         
## [5] "preprocessing" "and"           "tokenization."
sent1_split[[1]][5] # returns the fifth element in the first vector of word segments
## [1] "preprocessing"
  1. paste(): We can combine word segments back into a sentence that separates words by blank
sent2 <- paste(sent1_split[[1]], collapse=" ") # Parameter (collapse) specifies how elements in sent1_split are combined. Here, we want to combine word elements into a sentence that separates them by blank (" ").
paste(sent1_split[[1]], collapse="/") 
## [1] "Text/mining/begins/with/preprocessing/and/tokenization."
sent2
## [1] "Text mining begins with preprocessing and tokenization."
  1. Getting Help: We can access the help files about functions and packages.
?c # Get help of a particular function c( )
## starting httpd help server ... done
?strsplit
help.search("split") # Search and return the help files for functions that include a word or phrase
help(package = "stringr") # Find help for a package 

Note1: R is sensitive to lowercase and uppercase letters

word1 = "TEXT"
word1
## [1] "TEXT"
word2 <- "Text"
word2
## [1] "Text"
word1 == word2
## [1] FALSE
word1
## [1] "TEXT"

Note2: Parentheses are for functions but brackets are for selecting a certain element of a vector.

tolower(word1)
## [1] "text"
toupper(word2) 
## [1] "TEXT"

Foundational notions of R language

  1. Vectors
Vectors

Vectors

  - Numeric
  - Logical / Boolean
  - Character

“object-oriented programming language”

dates <- c(20210315, 20210315, 20210316, 20210317)
products <- c("apple","banana","kiwi","melon")
sales <- c("50%", "30%", "40%", "10%")
dates
## [1] 20210315 20210315 20210316 20210317
products
## [1] "apple"  "banana" "kiwi"   "melon"
sales
## [1] "50%" "30%" "40%" "10%"
class(dates)
## [1] "numeric"
class(sales)
## [1] "character"
vec <- c(dates, products, sales)
vec
##  [1] "20210315" "20210315" "20210316" "20210317" "apple"    "banana"  
##  [7] "kiwi"     "melon"    "50%"      "30%"      "40%"      "10%"
class(vec)
## [1] "character"
  1. Lists

    Containers of objects

my_list <- list(dates, products, sales)
my_list
## [[1]]
## [1] 20210315 20210315 20210316 20210317
## 
## [[2]]
## [1] "apple"  "banana" "kiwi"   "melon" 
## 
## [[3]]
## [1] "50%" "30%" "40%" "10%"
class(my_list)
## [1] "list"
class(my_list[[1]])
## [1] "numeric"
class(my_list[[3]])
## [1] "character"
  - Creating lists
  - Subsetting lists
  1. Data frames

    • All components are vectors, no matter whether logical, numerical, or character
    • All vectors must be of the same length
Data frames

Data frames

  1. Packages
library(tidyverse)
  - Select and show a column of a data frame
  - Add a new column
df <- tibble(Date=dates, 
             Product=products,
             Sale=sales)
df
## # A tibble: 4 x 3
##       Date Product Sale 
##      <dbl> <chr>   <chr>
## 1 20210315 apple   50%  
## 2 20210315 banana  30%  
## 3 20210316 kiwi    40%  
## 4 20210317 melon   10%
  1. Functions
Function

Function

CSV 데이터

  1. 데이터 프레임 빅카인즈에서 CSV 형태의 뉴스 데이터를 불러온다.
# 20대 대선 후보 관련 뉴스: 키워드 검색 - "이재명" & "윤석열"

# 중앙지, 방송사  
# 후보 선출 이후부터 선거일 전 기간
# 제목/본문에 키워드 포함
# 중복 기사 제거 (분석제외)

# 엑셀파일 다운로드 폴더 확인
getwd()
## [1] "D:/Dropbox/2022_Class/ITM/R"
# 엑셀파일 불러오기

# install.packages("readxl")
library(readxl)
lee <- read_excel("candidate_lee.xlsx", sheet = 1)
lee
## # A tibble: 12,788 x 19
##    `뉴스 식별자`    일자   언론사 기고자   제목        `통합 분류1` `통합 분류2`
##    <chr>            <chr>  <chr>  <chr>    <chr>       <chr>        <chr>       
##  1 01100101.202203~ 20220~ 경향~  윤호우 ~ "[논설위원~ 사회>여성    사회>사건_~ 
##  2 01100701.202203~ 20220~ 세계~  김주영   "책임 통감~ 정치>선거    정치>국회_~ 
##  3 01100701.202203~ 20220~ 세계~  <NA>     "이재명 “~  정치>선거    정치>청와대 
##  4 08100401.202203~ 20220~ YTN    김태민   "이재명, ~  정치>선거    <NA>        
##  5 08100101.202203~ 20220~ KBS    <NA>     "[풀영상] ~ 정치>선거    정치>국회_~ 
##  6 01101101.202203~ 20220~ 한국~  강유빈   "'잠행 모~  정치>선거    정치>국회_~ 
##  7 08100101.202203~ 20220~ KBS    김익태   "대선 D-1,~ 정치>선거    정치>청와대 
##  8 01100101.202203~ 20220~ 경향~  박홍두·~ "이 “통합~  정치>선거    정치>국회_~ 
##  9 01100201.202203~ 20220~ 국민~  안명진   "[포착] 이~ 정치>선거    정치>청와대 
## 10 01100701.202203~ 20220~ 세계~  <NA>     "이재명, ~  정치>선거    정치>청와대 
## # ... with 12,778 more rows, and 12 more variables: 통합 분류3 <chr>,
## #   사건/사고 분류1 <chr>, 사건/사고 분류2 <chr>, 사건/사고 분류3 <chr>,
## #   인물 <chr>, 위치 <chr>, 기관 <chr>, 키워드 <chr>,
## #   특성추출(가중치순 상위 50개) <chr>, 본문 <chr>, URL <chr>,
## #   분석제외 여부 <lgl>
yoon <- read_excel("candidate_yoon.xlsx", sheet = 1)
yoon
## # A tibble: 16,974 x 19
##    `뉴스 식별자`    일자   언론사 기고자   제목        `통합 분류1` `통합 분류2`
##    <chr>            <chr>  <chr>  <chr>    <chr>       <chr>        <chr>       
##  1 08100401.202203~ 20220~ YTN    계훈희   "윤석열, ~  정치>선거    정치>국회_~ 
##  2 08100401.202203~ 20220~ YTN    이경국   "윤석열, ~  정치>선거    정치>국회_~ 
##  3 01100901.202203~ 20220~ 중앙~  이해준.~ "尹, 강남~  정치>선거    정치>국회_~ 
##  4 08100401.202203~ 20220~ YTN    이경국   "윤석열, ~  정치>선거    <NA>        
##  5 01100701.202203~ 20220~ 세계~  <NA>     "홍준표 \"~ 정치>선거    정치>국회_~ 
##  6 01100701.202203~ 20220~ 세계~  <NA>     "심상정 \"~ 정치>선거    정치>국회_~ 
##  7 08100101.202203~ 20220~ KBS    임연희   "‘대선 D-~  정치>선거    지역>제주   
##  8 01100101.202203~ 20220~ 경향~  김상범 ~ "심상정 “~  정치>선거    정치>국회_~ 
##  9 01100701.202203~ 20220~ 세계~  <NA>     "與 \"尹 '~ 사회>사건_~  정치>행정_~ 
## 10 08100101.202203~ 20220~ KBS    <NA>     "[풀영상] ~ 정치>선거    정치>국회_~ 
## # ... with 16,964 more rows, and 12 more variables: 통합 분류3 <chr>,
## #   사건/사고 분류1 <chr>, 사건/사고 분류2 <chr>, 사건/사고 분류3 <chr>,
## #   인물 <chr>, 위치 <chr>, 기관 <chr>, 키워드 <chr>,
## #   특성추출(가중치순 상위 50개) <chr>, 본문 <chr>, URL <chr>,
## #   분석제외 여부 <chr>
library(tidyverse)
candidate <- bind_rows(lee %>% 
                          mutate(candidate="Lee"),
                       yoon %>% 
                          mutate(candidate="yoon"))

bind_rows(lee %>% mutate(candidate="Lee"),
          yoon %>% mutate(candidate="yoon")) -> candidate
  1. 텍스트 전처리 I *보편적 고려사항: Basic-level
  1. 표준화 (lower-case)
  2. 빈칸 (white space)
  3. 구두점 (punctuation)
  4. 숫자 (digit numbers)
  5. 한국어 이외의 문자 (ASCII code)
  6. URL
library(stringr)
class(candidate)
## [1] "tbl_df"     "tbl"        "data.frame"
class(candidate$`본문`)
## [1] "character"
candidate$`본문`[1:10]
##  [1] "방혜린 군인권센터 상담지원팀장\r\n\r\n\r\n\r\n 1989년생. 2008년 해군사관학교에 입학해 2012년 66기로 졸업했다. 당시 여성 졸업생 중 해병대 지원자가 세 명이었는데, 그중 한 명이었다. 해병대 제2사단 1연대 소대장과 인사장교, 작전보좌관을 역임했다. 2017년 5년간의 군 복무를 마치고 대위로 전역했다. 대학원 진학을 준비하던 중 임태훈 군인권센터 .."                               
##  [2] "노정희 중앙선거관리위원장이 제20대 대통령선거를 하루 앞둔 8일 경기 과천시 중앙선관위에서 대국민 담화 발표를 마친 뒤 이동하고 있다. 과천=뉴시스 제20대 대통령선거 사전투표 부실 관리 논란으로 여론의 질타를 받는 노정희 중앙선거관리위원장이 8일 결국 고개를 숙였다. 전날 ‘책임을 통감하느냐’는 취재진 질문에도 묵묵부답으로 일관했던 그가 하루 만에 대.."                      
##  [3] "이재명 더불어민주당 대선후보가 지난 6일 서울 용산구 용산역 광장에서 열린 ‘위대한 국민의 선택! 이재명입니다!' 유세에서 지지를 호소하고 있다. 국회사진기자단 이재명 더불어민주당 대선후보는 제20대 대선을 하루 앞둔 8일 마지막 방송 연설을 통해 \"대한민국을 위해 일하게 해달라. 대한민국을 제대로 바꿀 가장 크고 유용한 도구를 저 이재명에게 달라\"고 .."                        
##  [4] "[앵커]\r\n더불어민주당 이재명 대선 후보는 지금 이 시각 서울 홍대 앞 거리에서 마지막 유세를 벌이고 있습니다.\r\n\r\n공식 선거운동이 끝나는 자정까지 수도권 청년 유권자를 한 명이라도 더 만나 지지를 호소하는 모습입니다.\r\n\r\n현장에 나가 있는 취재기자 연결합니다. 김태민 기자!\r\n\r\n[기자]\r\n네, 서울 홍대 앞 거리입니다\r\n\r\n[앵커]\r\n이재명 후보, 이제 마지막 유세.." 
##  [5] "[풀영상] 제20대 대선 방송연설 - 이재명 후보"                                                                                                                                                                                                                                                                                                                                     
##  [6] "이재명 더불어민주당 대선후보의 배우자 김혜경씨가 제20대 대통령선거 당일인 9일 경기 성남시 수내동 자택 인근에서 투표에 나선다. \r\n8일 민주당 선거대책위원회에 따르면 김씨는 9일 오후 4시 비공개로 자택 근처 투표소를 찾을 예정이다. 수행 인원도 최소화해 차분히 한 표를 행사한다는 계획이다. \r\n김씨가 공개석상에 모습을 드러내는 건 지난달 9일 기자회견.."                     
##  [7] "[KBS 제주]\r\n [앵커]\r\n\r\n 더불어민주당 역시 지난 22일간 공식 선거운동을 마무리하며 막판 총력 유세를 펼쳤습니다.\r\n\r\n 민주당은 제주도민의 선택을 받아야 대통령이 될 수 있다며 도민들에게 투표 참여를 호소했습니다.\r\n\r\n 보도에 김익태 기자입니다.\r\n\r\n [리포트]\r\n\r\n 민주당은 공식선거운동 마지막 날 제주시 내 도심을 돌며 집중 유세에 나섰습니다.\r\n\r\n 제주.."
##  [8] "1시간 단위로 일정 쪼개며\r\n수도권서 마지막 집중 유세\r\n\r\n\r\n\r\n이재명 더불어민주당 대선 후보는 20대 대선 선거운동 마지막 날인 8일 서울 등 수도권에서 마지막 집중 유세를 벌였다. 서울 여의도 증권가에서 시작해 경기지역을 돈 뒤 서울 광화문광장과 홍익대 앞 거리까지 1시간 단위로 일정을 쪼개어 수도권을 누비는 총력전이었다. 이 후보는 특별기자회견과 유세 .."             
##  [9] "이재명 더불어민주당 대선 후보가 8일 저녁 광화문 광장 인근 청계광장에서 마지막 집중 유세를 진행했다. \r\n \r\n이 후보는 이 자리에서 “지금까지 국민만 바라보고 여기까지 왔던 것처럼 앞으로도 국민만 믿고 앞으로 가겠다”며 “대한민국의 운명과 우리 국민들의 미래가 달린 이 역사적인 대회전의 장에서 마지막 단 한 사람까지 참여해 ‘어게인 2002’, 승리의 .."                     
## [10] "더불어민주당 이재명 대선 후보가 8일 저녁 서울 중구 청계광장에서 열린 '국민의 꿈이 이재명의 꿈입니다' 서울 집중 유세에서 지지자와 시민들에게 인사하고 있다. 국회사진기자단 더불어민주당 이재명 대선 후보는 8일 \"대한민국의 운명과 우리 국민들의 미래가 달린 이 역사적인 대회전의 장에서 마지막 단 한 사람까지 참여해 '어게인 2002', 승리의 역사를 .."
str_split(candidate$`본문`[1:10], pattern=" ")
## [[1]]
##  [1] "방혜린"                       "군인권센터"                  
##  [3] "상담지원팀장\r\n\r\n\r\n\r\n" "1989년생."                   
##  [5] "2008년"                       "해군사관학교에"              
##  [7] "입학해"                       "2012년"                      
##  [9] "66기로"                       "졸업했다."                   
## [11] "당시"                         "여성"                        
## [13] "졸업생"                       "중"                          
## [15] "해병대"                       "지원자가"                    
## [17] "세"                           "명이었는데,"                 
## [19] "그중"                         "한"                          
## [21] "명이었다."                    "해병대"                      
## [23] "제2사단"                      "1연대"                       
## [25] "소대장과"                     "인사장교,"                   
## [27] "작전보좌관을"                 "역임했다."                   
## [29] "2017년"                       "5년간의"                     
## [31] "군"                           "복무를"                      
## [33] "마치고"                       "대위로"                      
## [35] "전역했다."                    "대학원"                      
## [37] "진학을"                       "준비하던"                    
## [39] "중"                           "임태훈"                      
## [41] "군인권센터"                   ".."                          
## 
## [[2]]
##  [1] "노정희"               "중앙선거관리위원장이" "제20대"              
##  [4] "대통령선거를"         "하루"                 "앞둔"                
##  [7] "8일"                  "경기"                 "과천시"              
## [10] "중앙선관위에서"       "대국민"               "담화"                
## [13] "발표를"               "마친"                 "뒤"                  
## [16] "이동하고"             "있다."                "과천=뉴시스"         
## [19] "제20대"               "대통령선거"           "사전투표"            
## [22] "부실"                 "관리"                 "논란으로"            
## [25] "여론의"               "질타를"               "받는"                
## [28] "노정희"               "중앙선거관리위원장이" "8일"                 
## [31] "결국"                 "고개를"               "숙였다."             
## [34] "전날"                 "‘책임을"             "통감하느냐’는"      
## [37] "취재진"               "질문에도"             "묵묵부답으로"        
## [40] "일관했던"             "그가"                 "하루"                
## [43] "만에"                 "대.."                
## 
## [[3]]
##  [1] "이재명"         "더불어민주당"   "대선후보가"     "지난"          
##  [5] "6일"            "서울"           "용산구"         "용산역"        
##  [9] "광장에서"       "열린"           "‘위대한"       "국민의"        
## [13] "선택!"          "이재명입니다!'" "유세에서"       "지지를"        
## [17] "호소하고"       "있다."          "국회사진기자단" "이재명"        
## [21] "더불어민주당"   "대선후보는"     "제20대"         "대선을"        
## [25] "하루"           "앞둔"           "8일"            "마지막"        
## [29] "방송"           "연설을"         "통해"           "\"대한민국을"  
## [33] "위해"           "일하게"         "해달라."        "대한민국을"    
## [37] "제대로"         "바꿀"           "가장"           "크고"          
## [41] "유용한"         "도구를"         "저"             "이재명에게"    
## [45] "달라\"고"       ".."            
## 
## [[4]]
##  [1] "[앵커]\r\n더불어민주당"             "이재명"                            
##  [3] "대선"                               "후보는"                            
##  [5] "지금"                               "이"                                
##  [7] "시각"                               "서울"                              
##  [9] "홍대"                               "앞"                                
## [11] "거리에서"                           "마지막"                            
## [13] "유세를"                             "벌이고"                            
## [15] "있습니다.\r\n\r\n공식"              "선거운동이"                        
## [17] "끝나는"                             "자정까지"                          
## [19] "수도권"                             "청년"                              
## [21] "유권자를"                           "한"                                
## [23] "명이라도"                           "더"                                
## [25] "만나"                               "지지를"                            
## [27] "호소하는"                           "모습입니다.\r\n\r\n현장에"         
## [29] "나가"                               "있는"                              
## [31] "취재기자"                           "연결합니다."                       
## [33] "김태민"                             "기자!\r\n\r\n[기자]\r\n네,"        
## [35] "서울"                               "홍대"                              
## [37] "앞"                                 "거리입니다\r\n\r\n[앵커]\r\n이재명"
## [39] "후보,"                              "이제"                              
## [41] "마지막"                             "유세.."                            
## 
## [[5]]
## [1] "[풀영상]" "제20대"   "대선"     "방송연설" "-"        "이재명"   "후보"    
## 
## [[6]]
##  [1] "이재명"           "더불어민주당"     "대선후보의"       "배우자"          
##  [5] "김혜경씨가"       "제20대"           "대통령선거"       "당일인"          
##  [9] "9일"              "경기"             "성남시"           "수내동"          
## [13] "자택"             "인근에서"         "투표에"           "나선다."         
## [17] "\r\n8일"          "민주당"           "선거대책위원회에" "따르면"          
## [21] "김씨는"           "9일"              "오후"             "4시"             
## [25] "비공개로"         "자택"             "근처"             "투표소를"        
## [29] "찾을"             "예정이다."        "수행"             "인원도"          
## [33] "최소화해"         "차분히"           "한"               "표를"            
## [37] "행사한다는"       "계획이다."        "\r\n김씨가"       "공개석상에"      
## [41] "모습을"           "드러내는"         "건"               "지난달"          
## [45] "9일"              "기자회견.."      
## 
## [[7]]
##  [1] "[KBS"                  "제주]\r\n"             "[앵커]\r\n\r\n"       
##  [4] "더불어민주당"          "역시"                  "지난"                 
##  [7] "22일간"                "공식"                  "선거운동을"           
## [10] "마무리하며"            "막판"                  "총력"                 
## [13] "유세를"                "펼쳤습니다.\r\n\r\n"   "민주당은"             
## [16] "제주도민의"            "선택을"                "받아야"               
## [19] "대통령이"              "될"                    "수"                   
## [22] "있다며"                "도민들에게"            "투표"                 
## [25] "참여를"                "호소했습니다.\r\n\r\n" "보도에"               
## [28] "김익태"                "기자입니다.\r\n\r\n"   "[리포트]\r\n\r\n"     
## [31] "민주당은"              "공식선거운동"          "마지막"               
## [34] "날"                    "제주시"                "내"                   
## [37] "도심을"                "돌며"                  "집중"                 
## [40] "유세에"                "나섰습니다.\r\n\r\n"   "제주.."               
## 
## [[8]]
##  [1] "1시간"                      "단위로"                    
##  [3] "일정"                       "쪼개며\r\n수도권서"        
##  [5] "마지막"                     "집중"                      
##  [7] "유세\r\n\r\n\r\n\r\n이재명" "더불어민주당"              
##  [9] "대선"                       "후보는"                    
## [11] "20대"                       "대선"                      
## [13] "선거운동"                   "마지막"                    
## [15] "날인"                       "8일"                       
## [17] "서울"                       "등"                        
## [19] "수도권에서"                 "마지막"                    
## [21] "집중"                       "유세를"                    
## [23] "벌였다."                    "서울"                      
## [25] "여의도"                     "증권가에서"                
## [27] "시작해"                     "경기지역을"                
## [29] "돈"                         "뒤"                        
## [31] "서울"                       "광화문광장과"              
## [33] "홍익대"                     "앞"                        
## [35] "거리까지"                   "1시간"                     
## [37] "단위로"                     "일정을"                    
## [39] "쪼개어"                     "수도권을"                  
## [41] "누비는"                     "총력전이었다."             
## [43] "이"                         "후보는"                    
## [45] "특별기자회견과"             "유세"                      
## [47] ".."                        
## 
## [[9]]
##  [1] "이재명"       "더불어민주당" "대선"         "후보가"       "8일"         
##  [6] "저녁"         "광화문"       "광장"         "인근"         "청계광장에서"
## [11] "마지막"       "집중"         "유세를"       "진행했다."    "\r\n"        
## [16] "\r\n이"       "후보는"       "이"           "자리에서"     "“지금까지"  
## [21] "국민만"       "바라보고"     "여기까지"     "왔던"         "것처럼"      
## [26] "앞으로도"     "국민만"       "믿고"         "앞으로"       "가겠다”며"  
## [31] "“대한민국의" "운명과"       "우리"         "국민들의"     "미래가"      
## [36] "달린"         "이"           "역사적인"     "대회전의"     "장에서"      
## [41] "마지막"       "단"           "한"           "사람까지"     "참여해"      
## [46] "‘어게인"     "2002’,"      "승리의"       ".."          
## 
## [[10]]
##  [1] "더불어민주당"   "이재명"         "대선"           "후보가"        
##  [5] "8일"            "저녁"           "서울"           "중구"          
##  [9] "청계광장에서"   "열린"           "'국민의"        "꿈이"          
## [13] "이재명의"       "꿈입니다'"      "서울"           "집중"          
## [17] "유세에서"       "지지자와"       "시민들에게"     "인사하고"      
## [21] "있다."          "국회사진기자단" "더불어민주당"   "이재명"        
## [25] "대선"           "후보는"         "8일"            "\"대한민국의"  
## [29] "운명과"         "우리"           "국민들의"       "미래가"        
## [33] "달린"           "이"             "역사적인"       "대회전의"      
## [37] "장에서"         "마지막"         "단"             "한"            
## [41] "사람까지"       "참여해"         "'어게인"        "2002',"        
## [45] "승리의"         "역사를"         ".."
sort(table(str_split(candidate$`본문`[1], pattern=" ")), decreasing = TRUE)
## 
##                   군인권센터                           중 
##                            2                            2 
##                       해병대                           .. 
##                            2                            1 
##                    1989년생.                        1연대 
##                            1                            1 
##                       2008년                       2012년 
##                            1                            1 
##                       2017년                      5년간의 
##                            1                            1 
##                       66기로                           군 
##                            1                            1 
##                         그중                         당시 
##                            1                            1 
##                       대위로                       대학원 
##                            1                            1 
##                       마치고                  명이었는데, 
##                            1                            1 
##                    명이었다.                       방혜린 
##                            1                            1 
##                       복무를 상담지원팀장\r\n\r\n\r\n\r\n 
##                            1                            1 
##                           세                     소대장과 
##                            1                            1 
##                         여성                    역임했다. 
##                            1                            1 
##                    인사장교,                       임태훈 
##                            1                            1 
##                       입학해                 작전보좌관을 
##                            1                            1 
##                    전역했다.                      제2사단 
##                            1                            1 
##                       졸업생                    졸업했다. 
##                            1                            1 
##                     준비하던                     지원자가 
##                            1                            1 
##                       진학을                           한 
##                            1                            1 
##               해군사관학교에 
##                            1
keywords_list <- str_split(candidate$`본문`[1:10], pattern=" ")

keywords_vec <- unlist(keywords_list)

sort(table(keywords_vec), decreasing = TRUE)[1:50]
## keywords_vec
##               마지막         더불어민주당                 서울 
##                   10                    8                    8 
##               이재명                  8일                 대선 
##                    8                    7                    7 
##                   ..                   이               제20대 
##                    5                    5                    5 
##                 집중                   한               후보는 
##                    5                    5                    5 
##               유세를                  9일                   앞 
##                    4                    3                    3 
##                있다.                 하루                1시간 
##                    3                    3                    2 
##                 경기             국민들의               국민만 
##                    2                    2                    2 
##       국회사진기자단           군인권센터               노정희 
##                    2                    2                    2 
##                   단               단위로                 달린 
##                    2                    2                    2 
##           대통령선거             대회전의                   뒤 
##                    2                    2                    2 
##               미래가             민주당은             사람까지 
##                    2                    2                    2 
##               승리의                 앞둔             역사적인 
##                    2                    2                    2 
##                 열린                 우리               운명과 
##                    2                    2                    2 
##             유세에서                 자택               장에서 
##                    2                    2                    2 
##                 저녁                   중 중앙선거관리위원장이 
##                    2                    2                    2 
##                 지난               지지를               참여해 
##                    2                    2                    2 
##         청계광장에서               해병대 
##                    2                    2