기계학습(머신러닝)이란?

“데이터 혹은 과거의 경험을 이용해서 명시적으로 정의되지 않은 패턴을 컴퓨터로 학습하여 새로운 데이터에 대한 예측을 내리는데 사용되는 방법”

기계학습 과정?

  1. 데이터 수집 및 준비
  2. 특성 추출
  3. 알고리즘 및 모델 선택
  4. 학습
  5. 결과 평가

학습이란?

데이터에서 추출된 특성(독립변인)으로 각 사례의 결과값(종속변인)에 대한 예측을 내릴 수 있는 특성들의 패턴을 발견하는 과정

왜 기계학습인가?

텍스트 마이닝에서 기계학습은 텍스트 분류(classification)와 텍스트 군집화(clustering)에 활용된다.

텍스트 분류

지도기계학습(supervised machine learning) 방법으로 인간이 미리 분류한 텍스트 데이터에서 패턴을 학습한 컴퓨터가 분류되어 있지 않은 텍스트에 대한 분류 예측을 내림

예) 스팸 필터

텍스트 군집화

비지도기계학습(unsupervised machine learning) 방법으로 인간의 분류 자료 없이 컴퓨터가 스스로 데이터의 패턴을 도출해 비슷한 패턴의 텍스트끼리 군집화

예) 기사 주제별 묶음

텍스트 마이닝의 기계학습 시 고려 사항

1. 기계학습의 목적이 무엇인가?

  • 예측이냐? 설명이냐?

2. 종속 변수를 무엇으로 할 것인가?

  • 미리 정해진 값? 인간 코딩이 필요한 값? 알 수 없는 값?

3. 독립 변수(텍스트 특성)를 무엇으로 할 것인가?

  • 다양한 특성 추출 방식

4. 어떤 알고리즘을 사용할 것인가? 알고리즘을 비교할 것인가?

기계학습을 위한 데이터 구조화

텍스트 자료를 문서-용어 행렬로 구조화하는 과정

Docuemnt-Term Matrix(DTM) or Docuemnt-Feature Matrix(DFM)

문서 분류 또는 군집화를 위한 기계학습 알고리즘은 행이 각 문서를 열은 각 특성(어휘)을 숫자로 표시하도록 구성된 2차원의 행렬에서 작동한다. 결국, 텍스트의 분류 또는 군집화를 위해서는 각 문서가 벡터로서 표현(representation)되도록 변환(transformation)하는 작업이 필요하고 우리는 이를 특성 추출(feature extraction) 또는 간략하게 벡터화(vectorization)라 부른다. 이 단계가 곧 텍스트 마이닝의 시작이다.

벡터? 모든 원소가 같은 데이터 속성을 갖는 1차원 데이터 구조

텍스트의 특성을 추출하는 작업은 대부분 문서(document) 단위로 이뤄진다. 각 문서의 내용(content)은 물론 길이, 저자, 출처, 게시 날짜 등의 메타 정보가 특성을 구성한다. 이러한 복수의 특성을 바탕으로 문서의 분류 및 군집화가 이뤄진다.

이러한 관점에서 언어는 일련의 어휘들이 조합이라기 보다는 고차원의 의미(semantic) 공간을 구성하는 접점들이다. 공간의 접점들은 촘촘하게 떼를 짓기도 띄엄띄엄 퍼져 있기도, 또는 일정하게 고루 분포되어 있을 수도 있다. 결국, 의미 공간에서 가깝게 표시되는 문서들은 비슷한 의미를 띄고 있고, 멀리 떨어져 위치하면 상당히 다른 의미를 보이는 것으로 이해될 수 있다. 의미 공간에 각 문서의 특성을 위치시키는 작업이 필요하고 이를 위해서는 의미 공간의 인코딩 작업이 필요하다.

의미 공간(semantic space)의 인코딩(부호화) 작업 중 가장 간단한 방법은 단어주머니(bag-of-words, BOW) 모델로서, 단어들에 의해 문서의 의미와 유사도가 측정될 수 있음을 보여준다. 즉, 비슷한 의미를 전단하는 문서들은 결국 비슷한 단어들로 구성되어 있따는 전제로서 의미 공간을 도출하는 것이다. 또한, 전혀 다른 주제(의미)를 표현하는 문서들과는 겹치는 단어들이 적을 것이다. 따라서 단어주머니 모델은 간단하지만 꽤 효과적인 의미 공간을 표현한다(=벡터화).

Words in Space

BOW 방식의 벡터화는 해당 코퍼스의 모든 문서에 등장하는 모든 단어들을 모아 리스트로 만들어 각 문서가 어떤 단어들로 구성되어 있는지 파악하여, 각 문서별로 -> 각 단어의 출현 빈도수를 측정하는 것. 그리고 벡터 인코딩(벡터화)은 frequency(BOW), one-hot, TF-IDF 및 숫자로 표현(distributed representation) 등의 방법으로 산출 가능하다.

Encoding documents as vectors

Encoding documents as vectors

그럼 각 벡터의 숫자는 어떻게 정해지는가?

  1. Frequency
  2. One-hot encoding
  3. TF-IDF
  4. Distributed representations (추후에..)

각 문서의 벡터화를 위해서는 다음의 텍스트 전처리 과정이 필요하다. 1) 문자 표준화 (대문자, 영어 vs 한국어) 2) 구두점 제거 3) Stemming 또는 Lemmatization (벡터 단순화) 4) 불용어(stopwords) 제거

대부분의 자연어처리 패키지들은 전처리 작업에 필요한 함수와 사전을 제공함.

의미 공간 인코딩 작업을 차례대로 살펴보자

1. 데이터 불러오기

# 
library(readxl)
cv <- read_excel("bigkinds_corona_vaccine.xlsx", sheet = 1)

2. 분석을 위한 형태로 데이터 준비하기 (전처리 포함)

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.3.3     √ purrr   0.3.4
## √ tibble  3.1.0     √ dplyr   1.0.4
## √ tidyr   1.1.2     √ stringr 1.4.0
## √ readr   1.3.1     √ forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
cv_df <- cv %>% 
  select(DATE, COMPANY, KEYWORD, FEATURE, TEXT) %>% 
  filter(!duplicated(TEXT)) %>% 
  mutate(DATE = ymd(DATE))
head(cv_df)
## # A tibble: 6 x 5
##   DATE       COMPANY  KEYWORD              FEATURE             TEXT             
##   <date>     <chr>    <chr>                <chr>               <chr>            
## 1 2021-03-17 조선일보 코로나,백신,접종,요양,병원,종사자~ 종사자,충북,코로나,a씨,원무과,~ "충북에서도 백신 1차 접종자~
## 2 2021-03-17 중앙일보 임신,백신,엄마,아기,코로나,항체,~ 미국,코로나,임산부,모더나,연구원~ "미국에서 임신 중 코로나 1~
## 3 2021-03-17 조선일보 코로나,백신,독려,광고,트럼프,백신~ 코로나,미국,폭스,유튜브,회의론자~ "도널드 트럼프 전 미국 대통~
## 4 2021-03-17 영남일보 포항가속기,최고,인류,사상,코로나,~ 가속기,포항가속기연구소,시딩,강흥~ "인류 사상 최고 밝기의 빛이~
## 5 2021-03-17 세계일보 코로나,전문가,코로나,바이러스,백신~ 코로나19,악시오스,미국,피콕,부~ "미국 제약사 화이자의 코로나~
## 6 2021-03-17 국민일보 임신,코로나,백신,엄마,항체,보유,~ 미국,코로나19,모더나,플로리다주~ "미국에서 임신 중 코로나19~

3. 특성 추출

1) 형태소 분석 후 실질형태소만 남기기

한국어 문자열을 단어 단위로 토큰화하기 위해서는 형태소 분석을 시행해야 함. 형태소란 “일정한 의미가 있는 가장 작은 말의 내에서 따로 떼어낼 수 있는 것으로 더 분석하면 뜻이 없어지는 말의 단위”임.

  • 실질(어휘)형태소: 어휘적 의미가 있는 형태소로 어떤 대상이나 상태, 동작을 가리키는 형태소. Ex) 명사, 동사, 형용사, 부사
  • 형식(문법)형태소: 문법적 의미가 있는 형태소로 실질형태소와 함께 쓰여 그들 사이의 관계를 나타내는 기능을 하는 형태소. Ex) 조사, 어미

품사 태그 설명

library(RcppMeCab) # 형태소 분석
library(future.apply) # 병렬 작업
## Loading required package: future
plan(multicore)

cv_df$TEXT[1:5]
## [1] "충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대.."
## [2] "미국에서 임신 중 코로나 19 백신을 접종한 여성이 항체를 가진 아기를 출산했다. \r\n \r\n 16일(현지시간) 미국 WPBF방송과 영국 가디언 등에 따르면 미국 플로리다 팜비치 카운티에서 출산 전 코로나 19 백신을 맞은 여성이 낳은 아기가 항체를 가진 것이 확인됐다. \r\n \r\n 의료 종사자인 이 여성은 임신 36주차이던 지난 1월 미국 제약업체 모더나가 개발.."        
## [3] "도널드 트럼프 전 미국 대통령이 16일(현지 시각) 폭스 뉴스와의 인터뷰에서 자신의 지지자들에게 코로나 백신을 맞으라고 당부했다. 수개월동안 코로나 백신 접종에 관심을 두지 않던 트럼프 전 대통령이 공개적으로 백신 접종을 권한 것이다. \r\n \r\n폭스뉴스와 USA투데이 등에 따르면, 트럼프 전 대통령은 이날 20분간 진행된 폭스 뉴스와의 전화 인터뷰에서 “안.."  
## [4] "인류 사상 최고 밝기의 빛이 국내 연구진에 의해 개발됐다.\r\n\r\n포항가속기연구소(PAL)는 16일 강흥식 박사 연구팀이 4세대 방사광가속기(선형)의 셀프시딩(Self-Seeding) 시스템을 개발해 인류가 만든 빛 중에서 최고 밝기의 빛을 만드는 데 성공했다고 밝혔다. 이번 연구는 광학 분야의 국제학술지인 네이처 포토닉스 15일자(현지시각)에 실렸다.\r\n\r\n포.."        
## [5] "미국 제약사 화이자의 코로나19 백신. AFP연합뉴스 신종 코로나바이러스 감염증(코로나19)을 일으키는 바이러스의 변이가 사라지지 않아 백신을 평생 맞아야 할 수 있다는 예상이 나왔다. \r\n \r\n 로이터 통신은 15일(현지시간) 영국 코로나19 유전체학 컨소시엄(COG-UK) 국장인 샤론 피콕 교수가 기존 백신을 보강하는 이른바 '부스터 샷'을 정기적으로 .."
str_squish(cv_df$TEXT[1])
## [1] "충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. 17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. A씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. 1분기 접종 대.."
str_squish(cv_df$TEXT[2])
## [1] "미국에서 임신 중 코로나 19 백신을 접종한 여성이 항체를 가진 아기를 출산했다. 16일(현지시간) 미국 WPBF방송과 영국 가디언 등에 따르면 미국 플로리다 팜비치 카운티에서 출산 전 코로나 19 백신을 맞은 여성이 낳은 아기가 항체를 가진 것이 확인됐다. 의료 종사자인 이 여성은 임신 36주차이던 지난 1월 미국 제약업체 모더나가 개발.."
str_squish(cv_df$TEXT[3])
## [1] "도널드 트럼프 전 미국 대통령이 16일(현지 시각) 폭스 뉴스와의 인터뷰에서 자신의 지지자들에게 코로나 백신을 맞으라고 당부했다. 수개월동안 코로나 백신 접종에 관심을 두지 않던 트럼프 전 대통령이 공개적으로 백신 접종을 권한 것이다. 폭스뉴스와 USA투데이 등에 따르면, 트럼프 전 대통령은 이날 20분간 진행된 폭스 뉴스와의 전화 인터뷰에서 “안.."
str_squish(cv_df$TEXT[4])
## [1] "인류 사상 최고 밝기의 빛이 국내 연구진에 의해 개발됐다. 포항가속기연구소(PAL)는 16일 강흥식 박사 연구팀이 4세대 방사광가속기(선형)의 셀프시딩(Self-Seeding) 시스템을 개발해 인류가 만든 빛 중에서 최고 밝기의 빛을 만드는 데 성공했다고 밝혔다. 이번 연구는 광학 분야의 국제학술지인 네이처 포토닉스 15일자(현지시각)에 실렸다. 포.."
str_squish(cv_df$TEXT[5])
## [1] "미국 제약사 화이자의 코로나19 백신. AFP연합뉴스 신종 코로나바이러스 감염증(코로나19)을 일으키는 바이러스의 변이가 사라지지 않아 백신을 평생 맞아야 할 수 있다는 예상이 나왔다. 로이터 통신은 15일(현지시간) 영국 코로나19 유전체학 컨소시엄(COG-UK) 국장인 샤론 피콕 교수가 기존 백신을 보강하는 이른바 '부스터 샷'을 정기적으로 .."
# 함수 적용

?lapply
## starting httpd help server ...
##  done
?sapply

class(lapply(cv_df$TEXT[1:5], str_squish))
## [1] "list"
class(sapply(cv_df$TEXT[1:5], str_squish))
## [1] "character"

함수 적용하기

pos(cv_df$TEXT[1:2])
## $...
##  [1] "충북/NNP"    "에서/JKB"    "도/JX"       "백신/NNG"    "1/SN"       
##  [6] "차/NNBC"     "접종/NNG"    "자/XSN"      "의/JKG"      "코로나/NNP" 
## [11] "확진/NNG"    "판정/NNG"    "사례/NNG"    "가/JKS"      "나왔/VV+EP" 
## [16] "다/EF"       "./SF"        "17/SN"       "일/NNBC"     "충북/NNP"   
## [21] "도/JX"       "등/NNB"      "에/JKB"      "따르/VV"     "면/EC"      
## [26] "충주시/NNP"  "모/NNG"      "요양/NNG"    "병원/NNG"    "원무/NNG"   
## [31] "과/NNG"      "에서/JKB"    "근무/NNG"    "하/XSV"      "는/ETM"     
## [36] "30/SN"       "대/NNBC"     "A/SL"        "씨/NNB"      "가/JKS"     
## [41] "이날/NNG"    "코로나/NNP"  "‘/SY"       "양성/NNG"    "’/SY"      
## [46] "판정/NNG"    "을/JKO"      "받/VV"       "았/EP"       "다/EF"      
## [51] "./SF"        "A/SL"        "씨/NNB"      "는/JX"       "매주/MAG"   
## [56] "두/MM"       "차례/NNG"    "씩/XSN"      "진행/NNG"    "되/XSV"     
## [61] "는/ETM"      "요양/NNG"    "시설/NNG"    "종사자/NNG"  "등/NNB"     
## [66] "에/JKB"      "대한/VV+ETM" "선제/NNG"    "검사/NNG"    "에서/JKB"   
## [71] "양성/NNG"    "으로/JKB"    "나왔/VV+EP"  "다/EF"       "./SF"       
## [76] "지난/VV+ETM" "12/SN"       "일/NNBC"     "직전/NNG"    "검사/NNG"   
## [81] "에서/JKB"    "는/JX"       "음성/NNG"    "판정/NNG"    "을/JKO"     
## [86] "받/VV"       "았/EP"       "다/EF"       "./SF"        "1/SN"       
## [91] "분기/NNG"    "접종/NNG"    "대/VV+EF"    "./SF"        "./SF"       
## 
## $...
##  [1] "미국/NNP"     "에서/JKB"     "임신/NNG"     "중/NNB"       "코로나/NNP"  
##  [6] "19/SN"        "백신/NNG"     "을/JKO"       "접종/NNG"     "한/XSV+ETM"  
## [11] "여성/NNG"     "이/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM" 
## [16] "아기/NNG"     "를/JKO"       "출산/NNG"     "했/XSV+EP"    "다/EF"       
## [21] "./SF"         "16/SN"        "일/NNBC"      "(/SSO"        "현지/NNG"    
## [26] "시간/NNG"     ")/SSC"        "미국/NNP"     "WPBF/SL"      "방송/NNG"    
## [31] "과/JC"        "영국/NNP"     "가디언/NNP"   "등/NNB"       "에/JKB"      
## [36] "따르/VV"      "면/EC"        "미국/NNP"     "플로리다/NNP" "팜비치/NNP"  
## [41] "카운티/NNP"   "에서/JKB"     "출산/NNG"     "전/NNG"       "코로나/NNP"  
## [46] "19/SN"        "백신/NNG"     "을/JKO"       "맞/VV"        "은/ETM"      
## [51] "여성/NNG"     "이/JKS"       "낳/VV"        "은/ETM"       "아기/NNG"    
## [56] "가/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM"  "것/NNB"      
## [61] "이/JKS"       "확인/NNG"     "됐/XSV+EP"    "다/EF"        "./SF"        
## [66] "의료/NNG"     "종사자/NNG"   "인/VCP+ETM"   "이/MM"        "여성/NNG"    
## [71] "은/JX"        "임신/NNG"     "36/SN"        "주/NNBC"      "차이/VV"     
## [76] "던/ETM"       "지난/VV+ETM"  "1/SN"         "월/NNBC"      "미국/NNP"    
## [81] "제약/NNG"     "업체/NNG"     "모더/NNP"     "나/NP"        "가/JKS"      
## [86] "개발/NNG"     "./SF"         "./SF"
class(pos(cv_df$TEXT[1:2]))
## [1] "list"
sapply(cv_df$TEXT[1:2], pos)
## $...
##  [1] "충북/NNP"    "에서/JKB"    "도/JX"       "백신/NNG"    "1/SN"       
##  [6] "차/NNBC"     "접종/NNG"    "자/XSN"      "의/JKG"      "코로나/NNP" 
## [11] "확진/NNG"    "판정/NNG"    "사례/NNG"    "가/JKS"      "나왔/VV+EP" 
## [16] "다/EF"       "./SF"        "17/SN"       "일/NNBC"     "충북/NNP"   
## [21] "도/JX"       "등/NNB"      "에/JKB"      "따르/VV"     "면/EC"      
## [26] "충주시/NNP"  "모/NNG"      "요양/NNG"    "병원/NNG"    "원무/NNG"   
## [31] "과/NNG"      "에서/JKB"    "근무/NNG"    "하/XSV"      "는/ETM"     
## [36] "30/SN"       "대/NNBC"     "A/SL"        "씨/NNB"      "가/JKS"     
## [41] "이날/NNG"    "코로나/NNP"  "‘/SY"       "양성/NNG"    "’/SY"      
## [46] "판정/NNG"    "을/JKO"      "받/VV"       "았/EP"       "다/EF"      
## [51] "./SF"        "A/SL"        "씨/NNB"      "는/JX"       "매주/MAG"   
## [56] "두/MM"       "차례/NNG"    "씩/XSN"      "진행/NNG"    "되/XSV"     
## [61] "는/ETM"      "요양/NNG"    "시설/NNG"    "종사자/NNG"  "등/NNB"     
## [66] "에/JKB"      "대한/VV+ETM" "선제/NNG"    "검사/NNG"    "에서/JKB"   
## [71] "양성/NNG"    "으로/JKB"    "나왔/VV+EP"  "다/EF"       "./SF"       
## [76] "지난/VV+ETM" "12/SN"       "일/NNBC"     "직전/NNG"    "검사/NNG"   
## [81] "에서/JKB"    "는/JX"       "음성/NNG"    "판정/NNG"    "을/JKO"     
## [86] "받/VV"       "았/EP"       "다/EF"       "./SF"        "1/SN"       
## [91] "분기/NNG"    "접종/NNG"    "대/VV+EF"    "./SF"        "./SF"       
## 
## $...
##  [1] "미국/NNP"     "에서/JKB"     "임신/NNG"     "중/NNB"       "코로나/NNP"  
##  [6] "19/SN"        "백신/NNG"     "을/JKO"       "접종/NNG"     "한/XSV+ETM"  
## [11] "여성/NNG"     "이/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM" 
## [16] "아기/NNG"     "를/JKO"       "출산/NNG"     "했/XSV+EP"    "다/EF"       
## [21] "./SF"         "16/SN"        "일/NNBC"      "(/SSO"        "현지/NNG"    
## [26] "시간/NNG"     ")/SSC"        "미국/NNP"     "WPBF/SL"      "방송/NNG"    
## [31] "과/JC"        "영국/NNP"     "가디언/NNP"   "등/NNB"       "에/JKB"      
## [36] "따르/VV"      "면/EC"        "미국/NNP"     "플로리다/NNP" "팜비치/NNP"  
## [41] "카운티/NNP"   "에서/JKB"     "출산/NNG"     "전/NNG"       "코로나/NNP"  
## [46] "19/SN"        "백신/NNG"     "을/JKO"       "맞/VV"        "은/ETM"      
## [51] "여성/NNG"     "이/JKS"       "낳/VV"        "은/ETM"       "아기/NNG"    
## [56] "가/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM"  "것/NNB"      
## [61] "이/JKS"       "확인/NNG"     "됐/XSV+EP"    "다/EF"        "./SF"        
## [66] "의료/NNG"     "종사자/NNG"   "인/VCP+ETM"   "이/MM"        "여성/NNG"    
## [71] "은/JX"        "임신/NNG"     "36/SN"        "주/NNBC"      "차이/VV"     
## [76] "던/ETM"       "지난/VV+ETM"  "1/SN"         "월/NNBC"      "미국/NNP"    
## [81] "제약/NNG"     "업체/NNG"     "모더/NNP"     "나/NP"        "가/JKS"      
## [86] "개발/NNG"     "./SF"         "./SF"
class(sapply(cv_df$TEXT[1:2], pos))
## [1] "list"
pos(cv_df$TEXT[1:2])
## $...
##  [1] "충북/NNP"    "에서/JKB"    "도/JX"       "백신/NNG"    "1/SN"       
##  [6] "차/NNBC"     "접종/NNG"    "자/XSN"      "의/JKG"      "코로나/NNP" 
## [11] "확진/NNG"    "판정/NNG"    "사례/NNG"    "가/JKS"      "나왔/VV+EP" 
## [16] "다/EF"       "./SF"        "17/SN"       "일/NNBC"     "충북/NNP"   
## [21] "도/JX"       "등/NNB"      "에/JKB"      "따르/VV"     "면/EC"      
## [26] "충주시/NNP"  "모/NNG"      "요양/NNG"    "병원/NNG"    "원무/NNG"   
## [31] "과/NNG"      "에서/JKB"    "근무/NNG"    "하/XSV"      "는/ETM"     
## [36] "30/SN"       "대/NNBC"     "A/SL"        "씨/NNB"      "가/JKS"     
## [41] "이날/NNG"    "코로나/NNP"  "‘/SY"       "양성/NNG"    "’/SY"      
## [46] "판정/NNG"    "을/JKO"      "받/VV"       "았/EP"       "다/EF"      
## [51] "./SF"        "A/SL"        "씨/NNB"      "는/JX"       "매주/MAG"   
## [56] "두/MM"       "차례/NNG"    "씩/XSN"      "진행/NNG"    "되/XSV"     
## [61] "는/ETM"      "요양/NNG"    "시설/NNG"    "종사자/NNG"  "등/NNB"     
## [66] "에/JKB"      "대한/VV+ETM" "선제/NNG"    "검사/NNG"    "에서/JKB"   
## [71] "양성/NNG"    "으로/JKB"    "나왔/VV+EP"  "다/EF"       "./SF"       
## [76] "지난/VV+ETM" "12/SN"       "일/NNBC"     "직전/NNG"    "검사/NNG"   
## [81] "에서/JKB"    "는/JX"       "음성/NNG"    "판정/NNG"    "을/JKO"     
## [86] "받/VV"       "았/EP"       "다/EF"       "./SF"        "1/SN"       
## [91] "분기/NNG"    "접종/NNG"    "대/VV+EF"    "./SF"        "./SF"       
## 
## $...
##  [1] "미국/NNP"     "에서/JKB"     "임신/NNG"     "중/NNB"       "코로나/NNP"  
##  [6] "19/SN"        "백신/NNG"     "을/JKO"       "접종/NNG"     "한/XSV+ETM"  
## [11] "여성/NNG"     "이/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM" 
## [16] "아기/NNG"     "를/JKO"       "출산/NNG"     "했/XSV+EP"    "다/EF"       
## [21] "./SF"         "16/SN"        "일/NNBC"      "(/SSO"        "현지/NNG"    
## [26] "시간/NNG"     ")/SSC"        "미국/NNP"     "WPBF/SL"      "방송/NNG"    
## [31] "과/JC"        "영국/NNP"     "가디언/NNP"   "등/NNB"       "에/JKB"      
## [36] "따르/VV"      "면/EC"        "미국/NNP"     "플로리다/NNP" "팜비치/NNP"  
## [41] "카운티/NNP"   "에서/JKB"     "출산/NNG"     "전/NNG"       "코로나/NNP"  
## [46] "19/SN"        "백신/NNG"     "을/JKO"       "맞/VV"        "은/ETM"      
## [51] "여성/NNG"     "이/JKS"       "낳/VV"        "은/ETM"       "아기/NNG"    
## [56] "가/JKS"       "항체/NNG"     "를/JKO"       "가진/VV+ETM"  "것/NNB"      
## [61] "이/JKS"       "확인/NNG"     "됐/XSV+EP"    "다/EF"        "./SF"        
## [66] "의료/NNG"     "종사자/NNG"   "인/VCP+ETM"   "이/MM"        "여성/NNG"    
## [71] "은/JX"        "임신/NNG"     "36/SN"        "주/NNBC"      "차이/VV"     
## [76] "던/ETM"       "지난/VV+ETM"  "1/SN"         "월/NNBC"      "미국/NNP"    
## [81] "제약/NNG"     "업체/NNG"     "모더/NNP"     "나/NP"        "가/JKS"      
## [86] "개발/NNG"     "./SF"         "./SF"
pos(cv_df$TEXT[1:2]) %>% unlist() %>% head()
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..1 
##                                                                                                                                                                                                                                                                                                                                                  "충북/NNP" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..2 
##                                                                                                                                                                                                                                                                                                                                                  "에서/JKB" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..3 
##                                                                                                                                                                                                                                                                                                                                                     "도/JX" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..4 
##                                                                                                                                                                                                                                                                                                                                                  "백신/NNG" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..5 
##                                                                                                                                                                                                                                                                                                                                                      "1/SN" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..6 
##                                                                                                                                                                                                                                                                                                                                                   "차/NNBC"
pos(cv_df$TEXT[1:2]) %>% unlist() %>% str_c(collapse=" ")
## [1] "충북/NNP 에서/JKB 도/JX 백신/NNG 1/SN 차/NNBC 접종/NNG 자/XSN 의/JKG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 가/JKS 나왔/VV+EP 다/EF ./SF 17/SN 일/NNBC 충북/NNP 도/JX 등/NNB 에/JKB 따르/VV 면/EC 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 에서/JKB 근무/NNG 하/XSV 는/ETM 30/SN 대/NNBC A/SL 씨/NNB 가/JKS 이날/NNG 코로나/NNP ‘/SY 양성/NNG ’/SY 판정/NNG 을/JKO 받/VV 았/EP 다/EF ./SF A/SL 씨/NNB 는/JX 매주/MAG 두/MM 차례/NNG 씩/XSN 진행/NNG 되/XSV 는/ETM 요양/NNG 시설/NNG 종사자/NNG 등/NNB 에/JKB 대한/VV+ETM 선제/NNG 검사/NNG 에서/JKB 양성/NNG 으로/JKB 나왔/VV+EP 다/EF ./SF 지난/VV+ETM 12/SN 일/NNBC 직전/NNG 검사/NNG 에서/JKB 는/JX 음성/NNG 판정/NNG 을/JKO 받/VV 았/EP 다/EF ./SF 1/SN 분기/NNG 접종/NNG 대/VV+EF ./SF ./SF 미국/NNP 에서/JKB 임신/NNG 중/NNB 코로나/NNP 19/SN 백신/NNG 을/JKO 접종/NNG 한/XSV+ETM 여성/NNG 이/JKS 항체/NNG 를/JKO 가진/VV+ETM 아기/NNG 를/JKO 출산/NNG 했/XSV+EP 다/EF ./SF 16/SN 일/NNBC (/SSO 현지/NNG 시간/NNG )/SSC 미국/NNP WPBF/SL 방송/NNG 과/JC 영국/NNP 가디언/NNP 등/NNB 에/JKB 따르/VV 면/EC 미국/NNP 플로리다/NNP 팜비치/NNP 카운티/NNP 에서/JKB 출산/NNG 전/NNG 코로나/NNP 19/SN 백신/NNG 을/JKO 맞/VV 은/ETM 여성/NNG 이/JKS 낳/VV 은/ETM 아기/NNG 가/JKS 항체/NNG 를/JKO 가진/VV+ETM 것/NNB 이/JKS 확인/NNG 됐/XSV+EP 다/EF ./SF 의료/NNG 종사자/NNG 인/VCP+ETM 이/MM 여성/NNG 은/JX 임신/NNG 36/SN 주/NNBC 차이/VV 던/ETM 지난/VV+ETM 1/SN 월/NNBC 미국/NNP 제약/NNG 업체/NNG 모더/NNP 나/NP 가/JKS 개발/NNG ./SF ./SF"
pos(cv_df$TEXT[1])
## $...
##  [1] "충북/NNP"    "에서/JKB"    "도/JX"       "백신/NNG"    "1/SN"       
##  [6] "차/NNBC"     "접종/NNG"    "자/XSN"      "의/JKG"      "코로나/NNP" 
## [11] "확진/NNG"    "판정/NNG"    "사례/NNG"    "가/JKS"      "나왔/VV+EP" 
## [16] "다/EF"       "./SF"        "17/SN"       "일/NNBC"     "충북/NNP"   
## [21] "도/JX"       "등/NNB"      "에/JKB"      "따르/VV"     "면/EC"      
## [26] "충주시/NNP"  "모/NNG"      "요양/NNG"    "병원/NNG"    "원무/NNG"   
## [31] "과/NNG"      "에서/JKB"    "근무/NNG"    "하/XSV"      "는/ETM"     
## [36] "30/SN"       "대/NNBC"     "A/SL"        "씨/NNB"      "가/JKS"     
## [41] "이날/NNG"    "코로나/NNP"  "‘/SY"       "양성/NNG"    "’/SY"      
## [46] "판정/NNG"    "을/JKO"      "받/VV"       "았/EP"       "다/EF"      
## [51] "./SF"        "A/SL"        "씨/NNB"      "는/JX"       "매주/MAG"   
## [56] "두/MM"       "차례/NNG"    "씩/XSN"      "진행/NNG"    "되/XSV"     
## [61] "는/ETM"      "요양/NNG"    "시설/NNG"    "종사자/NNG"  "등/NNB"     
## [66] "에/JKB"      "대한/VV+ETM" "선제/NNG"    "검사/NNG"    "에서/JKB"   
## [71] "양성/NNG"    "으로/JKB"    "나왔/VV+EP"  "다/EF"       "./SF"       
## [76] "지난/VV+ETM" "12/SN"       "일/NNBC"     "직전/NNG"    "검사/NNG"   
## [81] "에서/JKB"    "는/JX"       "음성/NNG"    "판정/NNG"    "을/JKO"     
## [86] "받/VV"       "았/EP"       "다/EF"       "./SF"        "1/SN"       
## [91] "분기/NNG"    "접종/NNG"    "대/VV+EF"    "./SF"        "./SF"
pos(cv_df$TEXT[1]) %>% unlist() %>% head()
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..1 
##                                                                                                                                                                                                                                                                                                                                                  "충북/NNP" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..2 
##                                                                                                                                                                                                                                                                                                                                                  "에서/JKB" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..3 
##                                                                                                                                                                                                                                                                                                                                                     "도/JX" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..4 
##                                                                                                                                                                                                                                                                                                                                                  "백신/NNG" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..5 
##                                                                                                                                                                                                                                                                                                                                                      "1/SN" 
## 충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대..6 
##                                                                                                                                                                                                                                                                                                                                                   "차/NNBC"
pos(cv_df$TEXT[1]) %>% unlist() %>% paste(collapse=" ")
## [1] "충북/NNP 에서/JKB 도/JX 백신/NNG 1/SN 차/NNBC 접종/NNG 자/XSN 의/JKG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 가/JKS 나왔/VV+EP 다/EF ./SF 17/SN 일/NNBC 충북/NNP 도/JX 등/NNB 에/JKB 따르/VV 면/EC 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 에서/JKB 근무/NNG 하/XSV 는/ETM 30/SN 대/NNBC A/SL 씨/NNB 가/JKS 이날/NNG 코로나/NNP ‘/SY 양성/NNG ’/SY 판정/NNG 을/JKO 받/VV 았/EP 다/EF ./SF A/SL 씨/NNB 는/JX 매주/MAG 두/MM 차례/NNG 씩/XSN 진행/NNG 되/XSV 는/ETM 요양/NNG 시설/NNG 종사자/NNG 등/NNB 에/JKB 대한/VV+ETM 선제/NNG 검사/NNG 에서/JKB 양성/NNG 으로/JKB 나왔/VV+EP 다/EF ./SF 지난/VV+ETM 12/SN 일/NNBC 직전/NNG 검사/NNG 에서/JKB 는/JX 음성/NNG 판정/NNG 을/JKO 받/VV 았/EP 다/EF ./SF 1/SN 분기/NNG 접종/NNG 대/VV+EF ./SF ./SF"
pos(cv_df$TEXT[1]) %>% unlist() %>% paste(collapse=" ") %>% 
  str_extract_all(pattern="[가-힣]+/[NVM][A-Z]+")
## [[1]]
##  [1] "충북/NNP"   "백신/NNG"   "차/NNBC"    "접종/NNG"   "코로나/NNP"
##  [6] "확진/NNG"   "판정/NNG"   "사례/NNG"   "나왔/VV"    "일/NNBC"   
## [11] "충북/NNP"   "등/NNB"     "따르/VV"    "충주시/NNP" "모/NNG"    
## [16] "요양/NNG"   "병원/NNG"   "원무/NNG"   "과/NNG"     "근무/NNG"  
## [21] "대/NNBC"    "씨/NNB"     "이날/NNG"   "코로나/NNP" "양성/NNG"  
## [26] "판정/NNG"   "받/VV"      "씨/NNB"     "매주/MAG"   "두/MM"     
## [31] "차례/NNG"   "진행/NNG"   "요양/NNG"   "시설/NNG"   "종사자/NNG"
## [36] "등/NNB"     "대한/VV"    "선제/NNG"   "검사/NNG"   "양성/NNG"  
## [41] "나왔/VV"    "지난/VV"    "일/NNBC"    "직전/NNG"   "검사/NNG"  
## [46] "음성/NNG"   "판정/NNG"   "받/VV"      "분기/NNG"   "접종/NNG"  
## [51] "대/VV"
pos(cv_df$TEXT[1]) %>% unlist() %>% paste(collapse=" ") %>% 
  str_extract_all(pattern="[가-힣]+/[NVM][A-Z]+") %>% unlist() %>% 
  paste(collapse=" ")
## [1] "충북/NNP 백신/NNG 차/NNBC 접종/NNG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 나왔/VV 일/NNBC 충북/NNP 등/NNB 따르/VV 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 근무/NNG 대/NNBC 씨/NNB 이날/NNG 코로나/NNP 양성/NNG 판정/NNG 받/VV 씨/NNB 매주/MAG 두/MM 차례/NNG 진행/NNG 요양/NNG 시설/NNG 종사자/NNG 등/NNB 대한/VV 선제/NNG 검사/NNG 양성/NNG 나왔/VV 지난/VV 일/NNBC 직전/NNG 검사/NNG 음성/NNG 판정/NNG 받/VV 분기/NNG 접종/NNG 대/VV"
pos(cv_df$TEXT[1]) %>% unlist() %>% paste(collapse=" ") %>% 
  str_extract_all(pattern="[가-힣]+/[NVM][A-Z]+") %>% unlist() %>% 
  paste(collapse=" ")
## [1] "충북/NNP 백신/NNG 차/NNBC 접종/NNG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 나왔/VV 일/NNBC 충북/NNP 등/NNB 따르/VV 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 근무/NNG 대/NNBC 씨/NNB 이날/NNG 코로나/NNP 양성/NNG 판정/NNG 받/VV 씨/NNB 매주/MAG 두/MM 차례/NNG 진행/NNG 요양/NNG 시설/NNG 종사자/NNG 등/NNB 대한/VV 선제/NNG 검사/NNG 양성/NNG 나왔/VV 지난/VV 일/NNBC 직전/NNG 검사/NNG 음성/NNG 판정/NNG 받/VV 분기/NNG 접종/NNG 대/VV"
# 함수 만들기
content_extractor <- function(x){
  y <- pos(x) %>% 
    unlist() %>% 
    paste(collapse=" ") %>%
    str_extract_all(pattern="[가-힣]+/[NVM][A-Z]+") %>% 
    unlist() %>%
    paste(collapse=" ")
  return(y)
}

content_extractor(cv_df$TEXT[1:5])
## [1] "충북/NNP 백신/NNG 차/NNBC 접종/NNG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 나왔/VV 일/NNBC 충북/NNP 등/NNB 따르/VV 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 근무/NNG 대/NNBC 씨/NNB 이날/NNG 코로나/NNP 양성/NNG 판정/NNG 받/VV 씨/NNB 매주/MAG 두/MM 차례/NNG 진행/NNG 요양/NNG 시설/NNG 종사자/NNG 등/NNB 대한/VV 선제/NNG 검사/NNG 양성/NNG 나왔/VV 지난/VV 일/NNBC 직전/NNG 검사/NNG 음성/NNG 판정/NNG 받/VV 분기/NNG 접종/NNG 대/VV 미국/NNP 임신/NNG 중/NNB 코로나/NNP 백신/NNG 접종/NNG 여성/NNG 항체/NNG 가진/VV 아기/NNG 출산/NNG 일/NNBC 현지/NNG 시간/NNG 미국/NNP 방송/NNG 영국/NNP 가디언/NNP 등/NNB 따르/VV 미국/NNP 플로리다/NNP 팜비치/NNP 카운티/NNP 출산/NNG 전/NNG 코로나/NNP 백신/NNG 맞/VV 여성/NNG 낳/VV 아기/NNG 항체/NNG 가진/VV 것/NNB 확인/NNG 의료/NNG 종사자/NNG 인/VCP 이/MM 여성/NNG 임신/NNG 주/NNBC 차이/VV 지난/VV 월/NNBC 미국/NNP 제약/NNG 업체/NNG 모더/NNP 나/NP 개발/NNG 도널드/NNP 트럼프/NNP 전/MM 미국/NNP 대통령/NNG 일/NNBC 현지/NNG 시각/NNG 폭스/NNP 뉴스/NNG 인터뷰/NNG 자신/NNG 지지자/NNG 코로나/NNP 백신/NNG 맞/VV 당부/NNG 수개월/NNG 동안/NNG 코로나/NNP 백신/NNG 접종/NNG 관심/NNG 두/VV 않/VX 트럼프/NNG 전/NNG 대통령/NNG 공개/NNG 백신/NNG 접종/NNG 권한/VV 것/NNB 이/VCP 폭스/NNP 뉴스/NNG 투데이/NNP 등/NNB 따르/VV 트럼프/NNP 전/MM 대통령/NNG 이날/NNG 분/NNBC 간/NNG 진행/NNG 폭스/NNP 뉴스/NNG 전화/NNG 인터뷰/NNG 안/MAG 인류/NNG 사상/NNG 최고/NNG 밝기/NNG 빛/NNG 국내/NNG 연구/NNG 진/NNG 의해/VV 개발/NNG 포항/NNP 가속기/NNG 연구소/NNG 일/NNBC 강흥식/NNP 박사/NNG 연구/NNG 팀/NNG 세대/NNG 방사광/NNG 가속기/NNG 선형/NNG 셀/NNG 프시/NNG 딩/NNG 시스템/NNG 개발/NNG 인류/NNG 만든/VV 빛/NNG 중/NNB 최고/NNG 밝기/NNG 빛/NNG 만드/VV 데/NNB 성공/NNG 밝혔/VV 이번/NNG 연구/NNG 광학/NNG 분야/NNG 국제/NNG 학술지/NNG 인/VCP 네이처/NNP 포토/NNG 닉스/NNG 일자/NNG 현지/NNG 시각/NNG 실렸/VV 포/MAG 미국/NNP 제약사/NNG 화이자/NNP 코로나/NNP 백신/NNG 연합뉴스/NNP 신종/NNP 코로나/NNP 바이러스/NNG 감염증/NNG 코로나/NNP 일으키/VV 바이러스/NNG 변이/NNG 사라지/VV 않/VX 백신/NNG 평생/NNG 맞/VV 할/VX 수/NNB 있/VV 예상/NNG 나왔/VV 로이터/NNP 통신/NNG 일/NNBC 현지/NNG 시간/NNG 영국/NNP 코로나/NNP 유전/NNG 체학/NNP 컨소시엄/NNG 국장/NNG 인/VCP 샤론/NNP 피콕/NNP 교수/NNG 기존/NNG 백신/NNG 보강/NNG 이른바/MAJ 부스터/NNG 샷/NNG 정기/NNG"
sapply(cv_df$TEXT[1:5], content_extractor) %>% class()
## [1] "character"
future_sapply(cv_df$TEXT[1:5], content_extractor)
##                                                                                                                         충북에서도 백신 1차 접종자의 코로나 확진 판정 사례가 나왔다. \r\n \r\n17일 충북도 등에 따르면 충주시 모 요양병원 원무과에서 근무하는 30대 A씨가 이날 코로나 ‘양성’ 판정을 받았다. \r\n \r\nA씨는 매주 두 차례씩 진행되는 요양시설 종사자 등에 대한 선제 검사에서 양성으로 나왔다. 지난 12일 직전 검사에서는 음성 판정을 받았다. \r\n \r\n1분기 접종 대.. 
##                                "충북/NNP 백신/NNG 차/NNBC 접종/NNG 코로나/NNP 확진/NNG 판정/NNG 사례/NNG 나왔/VV 일/NNBC 충북/NNP 등/NNB 따르/VV 충주시/NNP 모/NNG 요양/NNG 병원/NNG 원무/NNG 과/NNG 근무/NNG 대/NNBC 씨/NNB 이날/NNG 코로나/NNP 양성/NNG 판정/NNG 받/VV 씨/NNB 매주/MAG 두/MM 차례/NNG 진행/NNG 요양/NNG 시설/NNG 종사자/NNG 등/NNB 대한/VV 선제/NNG 검사/NNG 양성/NNG 나왔/VV 지난/VV 일/NNBC 직전/NNG 검사/NNG 음성/NNG 판정/NNG 받/VV 분기/NNG 접종/NNG 대/VV" 
##                                                                                                                                 미국에서 임신 중 코로나 19 백신을 접종한 여성이 항체를 가진 아기를 출산했다. \r\n \r\n 16일(현지시간) 미국 WPBF방송과 영국 가디언 등에 따르면 미국 플로리다 팜비치 카운티에서 출산 전 코로나 19 백신을 맞은 여성이 낳은 아기가 항체를 가진 것이 확인됐다. \r\n \r\n 의료 종사자인 이 여성은 임신 36주차이던 지난 1월 미국 제약업체 모더나가 개발.. 
##            "미국/NNP 임신/NNG 중/NNB 코로나/NNP 백신/NNG 접종/NNG 여성/NNG 항체/NNG 가진/VV 아기/NNG 출산/NNG 일/NNBC 현지/NNG 시간/NNG 미국/NNP 방송/NNG 영국/NNP 가디언/NNP 등/NNB 따르/VV 미국/NNP 플로리다/NNP 팜비치/NNP 카운티/NNP 출산/NNG 전/NNG 코로나/NNP 백신/NNG 맞/VV 여성/NNG 낳/VV 아기/NNG 항체/NNG 가진/VV 것/NNB 확인/NNG 의료/NNG 종사자/NNG 인/VCP 이/MM 여성/NNG 임신/NNG 주/NNBC 차이/VV 지난/VV 월/NNBC 미국/NNP 제약/NNG 업체/NNG 모더/NNP 나/NP 개발/NNG" 
##                                                                                                                           도널드 트럼프 전 미국 대통령이 16일(현지 시각) 폭스 뉴스와의 인터뷰에서 자신의 지지자들에게 코로나 백신을 맞으라고 당부했다. 수개월동안 코로나 백신 접종에 관심을 두지 않던 트럼프 전 대통령이 공개적으로 백신 접종을 권한 것이다. \r\n \r\n폭스뉴스와 USA투데이 등에 따르면, 트럼프 전 대통령은 이날 20분간 진행된 폭스 뉴스와의 전화 인터뷰에서 “안.. 
##          "도널드/NNP 트럼프/NNP 전/MM 미국/NNP 대통령/NNG 일/NNBC 현지/NNG 시각/NNG 폭스/NNP 뉴스/NNG 인터뷰/NNG 자신/NNG 지지자/NNG 코로나/NNP 백신/NNG 맞/VV 당부/NNG 수개월/NNG 동안/NNG 코로나/NNP 백신/NNG 접종/NNG 관심/NNG 두/VV 않/VX 트럼프/NNG 전/NNG 대통령/NNG 공개/NNG 백신/NNG 접종/NNG 권한/VV 것/NNB 이/VCP 폭스/NNP 뉴스/NNG 투데이/NNP 등/NNB 따르/VV 트럼프/NNP 전/MM 대통령/NNG 이날/NNG 분/NNBC 간/NNG 진행/NNG 폭스/NNP 뉴스/NNG 전화/NNG 인터뷰/NNG 안/MAG" 
##                                                                                                                                 인류 사상 최고 밝기의 빛이 국내 연구진에 의해 개발됐다.\r\n\r\n포항가속기연구소(PAL)는 16일 강흥식 박사 연구팀이 4세대 방사광가속기(선형)의 셀프시딩(Self-Seeding) 시스템을 개발해 인류가 만든 빛 중에서 최고 밝기의 빛을 만드는 데 성공했다고 밝혔다. 이번 연구는 광학 분야의 국제학술지인 네이처 포토닉스 15일자(현지시각)에 실렸다.\r\n\r\n포.. 
## "인류/NNG 사상/NNG 최고/NNG 밝기/NNG 빛/NNG 국내/NNG 연구/NNG 진/NNG 의해/VV 개발/NNG 포항/NNP 가속기/NNG 연구소/NNG 일/NNBC 강흥식/NNP 박사/NNG 연구/NNG 팀/NNG 세대/NNG 방사광/NNG 가속기/NNG 선형/NNG 셀/NNG 프시/NNG 딩/NNG 시스템/NNG 개발/NNG 인류/NNG 만든/VV 빛/NNG 중/NNB 최고/NNG 밝기/NNG 빛/NNG 만드/VV 데/NNB 성공/NNG 밝혔/VV 이번/NNG 연구/NNG 광학/NNG 분야/NNG 국제/NNG 학술지/NNG 인/VCP 네이처/NNP 포토/NNG 닉스/NNG 일자/NNG 현지/NNG 시각/NNG 실렸/VV 포/MAG" 
##                                                                                                                                      미국 제약사 화이자의 코로나19 백신. AFP연합뉴스 신종 코로나바이러스 감염증(코로나19)을 일으키는 바이러스의 변이가 사라지지 않아 백신을 평생 맞아야 할 수 있다는 예상이 나왔다. \r\n \r\n 로이터 통신은 15일(현지시간) 영국 코로나19 유전체학 컨소시엄(COG-UK) 국장인 샤론 피콕 교수가 기존 백신을 보강하는 이른바 '부스터 샷'을 정기적으로 .. 
##                                  "미국/NNP 제약사/NNG 화이자/NNP 코로나/NNP 백신/NNG 연합뉴스/NNP 신종/NNP 코로나/NNP 바이러스/NNG 감염증/NNG 코로나/NNP 일으키/VV 바이러스/NNG 변이/NNG 사라지/VV 않/VX 백신/NNG 평생/NNG 맞/VV 할/VX 수/NNB 있/VV 예상/NNG 나왔/VV 로이터/NNP 통신/NNG 일/NNBC 현지/NNG 시간/NNG 영국/NNP 코로나/NNP 유전/NNG 체학/NNP 컨소시엄/NNG 국장/NNG 인/VCP 샤론/NNP 피콕/NNP 교수/NNG 기존/NNG 백신/NNG 보강/NNG 이른바/MAJ 부스터/NNG 샷/NNG 정기/NNG"
cv_df <- cv_df %>% 
  mutate(TEXT = future_sapply(TEXT, str_squish)) %>% 
  mutate(TOKEN = future_sapply(TEXT, content_extractor))

cv_df
## # A tibble: 2,437 x 6
##    DATE       COMPANY  KEYWORD         FEATURE         TEXT         TOKEN       
##    <date>     <chr>    <chr>           <chr>           <chr>        <chr>       
##  1 2021-03-17 조선일보 코로나,백신,접종,요양,병~ 종사자,충북,코로나,a씨,~ "충북에서도 백신 1~ 충북/NNP 백신/N~
##  2 2021-03-17 중앙일보 임신,백신,엄마,아기,코로~ 미국,코로나,임산부,모더나~ "미국에서 임신 중 ~ 미국/NNP 임신/N~
##  3 2021-03-17 조선일보 코로나,백신,독려,광고,트~ 코로나,미국,폭스,유튜브,~ "도널드 트럼프 전 ~ 도널드/NNP 트럼프~
##  4 2021-03-17 영남일보 포항가속기,최고,인류,사상~ 가속기,포항가속기연구소,시~ "인류 사상 최고 밝~ 인류/NNG 사상/N~
##  5 2021-03-17 세계일보 코로나,전문가,코로나,바이~ 코로나19,악시오스,미국,~ "미국 제약사 화이자~ 미국/NNP 제약사/~
##  6 2021-03-17 국민일보 임신,코로나,백신,엄마,항~ 미국,코로나19,모더나,플~ "미국에서 임신 중 ~ 미국/NNP 임신/N~
##  7 2021-03-17 중앙일보 이란도,코로나,백신,공개,~ 코로나19,과학자,사망자,~ "이란이 세 번쨰 자~ 이란/NNG 세/MM~
##  8 2021-03-17 충청투데이~ 백신,반응,코로나,대전,대~ 의료진,코로나,관계자,이상~ "[충청투데이 조선교~ 충청/NNP 투데이/~
##  9 2021-03-17 강원도민일보~ 접종,두통,발열,몸살,코로~ 이상반응,관계자,코로나19~ "\"경미한 이상반응~ 이상/NNG 반응/N~
## 10 2021-03-17 국제신문 울산,개소,코로나,백신,접~ 동천체육관,코로나19,울산~ "울산에서도 코로나1~ 울산/NNP 코로나/~
## # ... with 2,427 more rows

2) Tidy data로 토큰화 후 DFM or DTM 구조화

  1. Frequency Vector: 간단한 인코딩 방식. 코퍼스 단어 리스트 중 각 문서에 등장하는 단어들의 횟수를 표현.
Token frequency as vector encoding

Token frequency as vector encoding

library(tidytext)

cv_tidy <- cv_df %>% 
  select(DATE, COMPANY, TOKEN) %>% 
  rowid_to_column() %>%  # 문서 번호 매기기
  unnest_tokens(word, TOKEN, token="regex", pattern=" ") 
## Warning: Outer names are only allowed for unnamed scalar atomic inputs
cv_tidy
## # A tibble: 122,201 x 4
##    rowid DATE       COMPANY  word      
##    <int> <date>     <chr>    <chr>     
##  1     1 2021-03-17 조선일보 충북/nnp  
##  2     1 2021-03-17 조선일보 백신/nng  
##  3     1 2021-03-17 조선일보 차/nnbc   
##  4     1 2021-03-17 조선일보 접종/nng  
##  5     1 2021-03-17 조선일보 코로나/nnp
##  6     1 2021-03-17 조선일보 확진/nng  
##  7     1 2021-03-17 조선일보 판정/nng  
##  8     1 2021-03-17 조선일보 사례/nng  
##  9     1 2021-03-17 조선일보 나왔/vv   
## 10     1 2021-03-17 조선일보 일/nnbc   
## # ... with 122,191 more rows
cv_tidy %>% 
  count(rowid, word) %>% 
  rename(document=rowid, feature=word)
## # A tibble: 100,048 x 3
##    document feature      n
##       <int> <chr>    <int>
##  1        1 검사/nng     2
##  2        1 과/nng       1
##  3        1 근무/nng     1
##  4        1 나왔/vv      2
##  5        1 대/nnbc      1
##  6        1 대/vv        1
##  7        1 대한/vv      1
##  8        1 두/mm        1
##  9        1 등/nnb       2
## 10        1 따르/vv      1
## # ... with 100,038 more rows
cv_dfm <- cv_tidy %>% 
  count(rowid, word) %>% 
  rename(document=rowid, feature=word, count=n) %>% 
  cast_dfm(document, feature, count)
cv_dfm
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng 과/nng 근무/nng 나왔/vv 대/nnbc 대/vv 대한/vv 두/mm 등/nnb
##    1        2      1        1       2       1     1       1     1      2
##    2        0      0        0       0       0     0       0     0      1
##    3        0      0        0       0       0     0       0     0      1
##    4        0      0        0       0       0     0       0     0      0
##    5        0      0        0       1       0     0       0     0      0
##    6        0      0        0       1       0     0       0     0      0
##     features
## docs 따르/vv
##    1       1
##    2       1
##    3       1
##    4       0
##    5       0
##    6       1
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]
  1. One-Hot Encoding: BOW 방식은 문법(단어 순서)을 무시하고 문서 내의 등장 횟수만 고려한다. 그러나 Frequency 인코딩은 분포의 불균형 문제를 야기함 (long tail, power law distribution, Zipf’s law). 왜? 자주 쓰는 소수의 단어군이 정해져 있음.

하지만 대부분의 통계 모형은 정규 분포를 요구함.

One-hot encoding 이 대안이 될 수 있음. 이 방식은 단어의 등장 횟수는 무시하고 등장 여부(presence or absence / 1 or 0)만 표시하는 방식.

One-hot encoding

One-hot encoding

library(quanteda)
## Package version: 2.1.2
## Parallel computing: 2 of 6 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
## 
##     View
dfm_weight(cv_dfm, scheme="boolean")
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng 과/nng 근무/nng 나왔/vv 대/nnbc 대/vv 대한/vv 두/mm 등/nnb
##    1        1      1        1       1       1     1       1     1      1
##    2        0      0        0       0       0     0       0     0      1
##    3        0      0        0       0       0     0       0     0      1
##    4        0      0        0       0       0     0       0     0      0
##    5        0      0        0       1       0     0       0     0      0
##    6        0      0        0       1       0     0       0     0      0
##     features
## docs 따르/vv
##    1       1
##    2       1
##    3       1
##    4       0
##    5       0
##    6       1
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]
cv_dfm_boolean <- dfm_weight(cv_dfm, scheme="boolean")
cv_dfm_boolean
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng 과/nng 근무/nng 나왔/vv 대/nnbc 대/vv 대한/vv 두/mm 등/nnb
##    1        1      1        1       1       1     1       1     1      1
##    2        0      0        0       0       0     0       0     0      1
##    3        0      0        0       0       0     0       0     0      1
##    4        0      0        0       0       0     0       0     0      0
##    5        0      0        0       1       0     0       0     0      0
##    6        0      0        0       1       0     0       0     0      0
##     features
## docs 따르/vv
##    1       1
##    2       1
##    3       1
##    4       0
##    5       0
##    6       1
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]

One-hot encoding 은 문서 차원에서의 유사도를 측정하기에 유용한 방식. 하지만 단어 차원에서 유사도를 측정하기는 비효율적. 다시 말해, 아주 다른 의미 단어라도 문서에 자주 함께 등장하기만 한다면 가까운 의미로 해석될 여지.

  1. Term Frequency-Inverse Document Frequency(TF-IDF): BOW 방식의 벡터화는 코퍼스 맥락을 고려하는데 한계가 있음. 즉, 영화 리뷰 코퍼스라면 각 문서마다 “movie” “actor” “scene” “epic” 등의 단어들이 당연히 많이 등장할 개연성 높음. 그런데, 사실 이러한 단어들은 문서의 의미를 파악하는데 그리 큰 도움이 되지 않음. 오히려 잘 등장하지 않는 “good” “bad” 이런 단어가 리뷰의 의미를 포착하는데 유용함.

TF-IDF 방식은 이러한 문제의식에서 단어 빈도수에 가중치를 부여하여, 모든 문서에 자주 등장하는 단어들의 빈도수는 낮추고, 잘 등장하지 않는 단어의 빈도수는 높임.

TF-IDF encoding

TF-IDF encoding

cv_dfm
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng 과/nng 근무/nng 나왔/vv 대/nnbc 대/vv 대한/vv 두/mm 등/nnb
##    1        2      1        1       2       1     1       1     1      2
##    2        0      0        0       0       0     0       0     0      1
##    3        0      0        0       0       0     0       0     0      1
##    4        0      0        0       0       0     0       0     0      0
##    5        0      0        0       1       0     0       0     0      0
##    6        0      0        0       1       0     0       0     0      0
##     features
## docs 따르/vv
##    1       1
##    2       1
##    3       1
##    4       0
##    5       0
##    6       1
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]
dfm_tfidf(cv_dfm)
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng   과/nng 근무/nng  나왔/vv  대/nnbc    대/vv   대한/vv    두/mm
##    1 3.879039 2.687707 2.085647 2.629591 1.432435 2.210586 0.9198097 1.391042
##    2 0        0        0        0        0        0        0         0       
##    3 0        0        0        0        0        0        0         0       
##    4 0        0        0        0        0        0        0         0       
##    5 0        0        0        1.314795 0        0        0         0       
##    6 0        0        0        1.314795 0        0        0         0       
##     features
## docs    등/nnb   따르/vv
##    1 1.1555828 0.7623952
##    2 0.5777914 0.7623952
##    3 0.5777914 0.7623952
##    4 0         0        
##    5 0         0        
##    6 0         0.7623952
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]
cv_dfm_tfidf <- dfm_tfidf(cv_dfm)
cv_dfm_tfidf
## Document-feature matrix of: 2,436 documents, 9,214 features (99.6% sparse).
##     features
## docs 검사/nng   과/nng 근무/nng  나왔/vv  대/nnbc    대/vv   대한/vv    두/mm
##    1 3.879039 2.687707 2.085647 2.629591 1.432435 2.210586 0.9198097 1.391042
##    2 0        0        0        0        0        0        0         0       
##    3 0        0        0        0        0        0        0         0       
##    4 0        0        0        0        0        0        0         0       
##    5 0        0        0        1.314795 0        0        0         0       
##    6 0        0        0        1.314795 0        0        0         0       
##     features
## docs    등/nnb   따르/vv
##    1 1.1555828 0.7623952
##    2 0.5777914 0.7623952
##    3 0.5777914 0.7623952
##    4 0         0        
##    5 0         0        
##    6 0         0.7623952
## [ reached max_ndoc ... 2,430 more documents, reached max_nfeat ... 9,204 more features ]

즉, TF-IDF 방식은 각 문서에 등장하는 어휘 등장 횟수를 코퍼스 내 다른 문서들의 단어 구성을 고려하여 표시함. 결국, 문서 고유 의미를 파악하는 유용.

TF-IDF 계산법: https://www.tidytextmining.com/tfidf.html

TF-IDF의 장점 중 하나는, stopwords (불용어) 문제를 해결함. 매우 유용한 방식의 벡터 인코딩.