# 코로나 백신 관련 뉴스: 키워드 검색 - "코로나" & "백신"
# 중앙지, 지역종합지, 방송사
# 지난 6개월 기간
# 제목에 키워드 포함
# 중복 기사 제거 (분석제외)
# 엑셀파일 다운로드 폴더 확인
getwd()
## [1] "C:/Users/CAU/Dropbox/2021_Class/ITM/R"
# 엑셀파일 불러오기
# install.packages("readxl")
library(readxl)
cv <- read_excel("bigkinds_corona_vaccine.xlsx", sheet = 1)
class(cv)
## [1] "tbl_df" "tbl" "data.frame"
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.3.3 √ purrr 0.3.4
## √ tibble 3.0.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()
cv
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 11
## DATE COMPANY BYLINE HEADLINE PERSON PLACE ORG KEYWORD FEATURE TEXT URL
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 20210~ 조선일보~ 신정훈 기~ "코로나 백신~ <NA> 충북,충~ 아스트라~ 코로나,백신~ 종사자,충북~ "충북에~ http~
## 2 20210~ 중앙일보~ 서유진(s~ "임신중 백신~ 러드닉,채~ 이스라엘~ WPBF~ 임신,백신,~ 미국,코로나~ "미국에~ http~
## 3 20210~ 조선일보~ 김승현 기~ "코로나 백신~ 트럼프,빌~ 미국 폭스뉴스~ 코로나,백신~ 코로나,미국~ "도널드~ http~
## 4 20210~ 영남일보~ 김기태 "포항가속기硏~ 강흥식 독일,미~ 포항가속~ 포항가속기,~ 가속기,포항~ "인류 ~ http~
## 5 20210~ 세계일보~ 김현주 "英 전문가 ~ 앨버트,피~ 최고경영~ HBO,~ 코로나,전문~ 코로나19,~ "미국 ~ http~
## 6 20210~ 국민일보~ 권남영 "임신 중 코~ <NA> 플로리다~ 모더나~ 임신,코로나~ 미국,코로나~ "미국에~ http~
## 7 20210~ 중앙일보~ 나운채(n~ "이란도 코로~ 파크리자데~ 소도,중~ AP통신~ 이란도,코로~ 코로나19,~ "이란이~ http~
## 8 20210~ 충청투데이~ 조선교 기~ "백신 이상반~ <NA> 대전을지~ 대전,아~ 백신,반응,~ 의료진,코로~ "[충청~ http~
## 9 20210~ 강원도민일보~ 양희문 "접종 후 두~ 이창률 강원도~ 춘천성심~ 접종,두통,~ 이상반응,관~ "\"경~ www.~
## 10 20210~ 국제신문~ 방종근 기~ "울산 첫 코~ <NA> 울산,중~ 울산,예~ 울산,개소,~ 동천체육관,~ "울산에~ http~
## # ... with 2,432 more rows
cv$TEXT[100]
## [1] "전세계적으로 유행 탓 비교대상 충분히 확보하기 쉬워 개발 시간도 단축 \r\n\u7f8e 수천만-\u82f1 1천만 도즈 넘어 임상시험의 몇백배 이르는 접종 '안전성 확보' \r\n몸살 경증 1~2일후 사라지고 중증 '아나필락시스' 화이자 10만명당 1명 일반적 \r\n허약 고령자엔 치명적 질병 사회적 약자 향한 공동체의식 확인하는 계기를 \r\n \r\n정재훈 가천대학교 의과대학 예방의학과.."
대량의 텍스트 데이터를 분석하기 전에 분석에 “불필요한 요소를 제거하고 다루기 쉬운 형태로 변환하는 과정”
전처리에 따라 데이터 분석 결과의 품질이 크게 달라질 수 있음
```r
library(stringr)
텍스트 전처리에 유용한 stringr의 함수들을 소개해드리자면:
함수 | 설명 |
---|---|
str_split() |
문자열 분리 |
str_c() |
문자열 연결 |
str_detect() |
문자열의 패턴 유무 인식하여 결과(T/F)를 반환합니다) |
str_squish() |
문자열의 불필요한 공백을 제거합니다. |
str_extract() |
각 문자열 요소에서 처음으로 일치하는 텍스트 패턴을 추출합니다. |
str_extract_all() |
각 문자열 요소에서 일치하는 모든 텍스트 패턴을 추출합니다. |
str_replace() |
각 문자열 요소에서 처음으로 일치하는 텍스트 패턴을 원하는 문자열로 바꿉니다. |
str_replace_all() |
각 문자열에서 일치하는 모든 텍스트 패턴을 원하는 문자열로 바꿉니다. |
str_remove() |
각 문자열 요소에서 처음으로 일치하는 텍스트 패턴을 제거합니다. |
str_remove_all() |
각 문자열에서 일치하는 모든 텍스트 패턴을 제거합니다. |
stringr
패키지에 있는 모든 함수는 "str_"
로 시작하고 뒤에는 수행 작업과 관련된 용어가 따라옵니다.
대부분의 stringr 함수는 처리하고자 하는 특정 패턴의 텍스트를 찾는데 필요한 정규 표현식과 함께 쓰입니다.
R에서 텍스트를 다루고 처리하기 위한 몇가지 기본 기능을 학습하는 과정에서 우리는 문자열을 자유롭게 다룰 수 있어야 한다는 필요성을 가집니다. 그래서 우리는 정규 표현식(regular expressions)에 대해 알아볼 것입니다.
정규 표현식이라는 용어는 낯설게 느껴지고 그 예는 복잡하게 보일 수 있습니다. 하지만 정규 표현식은 텍스트를 구성하는 방식으로 문자 집합의 패턴을 설명합니다.
오늘날 우리는 이메일, 문자 메세지, 뉴스 기사, 블로그, 댓글, 트윗과 같은 다양한 디지털 텍스트를 쉽게 접할 수 있죠. 이러한 데이터들은 모두 디지털 기호로 이뤄져 있기 때문에, 우리가 텍스트를 구성하는 방식을 안다면 많은 양의 데이터를 즉 빅데이터를 다룰 수 있는 힘을 갖게 됩니다. 다시 말해, 정규 표현식을 이용해서 디지털 텍스트를 처리할 수 있는 것이죠.
그럼 정규 표현식은 무엇일까요? regular expression, 즉 정규 표현식은 텍스트의 특정 pattern을 찾아내기 위한 특수 문자열입니다. 결국 정규 표현식은 문자열 집합을 매칭하기 위한 기호 집합이죠. 영어로 regular expression이라는 용어 자체가 다소 길기 때문에, 흔히 regex 라고 짧게 줄여서 지칭합니다. 저도 이 수업에서 정규 표현과 regex를 혼용해서 사용할 것입니다.
하지만, 정규표현식은 프로그래밍 언어는 아니라는 점에 주목할 필요가 있습니다. regex가 프로그래밍 언어처럼 보일지도 모르겠습니다. 왜냐하면 정규 표현은 컴퓨터를 통해 텍스트에서 우리가 원하는 것을 찾아내는데 사용된는 규칙의 집합이기 때문입니다. 그러나 regex는 변수를 지정할 수 없고, 2+2와 같은 계산을 추가할 수 없기 때문에, 프로그래밍 언어라 말할 순 없습니다.
정규 표현식은 처음에는 이해하기 어려울 수 있습니다. 무의미한 방식으로 결합된 문자, 숫자 및 구두점이 포함된 문자열을 볼 수 있기 때문입니다. 프로그래밍 및 데이터 분석과 마찬가지로, 정규 표현식을 학습하고 정규 표현식 패턴을 정의하는 데에 시간이 걸리므로 많은 연습이 필요합니다.
그러나 연습을 많이하면 할수록 더 복잡한 패턴을 정의할 수 있고 제거할 수도 있습니다. 그리고 정규 표현식은 Python, Perl, Java와 같은 다른 프로그래밍 언어의 대부분에서 지원되기 때문에 사용에 익숙해지면 매우 유용합니다.
우리는 정규 표현식을 사용하여 텍스트 작업을 할 것입니다. 가령, 아까 예시에서 언급했던, 구두점, 숫자 그리고 원하지 않는 문자 등을 찾아내서 지우거나 원하는 문자로 바꿔주는 작업을 regex를 이용해서 할 것입니다.
예를 들어, 우리가 전처리하고자 하는 텍스트에서 # 기호로 시작하는 해시태그를 추출해내거나, @ 기호로 시작하는 사용자 계정을 추출해 낼 수 있습니다. 또한, 텍스트에 등장하는 구두점과 숫자 표현들, 알파벳 문자 그리고 웹페이지 주소와 같은 URL을 일일이 지정해서 지워내는 번거로운 작업을 피할 수 있기 때문에 효율적인 텍스트 분석을 가능하게 합니다.
사실, 처리해줘 야 할 텍스트 패턴은 매우 다양할 수 있기 때문에 일일이 모든 경우를 포함시킬 수는 없습니다. 가령, 연도를 가리키는 숫자만 해도 “2018”, “2016”, “2017”에 국한된 것이 아니라 더 많은 다양한 경우가 올 수 있기 때문에, 이러한 규칙을 가진 숫자 표현 모두를 매칭해서 처리해주는 정규 표현이 필요합니다. 이런 방식으로 텍스트에 등장하는 그리고 우리가 지워줘야 하는 모든 문자열, 숫자 또는 구두점을 찾아서 처리할 수 있죠.
library(stringr)
cv
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 11
## DATE COMPANY BYLINE HEADLINE PERSON PLACE ORG KEYWORD FEATURE TEXT URL
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 20210~ 조선일보~ 신정훈 기~ "코로나 백신~ <NA> 충북,충~ 아스트라~ 코로나,백신~ 종사자,충북~ "충북에~ http~
## 2 20210~ 중앙일보~ 서유진(s~ "임신중 백신~ 러드닉,채~ 이스라엘~ WPBF~ 임신,백신,~ 미국,코로나~ "미국에~ http~
## 3 20210~ 조선일보~ 김승현 기~ "코로나 백신~ 트럼프,빌~ 미국 폭스뉴스~ 코로나,백신~ 코로나,미국~ "도널드~ http~
## 4 20210~ 영남일보~ 김기태 "포항가속기硏~ 강흥식 독일,미~ 포항가속~ 포항가속기,~ 가속기,포항~ "인류 ~ http~
## 5 20210~ 세계일보~ 김현주 "英 전문가 ~ 앨버트,피~ 최고경영~ HBO,~ 코로나,전문~ 코로나19,~ "미국 ~ http~
## 6 20210~ 국민일보~ 권남영 "임신 중 코~ <NA> 플로리다~ 모더나~ 임신,코로나~ 미국,코로나~ "미국에~ http~
## 7 20210~ 중앙일보~ 나운채(n~ "이란도 코로~ 파크리자데~ 소도,중~ AP통신~ 이란도,코로~ 코로나19,~ "이란이~ http~
## 8 20210~ 충청투데이~ 조선교 기~ "백신 이상반~ <NA> 대전을지~ 대전,아~ 백신,반응,~ 의료진,코로~ "[충청~ http~
## 9 20210~ 강원도민일보~ 양희문 "접종 후 두~ 이창률 강원도~ 춘천성심~ 접종,두통,~ 이상반응,관~ "\"경~ www.~
## 10 20210~ 국제신문~ 방종근 기~ "울산 첫 코~ <NA> 울산,중~ 울산,예~ 울산,개소,~ 동천체육관,~ "울산에~ http~
## # ... with 2,432 more rows
cv$KEYWORD[1]
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,AZ,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
# punctuation -> space
cv$KEYWORD[1:5]
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,AZ,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
## [2] "임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신,접종,여성,항체,아기,출산,16일,현지시간,미국,WPBF,방송,영국,가디언,미국,플로리다,팜비치,카운티,출산,코로나,출산,백신,여성,아기,항체,확인,의료,종사자,여성,임신,주차,미국,제약,업체,모더나,모더,백신,접종,3주,건강,여자아이,소아과의사,길버트,채드,러드닉,연구진,여성,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,결과,신생아,항체,전달,확인,연구진,여성,백신,접종,제대혈,검출,가능,코로나,항체,아기,사례,산모,백신,접종,감염,보호,위험,가능성,의료진,아기,항체,실제,보호,항체,지속,추가,동료,검토,peer,review,가디언,이스라엘,임산부,코로나19,백신,아기,예방,효과,전달,결과,16일,현지시간,로이터통신,하다,지난달,예루살렘,센터,대학,의학,화이자,코로나,백신,2회,접종,임신,임산부,전원,항체,검출,아기,태반,전이,효과,연구원들,결과,임신부,예방,접종,산모,신생아,코로나,감염,보호,설명,결과,서비스,의학,사전,공개,온라인,메드아카이브,medRxiv,게재,연구원들,대상,범위,한계,임신,단계,접종,효과,측정,참여,울프,연구원,백신,접종,생성,항체,아기들,지속,추가,조사,백신,제조사,지난달,임산부,대상,백신,안정성,효과,확인,시험,시작"
## [3] "코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,지지자들,코로나,백신,당부,수개월,코로나,백신,접종,관심,트럼프,대통령,공개적,백신,접종,폭스뉴스,USA투데이,트럼프,대통령,이날,진행,폭스,전화,인터뷰,안전,효과,백신,생각,백신,다수,사람들,백신,접종,트럼프,대통령,백신,회의론자,투표,자유,권리,존중,여지,트럼프,대통령,멜라니아,여사,직전,퇴임,코로나,백신,공식적,사실,미국,백신,부작용,접종,코로나,백신,공화당원,백신,회의론자,CNN,민주당원,92%,백신,접종,공화당원,50%,정도,백신,접종,설문,조사,결과,회의론,불식,유튜브,생존,대통령들,미국,전직,대통령,참여,영상,코로나,백신,접종,독려,공개,버락,오바마,대통령,부부,조지,조지,W.,부시,부부,부부,클린턴,부부,지미,카터,참여,트럼프,대통령,부부"
## [4] "포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연구진,포항가속기연구소,PAL,강흥식,박사,방사광,가속기,선형,셀프시딩,Self-Seeding,인류,최고,밝기,성공,광학,분야,국제학술지,15일자,네이처,포토닉스,일자,현지시각,포항가속기연구소,방사광,가속기,PAL-XFEL,자유전자,레이저,자유전자,레이저,원형,방사광,가속기,방사광,100억,밝기,원자,분자,현상,실시간,동적,관찰,우리나라,포함,미국,일본,독일,스위스,세계,5개국,보유,시설,강흥식,박사,PAL-XFEL,셀프,시딩,방식,적용,방법,40배,밝기,개선,미국,일본,독일,스위스,방사광,가속기,10배,성능,세계,최고,인류,포항가속기연구소,시설,코로나19,치료제,백신,우선적,진행,제공,예정,세계,우위,확보,한국"
## [5] "코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러스,감염증,코로나19,바이러스,변이,백신,평생,예상,로이터,통신,15일,현지시간,영국,코로나19,유전체학,컨소시엄,COG-UK,국장,교수,샤론,피콕,백신,보강,부스터,정기적,접종,미래,예상,보도,피콕,교수,로이터,인터뷰,코로나바이러스,면역력,지속,백신,추가,접종,바이러스,진화,대처,백신,수정,전염력,면역,반응,부분적,변이들,설명,피콕,교수,독감,백신,정기적,접종,코로나19,백신,확신,파악,변이,코로나19,변이,남아프리카공화,국발,전파력,코로나19,백신,화이자,미국,제약사,앨버트,부를라,최고경영자,CEO,피콕,교수,견해,미국,인터넷,매체,악시오스,이날,부를라,악시오스,HBO,Axios,HBO,사람들,수년,코로나19,백신,접종,예상,악시오스,코로나19,변이,확산,백신,접종,일상,코로나19,2019년,중국,보고,세계,267만,생명"
str_replace_all(cv$KEYWORD[1:5], ",", " ")
## [1] "코로나 백신 접종 요양 병원 종사자 확진 충북 사례 방역 당국 이례 충북 접종자 백신 코로나 확진 판정 사례 충북도 충주시 요양 병원 원무과 근무 양성 이날 코로나 판정 A씨 차례 진행 요양 시설 종사자 선제 검사 양성 검사 직전 음성 판정 대상자 접종 A씨 아스트라제네카 AZ 백신 확인 방역 당국 2회 접종 백신 접종 최소 3주 항체 형성 최대 효과 10주 접종 확진자 접종 항체 형성 가능성 질병관리청 정례 브리핑 예방 접종 항체 형성 감염 가능 특이 상황 오류 상황 설명 충주시보건소 A씨 150여명 동료 직원 자녀 학교 50명 학생 긴급 검사 감염 경로 조사 충북 17일 기준 2만 접종 대상 1만 73.7% 백신 반응 신고 접수 227건 집계 예방접종 경증 사례 확인"
## [2] "임신 백신 엄마 아기 코로나 항체 이스라엘 연구진 임산부 접종 아기 항체 전달 미국 임신 코로나 백신 접종 여성 항체 아기 출산 16일 현지시간 미국 WPBF 방송 영국 가디언 미국 플로리다 팜비치 카운티 출산 코로나 출산 백신 여성 아기 항체 확인 의료 종사자 여성 임신 주차 미국 제약 업체 모더나 모더 백신 접종 3주 건강 여자아이 소아과의사 길버트 채드 러드닉 연구진 여성 코로나19 항체 아기 전달 확인 탯줄 혈액 샘플 채취 결과 신생아 항체 전달 확인 연구진 여성 백신 접종 제대혈 검출 가능 코로나 항체 아기 사례 산모 백신 접종 감염 보호 위험 가능성 의료진 아기 항체 실제 보호 항체 지속 추가 동료 검토 peer review 가디언 이스라엘 임산부 코로나19 백신 아기 예방 효과 전달 결과 16일 현지시간 로이터통신 하다 지난달 예루살렘 센터 대학 의학 화이자 코로나 백신 2회 접종 임신 임산부 전원 항체 검출 아기 태반 전이 효과 연구원들 결과 임신부 예방 접종 산모 신생아 코로나 감염 보호 설명 결과 서비스 의학 사전 공개 온라인 메드아카이브 medRxiv 게재 연구원들 대상 범위 한계 임신 단계 접종 효과 측정 참여 울프 연구원 백신 접종 생성 항체 아기들 지속 추가 조사 백신 제조사 지난달 임산부 대상 백신 안정성 효과 확인 시험 시작"
## [3] "코로나 백신 독려 광고 트럼프 백신 당부 도널드 트럼프 미국 대통령 16일 현지 시각 폭스 인터뷰 자신 지지자들 코로나 백신 당부 수개월 코로나 백신 접종 관심 트럼프 대통령 공개적 백신 접종 폭스뉴스 USA투데이 트럼프 대통령 이날 진행 폭스 전화 인터뷰 안전 효과 백신 생각 백신 다수 사람들 백신 접종 트럼프 대통령 백신 회의론자 투표 자유 권리 존중 여지 트럼프 대통령 멜라니아 여사 직전 퇴임 코로나 백신 공식적 사실 미국 백신 부작용 접종 코로나 백신 공화당원 백신 회의론자 CNN 민주당원 92% 백신 접종 공화당원 50% 정도 백신 접종 설문 조사 결과 회의론 불식 유튜브 생존 대통령들 미국 전직 대통령 참여 영상 코로나 백신 접종 독려 공개 버락 오바마 대통령 부부 조지 조지 W. 부시 부부 부부 클린턴 부부 지미 카터 참여 트럼프 대통령 부부"
## [4] "포항가속기 최고 인류 사상 코로나 백신 제공 셀프시딩 셀프 시딩 가속 10배 인류 사상 최고 밝기 연구진 포항가속기연구소 PAL 강흥식 박사 방사광 가속기 선형 셀프시딩 Self-Seeding 인류 최고 밝기 성공 광학 분야 국제학술지 15일자 네이처 포토닉스 일자 현지시각 포항가속기연구소 방사광 가속기 PAL-XFEL 자유전자 레이저 자유전자 레이저 원형 방사광 가속기 방사광 100억 밝기 원자 분자 현상 실시간 동적 관찰 우리나라 포함 미국 일본 독일 스위스 세계 5개국 보유 시설 강흥식 박사 PAL-XFEL 셀프 시딩 방식 적용 방법 40배 밝기 개선 미국 일본 독일 스위스 방사광 가속기 10배 성능 세계 최고 인류 포항가속기연구소 시설 코로나19 치료제 백신 우선적 진행 제공 예정 세계 우위 확보 한국"
## [5] "코로나 전문가 코로나 바이러스 백신 평생 화이자 미국 제약사 코로나19 백신 AFP 신종 코로나바이러스 감염증 코로나19 바이러스 변이 백신 평생 예상 로이터 통신 15일 현지시간 영국 코로나19 유전체학 컨소시엄 COG-UK 국장 교수 샤론 피콕 백신 보강 부스터 정기적 접종 미래 예상 보도 피콕 교수 로이터 인터뷰 코로나바이러스 면역력 지속 백신 추가 접종 바이러스 진화 대처 백신 수정 전염력 면역 반응 부분적 변이들 설명 피콕 교수 독감 백신 정기적 접종 코로나19 백신 확신 파악 변이 코로나19 변이 남아프리카공화 국발 전파력 코로나19 백신 화이자 미국 제약사 앨버트 부를라 최고경영자 CEO 피콕 교수 견해 미국 인터넷 매체 악시오스 이날 부를라 악시오스 HBO Axios HBO 사람들 수년 코로나19 백신 접종 예상 악시오스 코로나19 변이 확산 백신 접종 일상 코로나19 2019년 중국 보고 세계 267만 생명"
# Alphabet 문자열 삭제
cv$KEYWORD[1:5]
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,AZ,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
## [2] "임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신,접종,여성,항체,아기,출산,16일,현지시간,미국,WPBF,방송,영국,가디언,미국,플로리다,팜비치,카운티,출산,코로나,출산,백신,여성,아기,항체,확인,의료,종사자,여성,임신,주차,미국,제약,업체,모더나,모더,백신,접종,3주,건강,여자아이,소아과의사,길버트,채드,러드닉,연구진,여성,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,결과,신생아,항체,전달,확인,연구진,여성,백신,접종,제대혈,검출,가능,코로나,항체,아기,사례,산모,백신,접종,감염,보호,위험,가능성,의료진,아기,항체,실제,보호,항체,지속,추가,동료,검토,peer,review,가디언,이스라엘,임산부,코로나19,백신,아기,예방,효과,전달,결과,16일,현지시간,로이터통신,하다,지난달,예루살렘,센터,대학,의학,화이자,코로나,백신,2회,접종,임신,임산부,전원,항체,검출,아기,태반,전이,효과,연구원들,결과,임신부,예방,접종,산모,신생아,코로나,감염,보호,설명,결과,서비스,의학,사전,공개,온라인,메드아카이브,medRxiv,게재,연구원들,대상,범위,한계,임신,단계,접종,효과,측정,참여,울프,연구원,백신,접종,생성,항체,아기들,지속,추가,조사,백신,제조사,지난달,임산부,대상,백신,안정성,효과,확인,시험,시작"
## [3] "코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,지지자들,코로나,백신,당부,수개월,코로나,백신,접종,관심,트럼프,대통령,공개적,백신,접종,폭스뉴스,USA투데이,트럼프,대통령,이날,진행,폭스,전화,인터뷰,안전,효과,백신,생각,백신,다수,사람들,백신,접종,트럼프,대통령,백신,회의론자,투표,자유,권리,존중,여지,트럼프,대통령,멜라니아,여사,직전,퇴임,코로나,백신,공식적,사실,미국,백신,부작용,접종,코로나,백신,공화당원,백신,회의론자,CNN,민주당원,92%,백신,접종,공화당원,50%,정도,백신,접종,설문,조사,결과,회의론,불식,유튜브,생존,대통령들,미국,전직,대통령,참여,영상,코로나,백신,접종,독려,공개,버락,오바마,대통령,부부,조지,조지,W.,부시,부부,부부,클린턴,부부,지미,카터,참여,트럼프,대통령,부부"
## [4] "포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연구진,포항가속기연구소,PAL,강흥식,박사,방사광,가속기,선형,셀프시딩,Self-Seeding,인류,최고,밝기,성공,광학,분야,국제학술지,15일자,네이처,포토닉스,일자,현지시각,포항가속기연구소,방사광,가속기,PAL-XFEL,자유전자,레이저,자유전자,레이저,원형,방사광,가속기,방사광,100억,밝기,원자,분자,현상,실시간,동적,관찰,우리나라,포함,미국,일본,독일,스위스,세계,5개국,보유,시설,강흥식,박사,PAL-XFEL,셀프,시딩,방식,적용,방법,40배,밝기,개선,미국,일본,독일,스위스,방사광,가속기,10배,성능,세계,최고,인류,포항가속기연구소,시설,코로나19,치료제,백신,우선적,진행,제공,예정,세계,우위,확보,한국"
## [5] "코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러스,감염증,코로나19,바이러스,변이,백신,평생,예상,로이터,통신,15일,현지시간,영국,코로나19,유전체학,컨소시엄,COG-UK,국장,교수,샤론,피콕,백신,보강,부스터,정기적,접종,미래,예상,보도,피콕,교수,로이터,인터뷰,코로나바이러스,면역력,지속,백신,추가,접종,바이러스,진화,대처,백신,수정,전염력,면역,반응,부분적,변이들,설명,피콕,교수,독감,백신,정기적,접종,코로나19,백신,확신,파악,변이,코로나19,변이,남아프리카공화,국발,전파력,코로나19,백신,화이자,미국,제약사,앨버트,부를라,최고경영자,CEO,피콕,교수,견해,미국,인터넷,매체,악시오스,이날,부를라,악시오스,HBO,Axios,HBO,사람들,수년,코로나19,백신,접종,예상,악시오스,코로나19,변이,확산,백신,접종,일상,코로나19,2019년,중국,보고,세계,267만,생명"
str_extract_all(cv$KEYWORD[1:5], "[[:lower:]]+")
## [[1]]
## character(0)
##
## [[2]]
## [1] "peer" "review" "med" "xiv"
##
## [[3]]
## character(0)
##
## [[4]]
## [1] "elf" "eeding"
##
## [[5]]
## [1] "xios"
str_extract_all(cv$KEYWORD[1:5], "[[:upper:]]+")
## [[1]]
## [1] "A" "A" "AZ" "A"
##
## [[2]]
## [1] "WPBF" "R"
##
## [[3]]
## [1] "USA" "CNN" "W"
##
## [[4]]
## [1] "PAL" "S" "S" "PAL" "XFEL" "PAL" "XFEL"
##
## [[5]]
## [1] "AFP" "COG" "UK" "CEO" "HBO" "A" "HBO"
toupper(cv$KEYWORD[1:5])
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,AZ,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
## [2] "임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신,접종,여성,항체,아기,출산,16일,현지시간,미국,WPBF,방송,영국,가디언,미국,플로리다,팜비치,카운티,출산,코로나,출산,백신,여성,아기,항체,확인,의료,종사자,여성,임신,주차,미국,제약,업체,모더나,모더,백신,접종,3주,건강,여자아이,소아과의사,길버트,채드,러드닉,연구진,여성,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,결과,신생아,항체,전달,확인,연구진,여성,백신,접종,제대혈,검출,가능,코로나,항체,아기,사례,산모,백신,접종,감염,보호,위험,가능성,의료진,아기,항체,실제,보호,항체,지속,추가,동료,검토,PEER,REVIEW,가디언,이스라엘,임산부,코로나19,백신,아기,예방,효과,전달,결과,16일,현지시간,로이터통신,하다,지난달,예루살렘,센터,대학,의학,화이자,코로나,백신,2회,접종,임신,임산부,전원,항체,검출,아기,태반,전이,효과,연구원들,결과,임신부,예방,접종,산모,신생아,코로나,감염,보호,설명,결과,서비스,의학,사전,공개,온라인,메드아카이브,MEDRXIV,게재,연구원들,대상,범위,한계,임신,단계,접종,효과,측정,참여,울프,연구원,백신,접종,생성,항체,아기들,지속,추가,조사,백신,제조사,지난달,임산부,대상,백신,안정성,효과,확인,시험,시작"
## [3] "코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,지지자들,코로나,백신,당부,수개월,코로나,백신,접종,관심,트럼프,대통령,공개적,백신,접종,폭스뉴스,USA투데이,트럼프,대통령,이날,진행,폭스,전화,인터뷰,안전,효과,백신,생각,백신,다수,사람들,백신,접종,트럼프,대통령,백신,회의론자,투표,자유,권리,존중,여지,트럼프,대통령,멜라니아,여사,직전,퇴임,코로나,백신,공식적,사실,미국,백신,부작용,접종,코로나,백신,공화당원,백신,회의론자,CNN,민주당원,92%,백신,접종,공화당원,50%,정도,백신,접종,설문,조사,결과,회의론,불식,유튜브,생존,대통령들,미국,전직,대통령,참여,영상,코로나,백신,접종,독려,공개,버락,오바마,대통령,부부,조지,조지,W.,부시,부부,부부,클린턴,부부,지미,카터,참여,트럼프,대통령,부부"
## [4] "포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연구진,포항가속기연구소,PAL,강흥식,박사,방사광,가속기,선형,셀프시딩,SELF-SEEDING,인류,최고,밝기,성공,광학,분야,국제학술지,15일자,네이처,포토닉스,일자,현지시각,포항가속기연구소,방사광,가속기,PAL-XFEL,자유전자,레이저,자유전자,레이저,원형,방사광,가속기,방사광,100억,밝기,원자,분자,현상,실시간,동적,관찰,우리나라,포함,미국,일본,독일,스위스,세계,5개국,보유,시설,강흥식,박사,PAL-XFEL,셀프,시딩,방식,적용,방법,40배,밝기,개선,미국,일본,독일,스위스,방사광,가속기,10배,성능,세계,최고,인류,포항가속기연구소,시설,코로나19,치료제,백신,우선적,진행,제공,예정,세계,우위,확보,한국"
## [5] "코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러스,감염증,코로나19,바이러스,변이,백신,평생,예상,로이터,통신,15일,현지시간,영국,코로나19,유전체학,컨소시엄,COG-UK,국장,교수,샤론,피콕,백신,보강,부스터,정기적,접종,미래,예상,보도,피콕,교수,로이터,인터뷰,코로나바이러스,면역력,지속,백신,추가,접종,바이러스,진화,대처,백신,수정,전염력,면역,반응,부분적,변이들,설명,피콕,교수,독감,백신,정기적,접종,코로나19,백신,확신,파악,변이,코로나19,변이,남아프리카공화,국발,전파력,코로나19,백신,화이자,미국,제약사,앨버트,부를라,최고경영자,CEO,피콕,교수,견해,미국,인터넷,매체,악시오스,이날,부를라,악시오스,HBO,AXIOS,HBO,사람들,수년,코로나19,백신,접종,예상,악시오스,코로나19,변이,확산,백신,접종,일상,코로나19,2019년,중국,보고,세계,267만,생명"
str_extract_all(toupper(cv$KEYWORD[1:5]), "[[:upper:]]+")
## [[1]]
## [1] "A" "A" "AZ" "A"
##
## [[2]]
## [1] "WPBF" "PEER" "REVIEW" "MEDRXIV"
##
## [[3]]
## [1] "USA" "CNN" "W"
##
## [[4]]
## [1] "PAL" "SELF" "SEEDING" "PAL" "XFEL" "PAL" "XFEL"
##
## [[5]]
## [1] "AFP" "COG" "UK" "CEO" "HBO" "AXIOS" "HBO"
str_extract_all(toupper(cv$KEYWORD[1:5]), "[[:upper:].-]{2,}")
## [[1]]
## [1] "AZ"
##
## [[2]]
## [1] "WPBF" "PEER" "REVIEW" "MEDRXIV"
##
## [[3]]
## [1] "USA" "CNN" "W."
##
## [[4]]
## [1] "PAL" "SELF-SEEDING" "PAL-XFEL" "PAL-XFEL"
##
## [[5]]
## [1] "AFP" "COG-UK" "CEO" "HBO" "AXIOS" "HBO"
str_remove_all(toupper(cv$KEYWORD[1:5]), "[[:upper:].-]{2,}")
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
## [2] "임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신,접종,여성,항체,아기,출산,16일,현지시간,미국,,방송,영국,가디언,미국,플로리다,팜비치,카운티,출산,코로나,출산,백신,여성,아기,항체,확인,의료,종사자,여성,임신,주차,미국,제약,업체,모더나,모더,백신,접종,3주,건강,여자아이,소아과의사,길버트,채드,러드닉,연구진,여성,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,결과,신생아,항체,전달,확인,연구진,여성,백신,접종,제대혈,검출,가능,코로나,항체,아기,사례,산모,백신,접종,감염,보호,위험,가능성,의료진,아기,항체,실제,보호,항체,지속,추가,동료,검토,,,가디언,이스라엘,임산부,코로나19,백신,아기,예방,효과,전달,결과,16일,현지시간,로이터통신,하다,지난달,예루살렘,센터,대학,의학,화이자,코로나,백신,2회,접종,임신,임산부,전원,항체,검출,아기,태반,전이,효과,연구원들,결과,임신부,예방,접종,산모,신생아,코로나,감염,보호,설명,결과,서비스,의학,사전,공개,온라인,메드아카이브,,게재,연구원들,대상,범위,한계,임신,단계,접종,효과,측정,참여,울프,연구원,백신,접종,생성,항체,아기들,지속,추가,조사,백신,제조사,지난달,임산부,대상,백신,안정성,효과,확인,시험,시작"
## [3] "코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,지지자들,코로나,백신,당부,수개월,코로나,백신,접종,관심,트럼프,대통령,공개적,백신,접종,폭스뉴스,투데이,트럼프,대통령,이날,진행,폭스,전화,인터뷰,안전,효과,백신,생각,백신,다수,사람들,백신,접종,트럼프,대통령,백신,회의론자,투표,자유,권리,존중,여지,트럼프,대통령,멜라니아,여사,직전,퇴임,코로나,백신,공식적,사실,미국,백신,부작용,접종,코로나,백신,공화당원,백신,회의론자,,민주당원,92%,백신,접종,공화당원,50%,정도,백신,접종,설문,조사,결과,회의론,불식,유튜브,생존,대통령들,미국,전직,대통령,참여,영상,코로나,백신,접종,독려,공개,버락,오바마,대통령,부부,조지,조지,,부시,부부,부부,클린턴,부부,지미,카터,참여,트럼프,대통령,부부"
## [4] "포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연구진,포항가속기연구소,,강흥식,박사,방사광,가속기,선형,셀프시딩,,인류,최고,밝기,성공,광학,분야,국제학술지,15일자,네이처,포토닉스,일자,현지시각,포항가속기연구소,방사광,가속기,,자유전자,레이저,자유전자,레이저,원형,방사광,가속기,방사광,100억,밝기,원자,분자,현상,실시간,동적,관찰,우리나라,포함,미국,일본,독일,스위스,세계,5개국,보유,시설,강흥식,박사,,셀프,시딩,방식,적용,방법,40배,밝기,개선,미국,일본,독일,스위스,방사광,가속기,10배,성능,세계,최고,인류,포항가속기연구소,시설,코로나19,치료제,백신,우선적,진행,제공,예정,세계,우위,확보,한국"
## [5] "코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,,신종,코로나바이러스,감염증,코로나19,바이러스,변이,백신,평생,예상,로이터,통신,15일,현지시간,영국,코로나19,유전체학,컨소시엄,,국장,교수,샤론,피콕,백신,보강,부스터,정기적,접종,미래,예상,보도,피콕,교수,로이터,인터뷰,코로나바이러스,면역력,지속,백신,추가,접종,바이러스,진화,대처,백신,수정,전염력,면역,반응,부분적,변이들,설명,피콕,교수,독감,백신,정기적,접종,코로나19,백신,확신,파악,변이,코로나19,변이,남아프리카공화,국발,전파력,코로나19,백신,화이자,미국,제약사,앨버트,부를라,최고경영자,,피콕,교수,견해,미국,인터넷,매체,악시오스,이날,부를라,악시오스,,,,사람들,수년,코로나19,백신,접종,예상,악시오스,코로나19,변이,확산,백신,접종,일상,코로나19,2019년,중국,보고,세계,267만,생명"
지금부터 tibble이라는 데이터 프레임의 형식으로 이루어진 빅카인즈 데이터를 어휘 빈도수 분석을 위한 처리 방식에 대해서 알아보도록 하겠습니다. 이를 위해 필요한 함수를 제공하는 dplyr 그리고 tidytext라는 패키지에 대해서도 살펴보도록 하겠습니다.
각자 빅카인즈에서 다운로드 받은 엑셀 파일을 RStudio의 Working Directory 즉, 작업 폴더에 save()
함수를 이용해서 저장하도록 하겠습니다. 그리고, load()
함수를 이용해서, 해당 파일을 불러오겠습니다. 자 여기에서 본인이 사용하고 있는 컴퓨터에서 RStudio 세션의 working directory를 확인하는 방법은?
getwd()
## [1] "C:/Users/CAU/Dropbox/2021_Class/ITM/R"
save(cv, file="corona_vaccine.RData")
load("corona_vaccine.RData")
데이터 파일이 잘 로드가 되었는지 그리고 객체의 구조를 확인하기 위해서, dim()
이라는 함수를 이용해서 cv
데이터 프레임 객체의 규모 즉, 열과 행의 규모를 확인해보겠습니다.
cv
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 11
## DATE COMPANY BYLINE HEADLINE PERSON PLACE ORG KEYWORD FEATURE TEXT URL
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 20210~ 조선일보~ 신정훈 기~ "코로나 백신~ <NA> 충북,충~ 아스트라~ 코로나,백신~ 종사자,충북~ "충북에~ http~
## 2 20210~ 중앙일보~ 서유진(s~ "임신중 백신~ 러드닉,채~ 이스라엘~ WPBF~ 임신,백신,~ 미국,코로나~ "미국에~ http~
## 3 20210~ 조선일보~ 김승현 기~ "코로나 백신~ 트럼프,빌~ 미국 폭스뉴스~ 코로나,백신~ 코로나,미국~ "도널드~ http~
## 4 20210~ 영남일보~ 김기태 "포항가속기硏~ 강흥식 독일,미~ 포항가속~ 포항가속기,~ 가속기,포항~ "인류 ~ http~
## 5 20210~ 세계일보~ 김현주 "英 전문가 ~ 앨버트,피~ 최고경영~ HBO,~ 코로나,전문~ 코로나19,~ "미국 ~ http~
## 6 20210~ 국민일보~ 권남영 "임신 중 코~ <NA> 플로리다~ 모더나~ 임신,코로나~ 미국,코로나~ "미국에~ http~
## 7 20210~ 중앙일보~ 나운채(n~ "이란도 코로~ 파크리자데~ 소도,중~ AP통신~ 이란도,코로~ 코로나19,~ "이란이~ http~
## 8 20210~ 충청투데이~ 조선교 기~ "백신 이상반~ <NA> 대전을지~ 대전,아~ 백신,반응,~ 의료진,코로~ "[충청~ http~
## 9 20210~ 강원도민일보~ 양희문 "접종 후 두~ 이창률 강원도~ 춘천성심~ 접종,두통,~ 이상반응,관~ "\"경~ www.~
## 10 20210~ 국제신문~ 방종근 기~ "울산 첫 코~ <NA> 울산,중~ 울산,예~ 울산,개소,~ 동천체육관,~ "울산에~ http~
## # ... with 2,432 more rows
dim(cv) # 데이터 프레임; 2441 행; 11 열
## [1] 2442 11
cv[1,] # cv 데이터 프레임의 첫번째 행 (관측치) 인덱싱 (불러오기)
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 1 x 11
## DATE COMPANY BYLINE HEADLINE PERSON PLACE ORG KEYWORD FEATURE TEXT URL
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 20210~ 조선일보 신정훈 기~ 코로나 백신 ~ <NA> 충북,충~ 아스트라~ 코로나,백신~ 종사자,충북~ "충북에~ http~
cv[,1] # cv 데이터 프레임의 첫번째 열 (변수) 인덱싱 (불러오기)
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 1
## DATE
## <chr>
## 1 20210317
## 2 20210317
## 3 20210317
## 4 20210317
## 5 20210317
## 6 20210317
## 7 20210317
## 8 20210317
## 9 20210317
## 10 20210317
## # ... with 2,432 more rows
“corona_vaccine.RData” 파일이 로드되었고, 그 데이터 파일이 cv이라는 객체에 할당되어있음을 확인할 수 있습니다.
하지만, 현재의 데이터 파일은 11개라는 많은 변수들이 포함되어 있어 우리가 원하는, 즉 우리가 처리하고자 하는 뉴스의 변수들에 집중하기가 어려운 점이 있습니다. 다시 말해서, 어휘 빈도수 분석에 있어서는 불필요한 변수들은 제거해주는 것이 필요하겠네요. 그리고, 뉴스 내용이 중복되는 경우는 삭제해주는 과정 또한 필요하겠네요. 이러한 과정을 수행하는 데이터 처리 작업을 함께 살펴보겠습니다.
자 그러면, 이제부턴 dplyr패키지의 함수들을 이용해서 빅카인즈 데이터를 처리하는 방법을 알아보도록 하겠습니다. 우선, dplyr 패키지를 R세션에 설치해 봅시다. install.packages("dplyr")
library(dplyr)
첫번째로 살펴 볼 dplyr 패키지의 함수는 select()
입니다. 이 함수는 데이터의 변수를 선택해서 해당 변수만 남기고 나머지 변수들은 제거하는 기능을 합니다. 예를 들어서, 우리의 뉴스 데이터 객체인 cv
는 11개의 변수로 구성이 되어있죠. 앞서 말했듯, 이 변수들은 우리가 모은 뉴스들의 성격을 규정하는 역할을 합니다. 예를 들어서, 첫번째 변수의 이름을 DATE
이고 이 변수에는 각 뉴스의 사용자 아이디가 문자 벡터 형태로 포함되어 있습니다.
# 데이터의 변수 선택은: 데이터 객체 이름에 Dollar 사인 후 변수 이름 입력
class(cv$DATE) # 문자 벡터
## [1] "character"
cv$DATE[1:10] # 첫번째 뉴스부터 열번째 뉴스까지의 날짜 인덱싱
## [1] "20210317" "20210317" "20210317" "20210317" "20210317" "20210317"
## [7] "20210317" "20210317" "20210317" "20210317"
cv라는 데이터는 11 변수로 구성되어 있고, 여기에서 우리가 필요한 변수는 KEYWORD
입니다. 이 변수에는 각 뉴스의 내용에 등장하는 명사들, 즉 우리가 분석할 단어들이 문자열 벡터 형태로 포함되어 있습니다. 만약, 언론사별 구별을 하고 싶다면 COMPANY
열도 선택할 수 있습니다.
이 변수들만 남기고 나머지 변수들을 제거하기 위해서 필요한 함수가 바로 select()
입니다.
select()
: 데이터의 변수(들)을 선택 및 처리class(cv$KEYWORD) #문자(열) 벡터
## [1] "character"
cv$KEYWORD[1:10] # 첫번째 뉴스부터 열번째 뉴스의 키워드 문자열 인덱싱
## [1] "코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,사례,충북도,충주시,요양,병원,원무과,근무,양성,이날,코로나,판정,A씨,차례,진행,요양,시설,종사자,선제,검사,양성,검사,직전,음성,판정,대상자,접종,A씨,아스트라제네카,AZ,백신,확인,방역,당국,2회,접종,백신,접종,최소,3주,항체,형성,최대,효과,10주,접종,확진자,접종,항체,형성,가능성,질병관리청,정례,브리핑,예방,접종,항체,형성,감염,가능,특이,상황,오류,상황,설명,충주시보건소,A씨,150여명,동료,직원,자녀,학교,50명,학생,긴급,검사,감염,경로,조사,충북,17일,기준,2만,접종,대상,1만,73.7%,백신,반응,신고,접수,227건,집계,예방접종,경증,사례,확인"
## [2] "임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신,접종,여성,항체,아기,출산,16일,현지시간,미국,WPBF,방송,영국,가디언,미국,플로리다,팜비치,카운티,출산,코로나,출산,백신,여성,아기,항체,확인,의료,종사자,여성,임신,주차,미국,제약,업체,모더나,모더,백신,접종,3주,건강,여자아이,소아과의사,길버트,채드,러드닉,연구진,여성,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,결과,신생아,항체,전달,확인,연구진,여성,백신,접종,제대혈,검출,가능,코로나,항체,아기,사례,산모,백신,접종,감염,보호,위험,가능성,의료진,아기,항체,실제,보호,항체,지속,추가,동료,검토,peer,review,가디언,이스라엘,임산부,코로나19,백신,아기,예방,효과,전달,결과,16일,현지시간,로이터통신,하다,지난달,예루살렘,센터,대학,의학,화이자,코로나,백신,2회,접종,임신,임산부,전원,항체,검출,아기,태반,전이,효과,연구원들,결과,임신부,예방,접종,산모,신생아,코로나,감염,보호,설명,결과,서비스,의학,사전,공개,온라인,메드아카이브,medRxiv,게재,연구원들,대상,범위,한계,임신,단계,접종,효과,측정,참여,울프,연구원,백신,접종,생성,항체,아기들,지속,추가,조사,백신,제조사,지난달,임산부,대상,백신,안정성,효과,확인,시험,시작"
## [3] "코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,지지자들,코로나,백신,당부,수개월,코로나,백신,접종,관심,트럼프,대통령,공개적,백신,접종,폭스뉴스,USA투데이,트럼프,대통령,이날,진행,폭스,전화,인터뷰,안전,효과,백신,생각,백신,다수,사람들,백신,접종,트럼프,대통령,백신,회의론자,투표,자유,권리,존중,여지,트럼프,대통령,멜라니아,여사,직전,퇴임,코로나,백신,공식적,사실,미국,백신,부작용,접종,코로나,백신,공화당원,백신,회의론자,CNN,민주당원,92%,백신,접종,공화당원,50%,정도,백신,접종,설문,조사,결과,회의론,불식,유튜브,생존,대통령들,미국,전직,대통령,참여,영상,코로나,백신,접종,독려,공개,버락,오바마,대통령,부부,조지,조지,W.,부시,부부,부부,클린턴,부부,지미,카터,참여,트럼프,대통령,부부"
## [4] "포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연구진,포항가속기연구소,PAL,강흥식,박사,방사광,가속기,선형,셀프시딩,Self-Seeding,인류,최고,밝기,성공,광학,분야,국제학술지,15일자,네이처,포토닉스,일자,현지시각,포항가속기연구소,방사광,가속기,PAL-XFEL,자유전자,레이저,자유전자,레이저,원형,방사광,가속기,방사광,100억,밝기,원자,분자,현상,실시간,동적,관찰,우리나라,포함,미국,일본,독일,스위스,세계,5개국,보유,시설,강흥식,박사,PAL-XFEL,셀프,시딩,방식,적용,방법,40배,밝기,개선,미국,일본,독일,스위스,방사광,가속기,10배,성능,세계,최고,인류,포항가속기연구소,시설,코로나19,치료제,백신,우선적,진행,제공,예정,세계,우위,확보,한국"
## [5] "코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러스,감염증,코로나19,바이러스,변이,백신,평생,예상,로이터,통신,15일,현지시간,영국,코로나19,유전체학,컨소시엄,COG-UK,국장,교수,샤론,피콕,백신,보강,부스터,정기적,접종,미래,예상,보도,피콕,교수,로이터,인터뷰,코로나바이러스,면역력,지속,백신,추가,접종,바이러스,진화,대처,백신,수정,전염력,면역,반응,부분적,변이들,설명,피콕,교수,독감,백신,정기적,접종,코로나19,백신,확신,파악,변이,코로나19,변이,남아프리카공화,국발,전파력,코로나19,백신,화이자,미국,제약사,앨버트,부를라,최고경영자,CEO,피콕,교수,견해,미국,인터넷,매체,악시오스,이날,부를라,악시오스,HBO,Axios,HBO,사람들,수년,코로나19,백신,접종,예상,악시오스,코로나19,변이,확산,백신,접종,일상,코로나19,2019년,중국,보고,세계,267만,생명"
## [6] "임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출산,사례,16일,현지시간,더힐,매체,팜비치카운티,미국,플로리다주,출산,코로나19,백신,여성,항체,아기,출산,종사자,일선,의료,여성,임신,주차,미국,제약,업체,모더나,백신,접종,여성,3주,건강,여아,출산,연구진,엄마,코로나19,항체,아기,전달,확인,탯줄,혈액,샘플,채취,백신,임신,접종,전달,접종,여성,간격,모더,백신,일정,출산,접종,연구진,엄마,백신,접종,제대혈,검출,가능,코로나19,항체,영아,번째,임신,수유,여성,아기들,코로나19,백신,효능,안전성,추가"
## [7] "이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개,백신,명칭,암살,최고위급,이름,파크라,Fakhra,16일,현지시간,AP통신,현지,매체,이란,국방,혁신,기구,파크라,코로나19,백신,임상시험,돌입,파크리자데,아들,파크,임상시험,접종,대상,이란,과학자,모센파크리자데,아브사르드,테헤란,동쪽,공격,매복,테러,이란,코비란,코브파르스,자체,자체,코로나19,백신,임상,시험,진행,외신,이란,나라,코로나19,고군분투,미국,제재,자체,백신,자체,집중,통계,이란,보건부,이란,코로나19,확진자,170만,6만,사망자,발생,중동,사망자,수치"
## [8] "백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상반응,증상,접종,당일,야간,나이트,근무,접종,의료진,끼리,휴무,오프,근무,시간,조정,안내,하루,대상,접종,한계,병원,근무,교수,지난주,아스트라제네카,AZ,백신,접종,밤새,이달,백신,설문조사,접종일,확정,5일,인력,진료,일정,조정,교수,상태,환자들,의사,컨디션,저조,상태,환자들,마음,접종일,수술,코로나19,의료진,병원,관계자,백신,접종,갖가지,반응,고군분투,정부,차원,백신,접종,휴가,부여,제도,거론,인력,고갈,의료계,인력,지원,근본적,해법,모색,목소리,의료계,지역,의료,감염병,전담,병원,충남대병원,15일,5일,의료진,대상,백신,접종,대전을지대병원,대전보훈병원,17일,접종,계획,건양대학교병원,대전성모병원,AZ,백신,접종,상태,5월,접종,예정,병원,의료진들,백신,접종,모니터링,현장,투입,병원,대다수,간호,인력,접종,근무시간대,사전,조정,안내,파악,감염병,전담,병원,이상반응,확인,응급,진료,공가,방안,사실,휴무,개인,탄력적,근무,불가능,실정,병원,관계자,의료진,한정,상황,집단,백신,휴무,외래,진료,수술,차질,현실적,얘기,관계자,접종,발생,이상반응,지침,마련,정부,차원,전달,의료진들,근무시간,배려,스케줄,설명,상황,각지,병원,발생,전국보건의료노조,노동계,백신,접종,휴가,부여,백신,보관,단기간,대대적,접종기간,방안,요구,노동계,근본적,원인,인력난,노조,관계자,병상수,대비,간호,인력,지속,사태,코로나,인력,고갈,정부,소진,인력,대책,지적"
## [9] "접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신고,급증,전망,방역,당국,두통,발열,증상집단면역,코로나,백신,강원도,코로나19,백신,접종,순조,연일,접종,사망사례,반응,신고,불안감,확산,방역당국,의료계,백신,사망사례,인과성,접종,발열,근육통,발생,체내,면역,형성,반응,과도,강조,강원도,접종자,기준,도내,백신,누적,8082명,병원,의료,기관,요양병원,요양시설,종사자,입소자,코로나,2405명,대응,요원,전담치료병원,1162명,1만,이달,접종,인원,2만,감안,3주,접종,77.7%,달성,기간,기간,백신,접종,반응,신고,252건,아나필락시스,사망,중증,반응,사례,발열,두통,근육통,증세,백신,접종,사례,대응추진단,코로나19,예방,접종,대응,추진단,65세,고령층,고령,접종,대상,포함,예방,접종,4~6월,시행계획,아스트라제네카,AZ,백신,신뢰성,안정성,접종,제외,65세,고령층,고령,이달,백신,접종,2분기,접종,대상,65세,32만,집계,도내,접종,대상자,39만,추산,접종,사망사례,반응,신고,백신,접종,불안감,확산,상황,원주,요양병원,AZ,백신,A씨,여성,발견,전국적,백신,접종,사망신고,16건,반응,신고,도내,전국,8751건,집계,접종,본격적,시작,4월,반응,신고,급증,전망,도내,온라인,커뮤니티,백신,접종,독감,백신,접종,대상자,백신,게시글,원주,요양,병원,관계자,직원,접종,발열,두통,이상반응,백신,분들,이상반응,분들,방역당국,의료계,백신,사망사례,인과성,발열,이상반응,면역,형성,반응,과도,강조,방역,당국,관계자,개인,차이,개인,두통,발열,증상,정도,이창률,춘천성심병원,호흡기,내과,교수,백신,사망사례,인과성,오한,발열,이상반응,특별,치료,이틀,회복,집단면역,백신,접종,필수,강조"
## [10] "울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동천체육관,설치,울산,예방접종센터,코로나19,예방,접종,센터,영하,영하,보관,화이자,모더,백신,접종,가능,극저온,냉동,시설,순간,정전,전력,냉동,시설,전원,장치,UPS,장시간,정전,대비,비상,발전,설비,구축,센터,면적,규모,도심,접근성,대중교통,주차시설,교통,편의,장점"
cv %>% select(DATE, COMPANY, KEYWORD) # 데이터 처리 과정을 연쇄적으로 이어주는 파이프(pipe) 연산자; cv에서 DATE, COMPANY, KEYWORD 변수들만 남기고 나머지는 제거
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 중앙일보 임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신~
## 3 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 4 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 5 20210317 세계일보 코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러~
## 6 20210317 국민일보 임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출~
## 7 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 8 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 9 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 10 20210317 국제신문 울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동~
## # ... with 2,432 more rows
cv_keyword <- cv %>% select(DATE, COMPANY, KEYWORD) # 위 처리 과정을 거친 데이터를 cv_keyword라는 새로운 객체에 할당
dim(cv_keyword) # 새로운 데이터 프레임 구조 확인
## [1] 2442 3
cv_keyword
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 중앙일보 임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신~
## 3 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 4 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 5 20210317 세계일보 코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러~
## 6 20210317 국민일보 임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출~
## 7 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 8 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 9 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 10 20210317 국제신문 울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동~
## # ... with 2,432 more rows
filter()
: 데이터의 관측치(observation)을 선택 및 처리뉴스 데이터를 처리하는데 있어, 특정 관측치를 선택할 필요 filter()
함수는 입력된 조건에 부합하는 행들만 남기고 나머지는 지워주는 역할을 합니다. 가령, 어떤 뉴스의 키워드에 특정 단어가 포함되어 있는지 여부에 따라 해당 뉴스만 출력하기 위해 필요한 함수는: str_detect()
- 해당 벡터의 값 중 원하는 문자열이 포함되어 있는지 아닌지 판별하는 기능
dim(cv_keyword)
## [1] 2442 3
cv_keyword %>% filter(COMPANY=="조선일보")
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 230 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판정,~
## 2 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자신,~
## 3 20210316 조선일보 백신,코로나,내년,내년,형태,백신,코로나,바이러스,주사기,액체,형태,신종,백신,스와미나탄,세계보건기구,수~
## 4 20210314 조선일보 코로나,확진자,추가,백신,접종자,3487명,13일,459명,중앙,방역,대책,본부,지역,436명,사례,해외~
## 5 20210313 조선일보 삼각근,삼두근,코로나,백신,지난달,접종,코로나,백신,시작,기준,누적,백신,접종자,50만,백신,인원,접종,~
## 6 20210312 조선일보 이스라엘,코로나,백신,접종,81%,세계,집단,면역,그룹,이스라엘군,IDF,코로나,바이러스,감염증,집단,면~
## 7 20210310 조선일보 동생,코로나,백신,보상,가능,의구심,청원,게시판,청와대,국민,청원,부작용,코로나,백신,보상,체계,의문,제~
## 8 20210305 조선일보 코로나,사람,주사,백신,증가,항체,사이언스카페,코로나,사람,증상,여부,상관,백신,주사,예방,효과,결과,백~
## 9 20210304 조선일보 전북,사망,코로나,백신,접종자,전북,예방접종,아스트라제네카,백신,예방,접종,2명,사망,보건당국,전북도,보~
## 10 20210304 조선일보 환자,대전,요양,병원,입소,코로나,백신,대전,코로나,백신,접종,사망,사례,신고,대전시,요양병원,이날,동구~
## # ... with 220 more rows
cv_keyword %>% filter(str_detect(KEYWORD, "[A-Za-z]{2,7}"))
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 1,614 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 중앙일보 임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신~
## 3 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 4 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 5 20210317 세계일보 코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러~
## 6 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 7 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 8 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 9 20210317 국제신문 울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동~
## 10 20210317 경기일보 연구팀,가천대,강동우,가능성,나노,코로나,활용,항암,면역,백신,가능,가천대,국제,학술지,어드밴스드,사~
## # ... with 1,604 more rows
만약 해당 문자열을 포함하지 않는 뉴스를 추출하기 위해 필요한 연산자는: !
! 는 논리 연산에서 부정의 뜻을 의미: ~~이 아니다.
!str_detect(cv_keyword$KEYWORD, "화이자|Pfizer")[1:50]
## [1] TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
## [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [25] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [37] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [49] TRUE TRUE
cv_keyword %>% filter(!str_detect(KEYWORD, "화이자|Pfizer"))
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 1,659 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 3 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 4 20210317 국민일보 임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출~
## 5 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 6 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 7 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 8 20210316 중도일보 김해시,접종,코로나,백신,1년,선방,불구,인접,위기,최선,허성곤,시장,시민,희생,감사,일상회복,김해시~
## 9 20210316 경상일보 울산문화백신프로젝트,100인,인터뷰,코로나,주민,인터뷰,애니,다큐,추진,신화,예술촌,입주,작가,평년,~
## 10 20210316 조선일보 백신,코로나,내년,내년,형태,백신,코로나,바이러스,주사기,액체,형태,신종,백신,스와미나탄,세계보건기구~
## # ... with 1,649 more rows
KEYWORD 변수에 문자열 벡터로 담겨있는 텍스트 내용이 “화이자” 또는 “Pfizer” 문자열 포함하는 조건에 해당하는 행만 남기고 나머지는 제거
select()
와 filter()
라는 dplyr
패키지의 함수를 이용해서 데이터 처리하는 과정을 살펴봄.
tidytext
자, 이제는 “tidy” 데이터가 무엇인지, 그 원리를 살펴보고 이를 기반으로 한 어휘 빈도수 분석에 효율적인 함수를 제공하는 “tidytext” 패키지를 소개해드리도록 하겠습니다. 특히, 이 패키지의 unnest_tokens()
함수는 텍스트 전처리에 매우 편리한 기능을 제공합니다.
자 우선, tidytext
패키지와 텍스트 전처리에 필요한 stringr
패키지를 R세션에 설치해 봅시다.
library(tidytext)
cv_keyword
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 중앙일보 임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신~
## 3 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 4 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 5 20210317 세계일보 코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러~
## 6 20210317 국민일보 임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출~
## 7 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 8 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 9 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 10 20210317 국제신문 울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동~
## # ... with 2,432 more rows
앞서 우리는 어휘 빈도수 분석을 위한 여러 전처리 과정을 살펴보았습니다. 그리고 이렇게 전처리 과정을 거친 텍스트를 단어 단위로 분석하기 위해서 쉼표를 기준으로 문자열을 쪼개는 작업을 거쳤습니다. 이를 위해 str_split()
이라는 함수를 사용했었죠.
tidytext
패키지의 unnest_tokens()
함수는 이 과정을 한번에 그리고 편리하게 수행할 수 있도록 해주는 기능을 수행합니다. 특정 문자 혹은 기호를 기준으로 문자열을 쪼개서 그 결과값을 ‘tidy’ 데이터로 만들어 줍니다. 결국, 텍스트를 토큰 단위로 쪼개서 한 행에 하나의 토큰, 여기에선 한 단어씩 위치하게하는 데이터 프레임 형식으로 변환하는 기능을 수행하는 거죠.
tidy
데이터란 각 행에 하나의 토큰(여기에선 하나의 단어)만 위치하도록 구성된 테이블을 말합니다. 결국 tidy
한 데이터를 만든다는 것은 토큰의 단위를 정하고 텍스트 데이터를 토큰화하여 각 행이 하나의 토큰으로 구성되게 만든다는 것이죠. 이렇게 tidy
데이터를 구성한다는 것은 각 행이 하나의 단어씩 가지고 있기 때문에 이후 어휘 빈도수 분석 또는 사전기반 감정분석을 수행할 때 편리하게 연계 작업할 수 있다는 장점이 있습니다.
자, 다음의 R코드는 unnest_tokens()
함수를 이용해서 cv_keyword
라는 뉴스 데이터를 토큰화한 과정을 보여주는데요.
cv_keyword # dplyr의 arrange() 함수는 해당 변수를 순차적으로 정렬
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2,442 x 3
## DATE COMPANY KEYWORD
## <chr> <chr> <chr>
## 1 20210317 조선일보 코로나,백신,접종,요양,병원,종사자,확진,충북,사례,방역,당국,이례,충북,접종자,백신,코로나,확진,판~
## 2 20210317 중앙일보 임신,백신,엄마,아기,코로나,항체,이스라엘,연구진,임산부,접종,아기,항체,전달,미국,임신,코로나,백신~
## 3 20210317 조선일보 코로나,백신,독려,광고,트럼프,백신,당부,도널드,트럼프,미국,대통령,16일,현지,시각,폭스,인터뷰,자~
## 4 20210317 영남일보 포항가속기,최고,인류,사상,코로나,백신,제공,셀프시딩,셀프,시딩,가속,10배,인류,사상,최고,밝기,연~
## 5 20210317 세계일보 코로나,전문가,코로나,바이러스,백신,평생,화이자,미국,제약사,코로나19,백신,AFP,신종,코로나바이러~
## 6 20210317 국민일보 임신,코로나,백신,엄마,항체,보유,아기,출산,미국,임신,코로나19,백신,접종,여성,항체,보유,아기,출~
## 7 20210317 중앙일보 이란도,코로나,백신,공개,암살,이름,과학자,이란,자체,신종,코로나바이러스,감염증,코로나19,백신,공개~
## 8 20210317 충청투데이 백신,반응,코로나,대전,대학병원,근무,간호사,코로나19,코로나,백신,접종,접종,30여분,모니터링,이상~
## 9 20210317 강원도민일보~ 접종,두통,발열,몸살,코로나,백신,공포증,확산,반응,이틀,회복,전국적,사망사례,이상반응,접종,내달,신~
## 10 20210317 국제신문 울산,개소,코로나,백신,접종,센터,동천체육관,울산,접종센터,코로나19,백신,접종,센터,16일,중구,동~
## # ... with 2,432 more rows
cv_keyword %>% rowid_to_column() %>% unnest_tokens(word, KEYWORD, token = "regex", pattern = ",")
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 434,342 x 4
## rowid DATE COMPANY word
## <int> <chr> <chr> <chr>
## 1 1 20210317 조선일보 코로나
## 2 1 20210317 조선일보 백신
## 3 1 20210317 조선일보 접종
## 4 1 20210317 조선일보 요양
## 5 1 20210317 조선일보 병원
## 6 1 20210317 조선일보 종사자
## 7 1 20210317 조선일보 확진
## 8 1 20210317 조선일보 충북
## 9 1 20210317 조선일보 사례
## 10 1 20210317 조선일보 방역
## # ... with 434,332 more rows
cv_keyword %>% arrange(COMPANY) %>% rowid_to_column() %>% unnest_tokens(word, KEYWORD, token = "regex", pattern = ",") %>% slice(1:30)# dplyr의 slice() 함수는 특정 범위의 행(들)만 추출해서 보여주는 기능을 함
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 30 x 4
## rowid DATE COMPANY word
## <int> <chr> <chr> <chr>
## 1 1 20210316 KBS 300명
## 2 1 20210316 KBS 코로나
## 3 1 20210316 KBS 신규
## 4 1 20210316 KBS 확진자
## 5 1 20210316 KBS 이틀
## 6 1 20210316 KBS 백신
## 7 1 20210316 KBS 2천
## 8 1 20210316 KBS 접종
## 9 1 20210316 KBS 앵커
## 10 1 20210316 KBS 확진자
## # ... with 20 more rows
cv_keyword_tidy <- cv_keyword %>% rowid_to_column() %>% unnest_tokens(word, KEYWORD, token = "regex", pattern = ",")
cv_keyword_tidy
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 434,342 x 4
## rowid DATE COMPANY word
## <int> <chr> <chr> <chr>
## 1 1 20210317 조선일보 코로나
## 2 1 20210317 조선일보 백신
## 3 1 20210317 조선일보 접종
## 4 1 20210317 조선일보 요양
## 5 1 20210317 조선일보 병원
## 6 1 20210317 조선일보 종사자
## 7 1 20210317 조선일보 확진
## 8 1 20210317 조선일보 충북
## 9 1 20210317 조선일보 사례
## 10 1 20210317 조선일보 방역
## # ... with 434,332 more rows
cv_keyword_tidy %>% count(word, sort=TRUE)
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 28,448 x 2
## word n
## <chr> <int>
## 1 백신 26772
## 2 접종 14150
## 3 코로나19 8325
## 4 코로나 5575
## 5 미국 3201
## 6 정부 3173
## 7 시작 2259
## 8 확보 2110
## 9 예방 1867
## 10 임상 1847
## # ... with 28,438 more rows
cv_keyword_tidy %>%
filter(COMPANY %in% c("조선일보","한겨레")) %>%
count(COMPANY, word, sort=TRUE) %>%
group_by(COMPANY) %>%
top_n(10) %>%
arrange(COMPANY)
## Selecting by n
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 20 x 3
## # Groups: COMPANY [2]
## COMPANY word n
## <chr> <chr> <int>
## 1 조선일보 백신 2995
## 2 조선일보 코로나 1446
## 3 조선일보 접종 1062
## 4 조선일보 바이러스 423
## 5 조선일보 미국 411
## 6 조선일보 임상 292
## 7 조선일보 정부 272
## 8 조선일보 시험 250
## 9 조선일보 영국 222
## 10 조선일보 감염 212
## 11 한겨레 백신 950
## 12 한겨레 접종 440
## 13 한겨레 코로나19 277
## 14 한겨레 미국 181
## 15 한겨레 승인 128
## 16 한겨레 코로나 120
## 17 한겨레 정부 119
## 18 한겨레 시작 106
## 19 한겨레 아스트라제네카 97
## 20 한겨레 이날 79
이 코드는 cv_keyword
는 데이터를 unnest_tokens()
함수를 이용하여, KEYWORD
라는 변수의 문자열을 단어 단위로 쪼개서 word
라는 새로운 변수에 저장해주라는 명령을 수행합니다. 여기에서 토큰화 단위는 즉, 문자열을 쪼개고자 하는 기본 단위는 token
이라는 인자를 “words”로 설정했죠. 이를 통해 단어 단위로 문자열을 토큰화하라는 설정이 취해진 것입니다.
unnest_tokens()
함수의 기능은 문자열을 단어 단위로 토큰화하라는 것 이외에 정규 표현식을 이용해서 텍스트를 토큰화하도록 할 수 있다는 점인데요. 따라서 텍스트를 쪼개는 토큰의 단위를 다양하게 설정할 수 있는 장점이 있습니다. 예를 들어서, 우리가 다루는 뉴스 데이터에 경우, 키워드 칼럼에 쉼표로 구분되는 명사들이 문자열로 포함되어 있는데요. 따라서 쉼표 기호를 기준으로 토큰화 방법이 필요하고, 이 때 unnest_tokens()
는 유용한 기능을 합니다.
토큰화에서 문자열을 쪼개는 기준을 특별히 정하기 위해서는 token
인자를 words
가 아닌 regex
로 설정하고, pattern
인자를 기준이 될 문자열 패턴을 정해주면 됩니다. 가령, 쉼표을 기준으로 문자열을 쪼개고 싶다는 가정하에 다음의 코드를 실행해 보도록 하겠습니다.
cv_keyword %>% unnest_tokens(word, KEYWORD, token = "regex", pattern=",") %>% slice(11:30)
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 20 x 3
## DATE COMPANY word
## <chr> <chr> <chr>
## 1 20210317 조선일보 당국
## 2 20210317 조선일보 이례
## 3 20210317 조선일보 충북
## 4 20210317 조선일보 접종자
## 5 20210317 조선일보 백신
## 6 20210317 조선일보 코로나
## 7 20210317 조선일보 확진
## 8 20210317 조선일보 판정
## 9 20210317 조선일보 사례
## 10 20210317 조선일보 충북도
## 11 20210317 조선일보 충주시
## 12 20210317 조선일보 요양
## 13 20210317 조선일보 병원
## 14 20210317 조선일보 원무과
## 15 20210317 조선일보 근무
## 16 20210317 조선일보 양성
## 17 20210317 조선일보 이날
## 18 20210317 조선일보 코로나
## 19 20210317 조선일보 판정
## 20 20210317 조선일보 a씨
자, 이러한 tidytext
방식의 토큰화를 거치면, 뉴스 텍스트가 어휘 단위로 구분된 새로운 데이터를 얻게 되는데요. 이를 이용하면 어휘 빈도수 분석이 매우 용이합니다.
cv_word_count <- cv_keyword %>%
unnest_tokens(word, KEYWORD, token = "regex", pattern=",") %>%
count(word, sort = TRUE)
dplyr의 count() 함수는 해당 변수 즉 벡터를 구성하는 값들의 빈도수를 계산합니다. sort 인자는 빈도수를 내림차순을 정렬할 수 있게 합니다.
단어 빈도수가 데이터 형식으로 저장된 cv_word_count의 내용을 인덱싱
cv_word_count[1:10,] #`cv_word_count`는 데이터 프레임의 형식을 갖추고 있다. 변수는 두개. 관측값은 28,448. 즉, 뉴스에서 나타나는 고유 단어의 수
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 10 x 2
## word n
## <chr> <int>
## 1 백신 26772
## 2 접종 14150
## 3 코로나19 8325
## 4 코로나 5575
## 5 미국 3201
## 6 정부 3173
## 7 시작 2259
## 8 확보 2110
## 9 예방 1867
## 10 임상 1847
cv_word_count[41:50,] # 데이터 프레임 인덱싱 방법, 대괄호에 쉼표 앞에 숫자 또는 그 범위는 해당 행의 범위, 쉼표 뛰는 해당 열의 범위
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 10 x 2
## word n
## <chr> <int>
## 1 방역 993
## 2 신종 963
## 3 코로나바이러스 956
## 4 부작용 931
## 5 생산 923
## 6 발생 911
## 7 감염증 898
## 8 시설 898
## 9 지원 895
## 10 환자 894
library(wordcloud)
## Loading required package: RColorBrewer
set.seed(210324)
pal <- brewer.pal(8, "Dark2")
wordcloud(words = cv_word_count$word,
freq = cv_word_count$n,
max.words = 200,
random.order =FALSE,
rot.per = 0.1,
scale = c(4, 0.4),
colors = pal)
dic <- read_csv("knu_sentiment_lexicon.csv")
## Parsed with column specification:
## cols(
## word = col_character(),
## polarity = col_double()
## )
dic
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 14,854 x 2
## word polarity
## <chr> <dbl>
## 1 ㅡㅡ -1
## 2 ㅠㅠ -1
## 3 ㅠ_ㅠ -1
## 4 ㅠ -1
## 5 ㅜㅡ -1
## 6 ㅜㅜ -1
## 7 ㅜ_ㅜ -1
## 8 ㅜ.ㅜ -1
## 9 ㅜ -1
## 10 ㅗ -1
## # ... with 14,844 more rows
cv_keyword_tidy
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 434,342 x 4
## rowid DATE COMPANY word
## <int> <chr> <chr> <chr>
## 1 1 20210317 조선일보 코로나
## 2 1 20210317 조선일보 백신
## 3 1 20210317 조선일보 접종
## 4 1 20210317 조선일보 요양
## 5 1 20210317 조선일보 병원
## 6 1 20210317 조선일보 종사자
## 7 1 20210317 조선일보 확진
## 8 1 20210317 조선일보 충북
## 9 1 20210317 조선일보 사례
## 10 1 20210317 조선일보 방역
## # ... with 434,332 more rows
cv_keyword_tidy %>% inner_join(dic, by="word")
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 19,004 x 5
## rowid DATE COMPANY word polarity
## <int> <chr> <chr> <chr> <dbl>
## 1 1 20210317 조선일보 예방 1
## 2 1 20210317 조선일보 오류 -2
## 3 1 20210317 조선일보 대상 1
## 4 2 20210317 중앙일보 예방 1
## 5 2 20210317 중앙일보 예방 1
## 6 2 20210317 중앙일보 대상 1
## 7 2 20210317 중앙일보 한계 -1
## 8 2 20210317 중앙일보 대상 1
## 9 3 20210317 조선일보 안전 2
## 10 3 20210317 조선일보 존중 1
## # ... with 18,994 more rows
cv_keyword_tidy %>%
inner_join(dic, by="word") %>%
group_by(rowid) %>%
summarise(total = sum(polarity)) %>%
count(total > 0)
## Warning: `...` is not empty.
##
## We detected these problematic arguments:
## * `needs_dots`
##
## These dots only exist to allow future extensions and should be empty.
## Did you misspecify an argument?
## # A tibble: 2 x 2
## `total > 0` n
## * <lgl> <int>
## 1 FALSE 1220
## 2 TRUE 1044
다시 한번 강조하자면, 정규 표현식은 특정 텍스트 문자열을 일괄적으로 찾아낼 수 있는 패턴을 구성하는 것이라 할 수 있습니다. 따라서 regex를 사용할 경우 우리가 처리하고자 하는 텍스트 패턴을 모두 찾아낼 수 있습니다. 그리고 stringr 패키지에서 regex pattern을 잘 구성해서 이용하는 것은 그래서 매우 중요합니다.
그러면 어떻게 regex를 구성해야 할까요. 위에서 언급했듯, 패턴 매칭의 가장 간단한 방법은 특정 문자열 그대로를 찾도록 만드는 것입니다. 예를 들어, 텍스트 문서에서 특정 단어를 매칭하고자 할 때 문자열을 매칭하고자 하는 문자패턴 그대로의 regex를 사용하는 것이죠.
하지만 대부분의 경우 보다 복잡한 구조의 정규표현식 패턴을 만들어야 할 필요가 생깁니다. 예를 들어서 한글 또는 영어(알파벳)로 이루어진 모든 문자열 혹은 모든 숫자, 또는 모든 구두점, 또는 해시 태그나 url들을 모두 매칭해서 처리하려면 어떻게 해야 할까요? 이러한 필요를 충족시키는 regex 구성 방법에 대해서 설명드리도록 하겠습니다.
우선, 가장 단순한 일치로 시작해봅시다. : 문자 그대로의 패턴 리터럴 문자 일치는 문자 “코로나”와 같은 주어진 문자가 문자 “코로나”와 일치한다는 것입니다. 이 것은 그 자체로 일치하기 때문에 literal이라고 불리웁니다. 이 유형의 일치는 가장 기본적인 유형의 정규표현식 연산입니다. 일반 텍스트와 따옴표만 일치시킵니다.
다음은 정규표현식에 대한 기본적인 이해를 위한 예입니다.
우리가 정규표현식으로 매칭할 첫번째 문자열은 단어 "코로나"
입니다. 이 문자열은 문자 “코”, 문자 “로”, 문자 “나”로 구성됩니다. 그러나 우리가 regex 패턴을 “코로나”로 구성한다면 단어 “코로나”뿐만 아니라 단어 “코로나19” 또한 매칭하는 결과를 얻게 될 것입니다. 따라서 따라서 정규 표현식 패턴은 시작과 끝에 공백이 있어야 하겠죠: " 코로나 "
다시 한번 강조하자면, 정규표현식에서 공백은 문자로 인식됩니다.
자 이제, 문자열 백터 객체 cv$HEADLINE[1:10]
에 특정 정규표현식을 적용해 봅시다.
우리가 구성한 정규표현이 문자열 객체에서 찾아낸 즉, 매칭된 결과를 확인하기 위해 우리는 str_extract_all()
함수를 사용하겠습니다.
library(stringr)
View(cv)
cv$HEADLINE[1:10]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
## [4] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
## [5] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
## [6] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], pattern= " 코로나 ")
## [[1]]
## character(0)
##
## [[2]]
## [1] " 코로나 "
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## [1] " 코로나 "
##
## [[7]]
## [1] " 코로나 "
##
## [[8]]
## [1] " 코로나 "
##
## [[9]]
## [1] " 코로나 "
##
## [[10]]
## [1] " 코로나 "
str_extract_all(cv$HEADLINE[1:10], pattern= "코로나")
## [[1]]
## [1] "코로나"
##
## [[2]]
## [1] "코로나"
##
## [[3]]
## [1] "코로나"
##
## [[4]]
## [1] "코로나"
##
## [[5]]
## [1] "코로나"
##
## [[6]]
## [1] "코로나"
##
## [[7]]
## [1] "코로나"
##
## [[8]]
## [1] "코로나"
##
## [[9]]
## [1] "코로나"
##
## [[10]]
## [1] "코로나"
# 문자열 객체가 먼저 오고 정규표현식의 지정된 패턴이 뒤따릅니다.
# pattern 즉 정규표현 구성을 지정하는 옵션값 설정
또한 모든 숫자(문자도 마찬가지입니다)는 리터럴 문자로 간주됩니다. 패턴 “코로나19”을 테스트 해봅시다.
cv$HEADLINE[1:10]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
## [4] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
## [5] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
## [6] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], "코로나19") # 모든 숫자는 리터럴 문자입니다.
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## character(0)
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)
이제 우리는 메타문자(metacharacter)에 대해서 학습할 것입니다. 가장 기본적인 유형의 정규 표현식은 자신과 일치하는 리터럴 문자입니다. 하지만 모든 문자가 리터럴 문자는 아닙니다. 정규 표현을 구성하는 데 있어서 특수 목적을 갖고 그 역할을 수행하는 문자들도 있습니다. 그것이 바로 메타문자입니다. 이런 유형의 문자는 특별한 의미가 있기 때문에 일괄적으로 리터럴 문자들을 찾아내는 데 유용합니다.
정규표현식에서 metacharacters에는 15개의 종류가 있습니다. 각 기능에 대해서는 앞으로 적용해가면서 배워봅시다.
.
\
|
(OR)(
)
[
]
{
}
-
(문자 집합에서 범위를 구성함)^
(문자 집합에서 부정 기능)$
(앞선 표현이 매칭의 끝임)*
(앞선 표현이 0회 혹은 1회 이상 매칭 됨)+
(앞선 표현이 1회 이상 매칭됨)?
(앞선 표현이 1회 매칭될 수도 또는 안될 수도 있음)앞으로 우리는 이러한 메타 문자를 응용하여 정규 표현을 구성하는 법을 알아 볼 것입니다. 사실, 정규 표현식에서 중요한 것은 이 메타 문자가 어떻게 작동하는지 이해하고 적용하는 것입니다. 다행히, 메타 문자의 종류가 아주 많지는 않죠. 하지만 몇몇 메타 문자에는 하나 이상의 의미를 가진 것도 있습니다. 그리고 이 경우 메타 문자의 의미는 사용하는 맥락, 사용 방법, 사용 장소에 따라 달라지게 되죠. 마치 우리가 일상적으로하는 대화에서도 같은 어휘라도, 문맥에 따라 그 의미가 완전히 달라지게 되는 경우가 있는 것 처럼 말이죠. 따라서 이러한 정규 표현의 메타 문자를 이해하고 응용에 익숙해지는 데에는 시간이 다소 걸릴 수 있으며 많은 연습이 필요합니다.
우리가 배울 첫 메타 문자는 wild 메타 문자로 더 잘 알려진 “.”(점)입니다. 이 메타 문자는 모든 리터럴 문자를 찾는데 (매칭하는데) 사용됩니다.
예를 들어, "코.. "
로 구성된 regex를 생각해봅시다. 이 표현은 “코로나”라는 패턴과도 매칭됩니다. 그러나 하나의 점은 하나의 단일 문자와만 일치하므로 “코로나19”와는 매칭되지 않습니다.
빅카인즈 데이터 프레임에서 헤드라인을 벡터형태로 추출하는 cv$HEADLINE
객체에 이 정규표현을 적용해 보겠습니다.
cv$HEADLINE[1:10]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
## [4] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
## [5] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
## [6] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], "코.. ")
## [[1]]
## [1] "코로나 "
##
## [[2]]
## [1] "코로나 "
##
## [[3]]
## [1] "코로나 "
##
## [[4]]
## [1] "코로나 "
##
## [[5]]
## [1] "코로나 "
##
## [[6]]
## [1] "코로나 "
##
## [[7]]
## [1] "코로나 "
##
## [[8]]
## [1] "코로나 "
##
## [[9]]
## [1] "코로나 "
##
## [[10]]
## [1] "코로나 "
str_extract_all(cv$HEADLINE[1:10], " 코..")
## [[1]]
## character(0)
##
## [[2]]
## [1] " 코로나"
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## [1] " 코로나"
##
## [[7]]
## [1] " 코로나"
##
## [[8]]
## [1] " 코로나"
##
## [[9]]
## [1] " 코로나"
##
## [[10]]
## [1] " 코로나"
와일드 메타 문자는 정규 표현식에서 가장 많이 사용되는 메타 문자 중 하나이지만 많은 실수의 이유가 되기도 합니다. 예를 들어, "코.나"
와 일치하는 정규 표현식을 만들고 싶다고 가정해봅시다. 이 패턴은 “코.나”뿐만 아니라, “코로나”, “코 나”, “코&나”와도 일치할 수 있습니다.
왜?
왜냐하면 "."
은 모든 것과 일치하는 메타 문자이기 때문입니다.
그렇다면 메타 문자 대신 리터럴 문자로서의 마침표를 찾아내고 매칭시킬 수 있을까요? 예를 들어, 다음과 같은 문자열 벡터가 있다고 가정해 봅시다.
dot_words <- c("코.나", "코로나", "코 나", "코&나")
패턴 "코.나"
를 사용하면, dot_words
에 있는 모든 요소와 일치합니다.
str_extract_all(dot_words, "코.나")
## [[1]]
## [1] "코.나"
##
## [[2]]
## [1] "코로나"
##
## [[3]]
## [1] "코 나"
##
## [[4]]
## [1] "코&나"
따라서 리터럴 문자인 마침표와 매칭시키려면, 메타 문자를 이스케이프 처리해야 합니다.
대부분의 프로그래밍 언어에서 메타 문자를 이스케이프하는 방법은 메타 문자 앞에 백 슬래시 문자를 추가하는 것입니다. 메타 문자 앞에 백 슬래시를 붙이면 메타문자로서의 더 이상 특별한 의미를 가지지 않으며 리터럴 문자로서 인식하게 됩니다. 그러나 R은 조금 다릅니다. 단일 백슬래시를 넣는 것이 아니라 2개의 백 슬래시를 넣어야 합니다. : "코\\.나"
. 단일 백 슬래시 "\"
가 R에서는 메타 문자로 다른 의미를 가지기 때문입니다.
str_extract_all(dot_words, "코\\.나")
## [[1]]
## [1] "코.나"
##
## [[2]]
## character(0)
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
코로나 백신 뉴스 헤드라인의 문자열 벡터 객체인 cv$HEADLINE
에서 “코로나”나 “코로나19”에 해당하는 모든 문자열을 찾아내어 추출한 후, 그 빈도수를 계산하는 R 입력값은 무엇입니까?
지금까지 메타 문자를 이스케이프 (탈출)하여 리터럴 문자로서 매칭하는 방법에 대해 학습하였습니다. 이제부터는 문자 집합을 정의하는데에 사용되는 메타 문자인 대괄호 []
에 대해 알아보도록 하겠습니다.
가령, 우리가 한국어가 아닌 모든 문자열을 지워주고 싶다고 가정해 봅시다. 이 경우 우리는 중간에 올 수 있는 모든 알파벳과 숫자, 구두점 등의 경우를 가정해서 단어 집합으로 구성된 정규 표현을 이용해 줄 수 있습니다. 하지만, 그러나 이러한 방식으로 우리가 원하는 모든 문자를 매칭하는 것은 매우 소모적인 일일 것입니다. 이 경우에 우리는 문자 그 자체와 일치하지는 않지만 원하는 문자들의 범위를 지정해주는 방법으로 패턴을 매칭하는 방법을 택할 수 있습니다.
문자 집합은 집합 안에 있는 다양한 문자 중 하나와 일치합니다. 즉, "[코로나]"
라는 표현은 “코”, “로”, “나” 중 어떠한 한글 문자와도 매칭됩니다. 여기서 대괄호 []
는 문자 집합을 정의하는 표현입니다.
문자 집합 내의 문자 순서는 중요하지 않습니다. 중요한 것은 대괄호 안에 있는 문자의 종류입니다. 따라서 문자 집합 "[코로나]"
는 "[나로코]"
와 같은 기능을 합니다.
"[코로나]"
라는 정규 표현 패턴으로 헤드라인에서 “코”, “로”, “나”에 해당하는 한글 문자를 추출해봅시다.
library(stringr)
cv$HEADLINE[1:10]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
## [4] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
## [5] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
## [6] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], "[코로나]") #첫 10개의 헤드라인
## [[1]]
## [1] "코" "로" "나"
##
## [[2]]
## [1] "코" "로" "나"
##
## [[3]]
## [1] "코" "로" "나"
##
## [[4]]
## [1] "코" "로" "나"
##
## [[5]]
## [1] "코" "로" "나"
##
## [[6]]
## [1] "코" "로" "나"
##
## [[7]]
## [1] "코" "로" "나"
##
## [[8]]
## [1] "코" "로" "나" "로"
##
## [[9]]
## [1] "코" "로" "나"
##
## [[10]]
## [1] "코" "로" "나"
str_extract_all(cv$HEADLINE[1:10], "[나로코]")
## [[1]]
## [1] "코" "로" "나"
##
## [[2]]
## [1] "코" "로" "나"
##
## [[3]]
## [1] "코" "로" "나"
##
## [[4]]
## [1] "코" "로" "나"
##
## [[5]]
## [1] "코" "로" "나"
##
## [[6]]
## [1] "코" "로" "나"
##
## [[7]]
## [1] "코" "로" "나"
##
## [[8]]
## [1] "코" "로" "나" "로"
##
## [[9]]
## [1] "코" "로" "나"
##
## [[10]]
## [1] "코" "로" "나"
“[코로나]” 집합은 하나의 한글 문자와만 매칭됩니다.
str_extract_all(cv$HEADLINE[1:10], "[코로나][코로나]")
## [[1]]
## [1] "코로"
##
## [[2]]
## [1] "코로"
##
## [[3]]
## [1] "코로"
##
## [[4]]
## [1] "코로"
##
## [[5]]
## [1] "코로"
##
## [[6]]
## [1] "코로"
##
## [[7]]
## [1] "코로"
##
## [[8]]
## [1] "코로"
##
## [[9]]
## [1] "코로"
##
## [[10]]
## [1] "코로"
str_extract_all(cv$HEADLINE[1:10], "[코로나][코로나][코로나]")
## [[1]]
## [1] "코로나"
##
## [[2]]
## [1] "코로나"
##
## [[3]]
## [1] "코로나"
##
## [[4]]
## [1] "코로나"
##
## [[5]]
## [1] "코로나"
##
## [[6]]
## [1] "코로나"
##
## [[7]]
## [1] "코로나"
##
## [[8]]
## [1] "코로나"
##
## [[9]]
## [1] "코로나"
##
## [[10]]
## [1] "코로나"
보다시피 헤드라인 벡터안에 각 요소를 구성하는 두글자 문자와 일치합니다. 문자 집합은 하나의 문자로만 기능합니다.
위에서 설명한 문자 집합은 찾고자 하는 문자 모두를 지정합니다. 그렇다면 알파벳(대문자 또는 소문자)의 범위 또는 임의의 숫자 범위에 속하는 어떤 문자와도 매칭되는 문자 집합은 어떻게 구성할 수 있을까요?
메타 문자 하이픈을(hyphen) "-"
사용해서 문자 범위를 구성하면 이 문제를 해결할 수 있습니다. 즉, 매칭하고자 하는 문자들의 범위를 하이픈 "-"
기호로 지정하는 것입니다.
이러한 방식으로 다음과 같이 영어 대문자, 영어 소문자, 숫자, 그리고 한글 문자 집합을 정의할 수 있습니다.
uppercase <- "[A-Z]"
lowercase <- "[a-z]"
number <- "[0-9]"
한글 <- "[가-힣]"
*하이픈 기호는 문자 집합 안에 있을 때만 메타 문자입니다. 문자 집합 이외에서 쓰이는 하이픈은 리터럴 문자입니다.
이렇게 문자 범위로 구성된 정규 표현은 매우 유용합니다. 다음의 예를 함께 보실까요.
3개의 문자로 구성된 문자열을 가진 다음의 벡터 객체, cv$HEADLINE
를 상대로 문자 범위로 구성된 정규표현으로 매칭한 결과를 살펴봅시다.
"[가-힣]"
라는 정규 표현 패턴으로 헤드라인을 구성하는 모든 한글 문자를 추출해봅시다.
library(stringr)
str_extract_all(cv$HEADLINE[1:10], "[가-힣]") #첫 10개의 헤드라인
## [[1]]
## [1] "코" "로" "나" "백" "신" "접" "종" "요" "양" "병" "원" "종" "사" "자" "확"
## [16] "진" "충" "북" "첫" "사" "례"
##
## [[2]]
## [1] "임" "신" "중" "백" "신" "맞" "은" "엄" "마" "아" "기" "는" "코" "로" "나"
## [16] "항" "체" "갖" "고" "태" "어" "났" "다"
##
## [[3]]
## [1] "코" "로" "나" "백" "신" "독" "려" "광" "고" "빠" "졌" "던" "트" "럼" "프"
## [16] "돌" "연" "백" "신" "맞" "으" "라" "당" "부"
##
## [[4]]
## [1] "포" "항" "가" "속" "기" "인" "류" "사" "상" "최" "고" "밝" "은" "빛" "구"
## [16] "현" "코" "로" "나" "백" "신" "개" "발" "우" "선" "제" "공"
##
## [[5]]
## [1] "전" "문" "가" "코" "로" "나" "변" "이" "바" "이" "러" "스" "사" "라" "지"
## [16] "지" "않" "아" "백" "신" "평" "생" "맞" "아" "야" "할" "지" "도" "우" "려"
##
## [[6]]
## [1] "임" "신" "중" "코" "로" "나" "백" "신" "맞" "은" "엄" "마" "항" "체" "보"
## [16] "유" "아" "기" "출" "산"
##
## [[7]]
## [1] "이" "란" "도" "코" "로" "나" "백" "신" "공" "개" "암" "살" "된" "핵" "과"
## [16] "학" "자" "이" "름" "붙" "였" "다"
##
## [[8]]
## [1] "백" "신" "이" "상" "반" "응" "에" "도" "다" "시" "코" "로" "나" "최" "전"
## [16] "선" "으" "로"
##
## [[9]]
## [1] "접" "종" "후" "두" "통" "발" "열" "몸" "살" "코" "로" "나" "백" "신" "공"
## [16] "포" "증" "확" "산"
##
## [[10]]
## [1] "울" "산" "첫" "코" "로" "나" "백" "신" "접" "종" "센" "터" "동" "천" "체"
## [16] "육" "관" "개" "소"
“[가-힣]” 집합은 하나의 한글 문자와만 매칭됩니다.
str_extract_all(cv$HEADLINE[1:10], "[가-힣][가-힣]")
## [[1]]
## [1] "코로" "백신" "접종" "요양" "병원" "종사" "확진" "충북" "사례"
##
## [[2]]
## [1] "임신" "백신" "맞은" "엄마" "아기" "코로" "항체" "갖고" "태어" "났다"
##
## [[3]]
## [1] "코로" "백신" "독려" "광고" "빠졌" "트럼" "돌연" "백신" "맞으" "당부"
##
## [[4]]
## [1] "포항" "가속" "인류" "사상" "최고" "밝은" "구현" "코로" "백신" "개발"
## [11] "우선" "제공"
##
## [[5]]
## [1] "전문" "코로" "변이" "바이" "러스" "사라" "지지" "않아" "백신" "평생"
## [11] "맞아" "할지" "우려"
##
## [[6]]
## [1] "임신" "코로" "백신" "맞은" "엄마" "항체" "보유" "아기" "출산"
##
## [[7]]
## [1] "이란" "코로" "백신" "공개" "암살" "과학" "이름" "붙였"
##
## [[8]]
## [1] "백신" "이상" "반응" "에도" "다시" "코로" "최전" "선으"
##
## [[9]]
## [1] "접종" "두통" "발열" "몸살" "코로" "백신" "공포" "확산"
##
## [[10]]
## [1] "울산" "코로" "백신" "접종" "센터" "동천" "체육" "개소"
str_extract_all(cv$HEADLINE[1:10], "[가-힣][가-힣][가-힣]")
## [[1]]
## [1] "코로나" "요양병" "종사자"
##
## [[2]]
## [1] "임신중" "아기는" "코로나" "태어났"
##
## [[3]]
## [1] "코로나" "빠졌던" "트럼프" "맞으라"
##
## [[4]]
## [1] "포항가" "코로나"
##
## [[5]]
## [1] "전문가" "코로나" "바이러" "사라지" "맞아야" "할지도"
##
## [[6]]
## [1] "코로나"
##
## [[7]]
## [1] "이란도" "코로나" "암살된" "과학자" "붙였다"
##
## [[8]]
## [1] "이상반" "응에도" "코로나" "최전선"
##
## [[9]]
## [1] "코로나" "백신공"
##
## [[10]]
## [1] "코로나" "접종센" "동천체"
보다시피 헤드라인 벡터안에 각 요소를 구성하는 두글자 문자와 일치합니다. 문자 집합은 하나의 문자로만 기능합니다.
이렇게 문자 범위로 구성된 문자 집합을 이용하면 편리하게 텍스트 패턴을 매칭할 수 있습니다. 하지만, 위의 문자 범위로는 숫자나 구두점까지 포함하는 문자열을 매칭할 수는 없었네요.
정규 표현식으로 텍스트를 처리할 때, 특정 문자 집합에서 벗어나는 즉, 문자 집합의 일부가 아닌 문자를 찾아내야 하는 상황은 빈번하게 발생합니다. 가령, 우리는 한글 이외의 문자 즉, 알파벳 또는 한자로 표시된 문자를 매칭해서 지워줘야 할 때가 있습니다. 이 때 우리는 부정 문자 집합을 사용하여 우리가 원하는 문자 집합에 없는 문자를 찾아낼 수 있습니다. 이 부정 집합은 위해 메타 문자 캐럿 "^"
으로 구성할 수 있습니다.
캐럿 "^"
은 정규 표현식의 패턴에 하나 이상의 의미를 가지는 메타 문자 중 하나입니다. 그 중, 문자 집합 안의 첫번째 위치에 캐럿을 사용하면 : 예 : "[^가-힣]"
, 다음의 문자 이외의 문자 즉, 부정 기능을 수행합니다. 따라서 한글문자를 제외한 모든 문자를 매칭합니다.
이렇게 부정 문자 범위를 사용하면 우리는 다음과 같은 "[^가-힣0-9]"
패턴을 정의함으로써 한글이나 숫자가 아닌 다른 문자들을 매칭할 수 있습니다.
cv$HEADLINE[1:10]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
## [4] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
## [5] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
## [6] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], "[^가-힣0-9]") # 문자 및 숫자 이외 매칭되는 모든 문자
## [[1]]
## [1] " " " " " " " " " " "‘" "’" " " " " " "
##
## [[2]]
## [1] " " " " " " " " " " " " " " " "
##
## [[3]]
## [1] " " " " " " " " " " "," " " " " "“" " " "”" " "
##
## [[4]]
## [1] "\u784f" "," " " " " " " " " " " " "
## [9] " " "\"" " " " " " " " " "\""
##
## [[5]]
## [1] "\u82f1" " " " " "\"" " " " " " " " "
## [9] " " " " " " " " "\"" " "
##
## [[6]]
## [1] " " " " " " " " " " "," " " "‘" " " "’" " " " "
##
## [[7]]
## [1] " " " " " " " " " " " " " " " "
##
## [[8]]
## [1] " " " " " " " "
##
## [[9]]
## [1] " " " " " " " " " " " " " "
##
## [[10]]
## [1] " " " " " " " " " " " "
str_replace_all(cv$HEADLINE[1:10], "[^가-힣0-9]", " ")
## [1] "코로나 백신 접종 요양병원 종사자 확진 충북 첫 사례"
## [2] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
## [3] "코로나 백신 독려 광고 빠졌던 트럼프 돌연 백신 맞으라 당부"
## [4] "포항가속기 인류 사상 최고 밝은 빛 구현 코로나 백신 개발 우선 제공 "
## [5] " 전문가 코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도 우려"
## [6] "임신 중 코로나 백신 맞은 엄마 항체 보유 아기 출산"
## [7] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
## [8] "백신 이상반응에도 다시 코로나 최전선으로"
## [9] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
## [10] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_remove_all(cv$HEADLINE[1:10], "[^가-힣0-9]")
## [1] "코로나백신접종요양병원종사자확진충북첫사례"
## [2] "임신중백신맞은엄마아기는코로나항체갖고태어났다"
## [3] "코로나백신독려광고빠졌던트럼프돌연백신맞으라당부"
## [4] "포항가속기인류사상최고밝은빛구현코로나백신개발우선제공"
## [5] "전문가코로나변이바이러스사라지지않아백신평생맞아야할지도우려"
## [6] "임신중코로나백신맞은엄마항체보유아기출산"
## [7] "이란도코로나백신공개암살된핵과학자이름붙였다"
## [8] "백신이상반응에도다시코로나최전선으로"
## [9] "접종후두통발열몸살코로나백신공포증확산"
## [10] "울산첫코로나백신접종센터동천체육관개소"
캐럿은 문자 집합 안에 처음으로 오는 경우에만 부정을 의미하며, 그렇지 않으면 부정 문자 집합이 아닙니다. 가령,
str_extract_all(cv$HEADLINE[1:10], "[가-힣0-9^]")
## [[1]]
## [1] "코" "로" "나" "백" "신" "접" "종" "요" "양" "병" "원" "종" "사" "자" "확"
## [16] "진" "충" "북" "첫" "사" "례"
##
## [[2]]
## [1] "임" "신" "중" "백" "신" "맞" "은" "엄" "마" "아" "기" "는" "코" "로" "나"
## [16] "항" "체" "갖" "고" "태" "어" "났" "다"
##
## [[3]]
## [1] "코" "로" "나" "백" "신" "독" "려" "광" "고" "빠" "졌" "던" "트" "럼" "프"
## [16] "돌" "연" "백" "신" "맞" "으" "라" "당" "부"
##
## [[4]]
## [1] "포" "항" "가" "속" "기" "인" "류" "사" "상" "최" "고" "밝" "은" "빛" "구"
## [16] "현" "코" "로" "나" "백" "신" "개" "발" "우" "선" "제" "공"
##
## [[5]]
## [1] "전" "문" "가" "코" "로" "나" "변" "이" "바" "이" "러" "스" "사" "라" "지"
## [16] "지" "않" "아" "백" "신" "평" "생" "맞" "아" "야" "할" "지" "도" "우" "려"
##
## [[6]]
## [1] "임" "신" "중" "코" "로" "나" "백" "신" "맞" "은" "엄" "마" "항" "체" "보"
## [16] "유" "아" "기" "출" "산"
##
## [[7]]
## [1] "이" "란" "도" "코" "로" "나" "백" "신" "공" "개" "암" "살" "된" "핵" "과"
## [16] "학" "자" "이" "름" "붙" "였" "다"
##
## [[8]]
## [1] "백" "신" "이" "상" "반" "응" "에" "도" "다" "시" "코" "로" "나" "최" "전"
## [16] "선" "으" "로"
##
## [[9]]
## [1] "접" "종" "후" "두" "통" "발" "열" "몸" "살" "코" "로" "나" "백" "신" "공"
## [16] "포" "증" "확" "산"
##
## [[10]]
## [1] "울" "산" "첫" "코" "로" "나" "백" "신" "접" "종" "센" "터" "동" "천" "체"
## [16] "육" "관" "개" "소"
이 경우, 패턴 "[가-힣0-9^]"
은 부정 집합 "[^가-힣0-9]"
과 완전히 다른 “한글문자 또는 숫자 또는 리터럴 캐럿 문자”를 의미합니다.
문자 범위 이외에도 문자 클래스는 특정 문자 집단을 매칭하는데 유용한 정규 표현 구조를 제공합니다. 그리고 문자 클래스의 구성은 이중 백슬래시와 이니셜 문자로 시작합니다. 대부분의 정규 표현식 엔진에서 사용되는 가장 일반적인 문자 클래스는 다음과 같습니다.
문자 | 일치 | 같은 표현 |
---|---|---|
\\d |
임의의 숫자 | [0-9] |
\\D |
임의의 숫자 이외의 문자 | [^0-9] |
\\w |
밑줄 문자 "_"를 포함하여 단어의 일부로 간주되는 문자 | [a-zA-Z0-9_] |
\\W |
단어의 일부로 간주되지 않는 문자 | [^a-zA-Z0-9_] |
\\s |
공백 문자 | [\f\n\r\t\v] |
\\S |
비공백 문자 | [^\f\n\r\t\v] |
문자 클래스는 문자 집합을 쉽게 매치하는 메타 문자로 사용할 수 있습니다.
str_extract_all(cv$HEADLINE[1:10], "\\d{2}") # 2개의 임의의 숫자 연결된 패턴
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## character(0)
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)
str_extract_all(cv$HEADLINE[1:10], "\\D+") # 1개 이상 연속된 비 숫자 패턴
## [[1]]
## [1] "코로나 백신 접종 요양병원 종사자 ‘확진’ 충북 첫 사례"
##
## [[2]]
## [1] "임신중 백신 맞은 엄마 아기는 코로나 항체 갖고 태어났다"
##
## [[3]]
## [1] "코로나 백신 독려 광고 빠졌던 트럼프, 돌연 “백신 맞으라” 당부"
##
## [[4]]
## [1] "포항가속기\u784f, 인류 사상 최고 밝은 빛 구현 \"코로나 백신 개발 우선 제공\""
##
## [[5]]
## [1] "\u82f1 전문가 \"코로나 변이 바이러스 사라지지 않아 백신 평생 맞아야 할지도\" 우려"
##
## [[6]]
## [1] "임신 중 코로나 백신 맞은 엄마, ‘항체 보유’ 아기 출산"
##
## [[7]]
## [1] "이란도 코로나 백신 공개 암살된 핵 과학자 이름 붙였다"
##
## [[8]]
## [1] "백신 이상반응에도 다시 코로나 최전선으로"
##
## [[9]]
## [1] "접종 후 두통 발열 몸살 코로나 백신공포증 확산"
##
## [[10]]
## [1] "울산 첫 코로나 백신 접종센터 동천체육관 개소"
str_extract_all(cv$HEADLINE[1:10], "\\w+") # 1개 이상 연속된 문자/숫자
## [[1]]
## [1] "코로나" "백신" "접종" "요양병원" "종사자" "확진" "충북"
## [8] "첫" "사례"
##
## [[2]]
## [1] "임신중" "백신" "맞은" "엄마" "아기는" "코로나" "항체"
## [8] "갖고" "태어났다"
##
## [[3]]
## [1] "코로나" "백신" "독려" "광고" "빠졌던" "트럼프" "돌연" "백신"
## [9] "맞으라" "당부"
##
## [[4]]
## [1] "포항가속기\u784f" "인류" "사상" "최고"
## [5] "밝은" "빛" "구현" "코로나"
## [9] "백신" "개발" "우선" "제공"
##
## [[5]]
## [1] "\u82f1" "전문가" "코로나" "변이" "바이러스" "사라지지"
## [7] "않아" "백신" "평생" "맞아야" "할지도" "우려"
##
## [[6]]
## [1] "임신" "중" "코로나" "백신" "맞은" "엄마" "항체" "보유"
## [9] "아기" "출산"
##
## [[7]]
## [1] "이란도" "코로나" "백신" "공개" "암살된" "핵" "과학자" "이름"
## [9] "붙였다"
##
## [[8]]
## [1] "백신" "이상반응에도" "다시" "코로나" "최전선으로"
##
## [[9]]
## [1] "접종" "후" "두통" "발열" "몸살"
## [6] "코로나" "백신공포증" "확산"
##
## [[10]]
## [1] "울산" "첫" "코로나" "백신" "접종센터"
## [6] "동천체육관" "개소"
str_extract_all(cv$HEADLINE[1:10], "\\W+") # 1개 이상 연속된 비문자/숫자
## [[1]]
## [1] " " " " " " " " " ‘" "’ " " " " "
##
## [[2]]
## [1] " " " " " " " " " " " " " " " "
##
## [[3]]
## [1] " " " " " " " " " " ", " " “" " " "” "
##
## [[4]]
## [1] ", " " " " " " " " " " " " \"" " " " " " " " " "\""
##
## [[5]]
## [1] " " " \"" " " " " " " " " " " " " " " " " "\" "
##
## [[6]]
## [1] " " " " " " " " " " ", ‘" " " "’ " " "
##
## [[7]]
## [1] " " " " " " " " " " " " " " " "
##
## [[8]]
## [1] " " " " " " " "
##
## [[9]]
## [1] " " " " " " " " " " " " " "
##
## [[10]]
## [1] " " " " " " " " " " " "
str_extract_all(cv$HEADLINE[1:10], "\\s+") # 1개 이상 연속된 공백
## [[1]]
## [1] " " " " " " " " " " " " " " " "
##
## [[2]]
## [1] " " " " " " " " " " " " " " " "
##
## [[3]]
## [1] " " " " " " " " " " " " " " " " " "
##
## [[4]]
## [1] " " " " " " " " " " " " " " " " " " " " " "
##
## [[5]]
## [1] " " " " " " " " " " " " " " " " " " " " " "
##
## [[6]]
## [1] " " " " " " " " " " " " " " " " " "
##
## [[7]]
## [1] " " " " " " " " " " " " " " " "
##
## [[8]]
## [1] " " " " " " " "
##
## [[9]]
## [1] " " " " " " " " " " " " " "
##
## [[10]]
## [1] " " " " " " " " " " " "
str_extract_all(cv$HEADLINE[1:10], "\\S+") # 1개 이상 연속된 비공백 문자
## [[1]]
## [1] "코로나" "백신" "접종" "요양병원" "종사자" "‘확진’" "충북"
## [8] "첫" "사례"
##
## [[2]]
## [1] "임신중" "백신" "맞은" "엄마" "아기는" "코로나" "항체"
## [8] "갖고" "태어났다"
##
## [[3]]
## [1] "코로나" "백신" "독려" "광고" "빠졌던" "트럼프,"
## [7] "돌연" "“백신" "맞으라”" "당부"
##
## [[4]]
## [1] "포항가속기\u784f," "인류" "사상"
## [4] "최고" "밝은" "빛"
## [7] "구현" "\"코로나" "백신"
## [10] "개발" "우선" "제공\""
##
## [[5]]
## [1] "\u82f1" "전문가" "\"코로나" "변이" "바이러스" "사라지지"
## [7] "않아" "백신" "평생" "맞아야" "할지도\"" "우려"
##
## [[6]]
## [1] "임신" "중" "코로나" "백신" "맞은" "엄마," "‘항체" "보유’"
## [9] "아기" "출산"
##
## [[7]]
## [1] "이란도" "코로나" "백신" "공개" "암살된" "핵" "과학자" "이름"
## [9] "붙였다"
##
## [[8]]
## [1] "백신" "이상반응에도" "다시" "코로나" "최전선으로"
##
## [[9]]
## [1] "접종" "후" "두통" "발열" "몸살"
## [6] "코로나" "백신공포증" "확산"
##
## [[10]]
## [1] "울산" "첫" "코로나" "백신" "접종센터"
## [6] "동천체육관" "개소"
텍스트 사전처리를 하다 보면 텍스트 공백이 다양한 방식의 문자 표현으로 구성되어 있다는 것을 발견하게 될 것입니다. 다음은 공백을 나타내는 대표적 문자를 보여주는 표입니다. :
문자 | 정의 |
---|---|
\n |
줄바꿈 |
\r |
캐리지 리턴 |
\t |
탭 |
때로는 텍스트에 인쇄되지 않는 공백 문자가 포함됩니다. (\t
, \n
, \r\n
) 그렇기 때문에 모든 공백 문자 유형을 일치시키기 위해 공백 문자 클래스 \\s
를 사용해야합니다.
Mac OS는 \n
을 사용하는 반면에, Window는 \r\n
을 줄 끝 표시로 사용하는 운영체제입니다.
정규 표현식을 구성 방법을 마무리하기 위해 POSIX로 알려진 또 다른 유형의 문자 클래스를 소개합니다. 다음은 R에서 정규표현식 엔진이 지원하는 POSIX 문자 클래스 구조입니다. :
문자 | 일치 | 같은 구조 |
---|---|---|
[[:alnum:]] |
문자숫자 | [가-힣a-zA-Z0-9] |
[[:alpha:]] |
문자 | [가-힣a-zA-Z] |
[[:digit:]] |
숫자 | [0-9] |
[[:lower:]] |
영어 소문자 | [a-z] |
[[:upper:]] |
영어 대문자 | [A-Z] |
[[:word:]] |
단어 (문자, 숫자, 언더스코어) | [ 가-힣a-zA-Z0-9_] |
[[:blank:]] |
공백과 탭 | [ \t] |
[[:space:]] |
모든 공백 문자(줄 바꿈 포함) | [ \f\n\r\t\v] |
[[:punct:]] |
구두점과 기호 | |
[[:graph:]] |
공백을 제외한 모든 인쇄 가능한 문자 | [:alnum:][:punct:] |
[[:print:]] |
인쇄 가능한 모든 문자 | [:alnum:][:punct:][:space:] |
[[:ascii:]] |
모든 ASCII 문자 (알파벳) |
POSIX 문자 클래스는 여는 대괄호 [
, 뒤에 콜론 :
, 키워드 뒤에 이어 콜론 :
, 닫는 대괄호 ]
로 구성됩니다.
R에서 사용하려면 문자 집합 안에 POSIX 클래스를 래핑해야 합니다. 즉, POSIX 클래스를 다른 쌍의 대괄호로 묶어야합니다. POSIX 클래스를 사용하여 triplets
라는 문자 벡터의 요소를 매치시켜 봅시다.
str_extract_all(cv$HEADLINE[1:10], "[^[:ascii:]]+")
## [[1]]
## [1] "코로나" "백신" "접종" "요양병원" "종사자" "‘확진’" "충북"
## [8] "첫" "사례"
##
## [[2]]
## [1] "임신중" "백신" "맞은" "엄마" "아기는" "코로나" "항체"
## [8] "갖고" "태어났다"
##
## [[3]]
## [1] "코로나" "백신" "독려" "광고" "빠졌던" "트럼프"
## [7] "돌연" "“백신" "맞으라”" "당부"
##
## [[4]]
## [1] "포항가속기\u784f" "인류" "사상" "최고"
## [5] "밝은" "빛" "구현" "코로나"
## [9] "백신" "개발" "우선" "제공"
##
## [[5]]
## [1] "\u82f1" "전문가" "코로나" "변이" "바이러스" "사라지지"
## [7] "않아" "백신" "평생" "맞아야" "할지도" "우려"
##
## [[6]]
## [1] "임신" "중" "코로나" "백신" "맞은" "엄마" "‘항체" "보유’"
## [9] "아기" "출산"
##
## [[7]]
## [1] "이란도" "코로나" "백신" "공개" "암살된" "핵" "과학자" "이름"
## [9] "붙였다"
##
## [[8]]
## [1] "백신" "이상반응에도" "다시" "코로나" "최전선으로"
##
## [[9]]
## [1] "접종" "후" "두통" "발열" "몸살"
## [6] "코로나" "백신공포증" "확산"
##
## [[10]]
## [1] "울산" "첫" "코로나" "백신" "접종센터"
## [6] "동천체육관" "개소"
str_extract_all(cv$HEADLINE[1:10], "[[:lower:]]+") # 1개 이상의 연속된 문자
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## character(0)
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)
str_extract_all(cv$HEADLINE[1:10], "[[:alpha:]]+")
## [[1]]
## [1] "코로나" "백신" "접종" "요양병원" "종사자" "확진" "충북"
## [8] "첫" "사례"
##
## [[2]]
## [1] "임신중" "백신" "맞은" "엄마" "아기는" "코로나" "항체"
## [8] "갖고" "태어났다"
##
## [[3]]
## [1] "코로나" "백신" "독려" "광고" "빠졌던" "트럼프" "돌연" "백신"
## [9] "맞으라" "당부"
##
## [[4]]
## [1] "포항가속기\u784f" "인류" "사상" "최고"
## [5] "밝은" "빛" "구현" "코로나"
## [9] "백신" "개발" "우선" "제공"
##
## [[5]]
## [1] "\u82f1" "전문가" "코로나" "변이" "바이러스" "사라지지"
## [7] "않아" "백신" "평생" "맞아야" "할지도" "우려"
##
## [[6]]
## [1] "임신" "중" "코로나" "백신" "맞은" "엄마" "항체" "보유"
## [9] "아기" "출산"
##
## [[7]]
## [1] "이란도" "코로나" "백신" "공개" "암살된" "핵" "과학자" "이름"
## [9] "붙였다"
##
## [[8]]
## [1] "백신" "이상반응에도" "다시" "코로나" "최전선으로"
##
## [[9]]
## [1] "접종" "후" "두통" "발열" "몸살"
## [6] "코로나" "백신공포증" "확산"
##
## [[10]]
## [1] "울산" "첫" "코로나" "백신" "접종센터"
## [6] "동천체육관" "개소"
str_extract_all(cv$HEADLINE[1:10], "[[:digit:]]{1,3}") # 1개 이상 3개 이하로 연속된 숫자
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## character(0)
##
## [[4]]
## character(0)
##
## [[5]]
## character(0)
##
## [[6]]
## character(0)
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)
str_extract_all(cv$HEADLINE[1:10], "[[:punct:]~^]+") # [:punct:] 리터럴 문자 캐럿 "^" "~"을 매칭하지 않습니다.
## [[1]]
## [1] "‘" "’"
##
## [[2]]
## character(0)
##
## [[3]]
## [1] "," "“" "”"
##
## [[4]]
## [1] "," "\"" "\""
##
## [[5]]
## [1] "\"" "\""
##
## [[6]]
## [1] "," "‘" "’"
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)
str_extract_all(cv$HEADLINE[1:10], "[[:lower:][:punct:]]") # 모든 단일 소문자/구두점
## [[1]]
## [1] "‘" "’"
##
## [[2]]
## character(0)
##
## [[3]]
## [1] "," "“" "”"
##
## [[4]]
## [1] "," "\"" "\""
##
## [[5]]
## [1] "\"" "\""
##
## [[6]]
## [1] "," "‘" "’"
##
## [[7]]
## character(0)
##
## [[8]]
## character(0)
##
## [[9]]
## character(0)
##
## [[10]]
## character(0)