대단위의 텍스트를 컴퓨터로 분석하기 위한 SW는 많이 있지만, 그중에서 R은 “데이터과학”의 영역에서 애용되고 있는 프로그래밍 환경이다. 그 이유는 R이 무료이면서 오픈소스라는 장점과 함께 통계분석을 위해 고안된 SW로서 데이터과학 응용에 적합하기 때문이다. 특히, 오픈소스 프로그래밍 환경을 제공하기 때문에 다양한 목적에 따라 다양한 기능을 수행하는 확장 SW 라이브러리들이 패키지 형태로 모인다는 점은 R의 큰 장점 중 하나이다. 예를 들어, 대표적 패키지 저장소인 “Comprehensive R Archive Network (CRAN)”에는 절차적 적합성과 호환성 검토를 통과한 10,000개 이상의 패키지들이 집적되어 있고, 각각의 패키지는 사용 편의와 유용성을 위해 지속적인 관리를 받는다. 이러한 패키지는 매우 간단하게 R에 설치 후 사용가능하기 때문에 협업 프로젝트에도 적합하다. 특히, R에는 기초적인 문자열 조작부터 감정분석, 토픽모델링까지 다양한 텍스트 분석용 패키지가 50개가 넘게 있다. 또한 rOpenSci는 R 사용자들의 공간으로서 텍스트 분석에 관심있는 연구자과 개발자의 모임이 결성되어 있기 때문에 협력과 도움이 필요할 때도 유용하다. 결국, R을 활용하여 텍스트를 분석하는 것은 사회과학의 영역에서 심도있고 다양한 주제의 연구를 위해 컴퓨터 텍스트 분석을 수행하기 위한 효과적인 수단이다. 이러한 R을 보다 편리하게 이용하기 위해 사용자 친화적 인터페이스인 RStudio 사용을 추천한다.
출처: Welbers, Attenveldt, Benoit, 2017
위 과정에 따르면 각 문서의 디지털 텍스트를 정리해야 할 필요가 있는데, 예를 들어 문자열에 등장하는 불필요한 공란과 구두점 등을 제거해줌으로써 텍스트를 균일한 의미 단위로 분석할 수 있는 준비 과정이 필요하다. 이를 텍스트 전처리 과정이라 한다.
토큰화 과정은 텍스트를 분석의 어휘 등의 기본 단위로 쪼개는 것을 의미한다. 한국어의 경우 형태소 분석 및 품사 태깅 작업이 요구된다. http://konlpy.org/ko/v0.4.4/morph/
토큰화를 거친 텍스트 데이터는 정제와 숫자 변환 및 가중치 부여, 정보 추출 등의 자연어 처리를 거쳐 분류와 유목화, 예측을 위한 알고리즘에 적용한다.
분석 결과를 해석한다.
JAVA jdk 설치 https://www.oracle.com/java/technologies/javase-jdk14-downloads.html
Mecab 태거 설치 "RcppMeCab는 mecab-ko (은전한닢 프로젝트)를 기반으로 한국어 문장 형태소 분석, 그리고 한국어 텍스트의 분석을 진행할 때 필요한 다른 패키지의 도움 함수를 제공하는 것을 목적으로 합니다.
은전한닢 프로젝트가 기반으로 하고 있는 mecab은 일본어 형태소 분석기로, 띄어쓰기와 관계없이 형태소를 분석합니다. 인터넷에서 수집한 텍스트는 띄어쓰기에 오류가 있는 경우가 많아, 텍스트 분석을 진행할 때 은전한닢 프로젝트의 mecab-ko를 통해 진행하는 것이 유용할 수 있습니다." by 김준혁 https://www.rdocumentation.org/packages/RcppMeCab/versions/0.0.1.2
#install.packages("RmecabKo")
library(RmecabKo)
#RmecabKo::install_mecab("C:/mecab")
#install.packages("RcppMeCab")
library(RcppMeCab)
##
## Attaching package: 'RcppMeCab'
## The following object is masked from 'package:RmecabKo':
##
## pos
?pos
## starting httpd help server ...
## done
pos(iconv("한국어 텍스트를 컴퓨터로 분석해 봅시다", to="utf8"))
## $`한국어 텍스트를 컴퓨터로 분석해 봅시다`
## [1] "한국어/NNG" "텍스트/NNG" "를/JKO" "컴퓨터/NNG" "로/JKB"
## [6] "분석/NNG" "해/XSV+EC" "봅시다/VX+EC"
RcppMeCab::pos(iconv("한국어 텍스트를 컴퓨터로 분석해 봅시다", to="utf8"))
## $`한국어 텍스트를 컴퓨터로 분석해 봅시다`
## [1] "한국어/NNG" "텍스트/NNG" "를/JKO" "컴퓨터/NNG" "로/JKB"
## [6] "분석/NNG" "해/XSV+EC" "봅시다/VX+EC"
수집 한 트윗 텍스트를 분석을 위한 데이터 프레임으로 불러온다.
load("covid_frames_406.RData")
dim(covid_frames_406)
## [1] 818525 90
데이터 정제를 위한 tidyverse 패키지 불러오기
지금부터 tibble이라는 데이터 프레임의 형식으로 이루어진 트윗 데이터를 텍스트 분석을 위한 전처리 방식에 대해서 알아보도록 하겠습니다. 이를 위해 필요한 함수를 제공하는 tidyverse 패키지에 대해서 살펴보도록 하겠습니다.
우선, tidyverse패키지의 함수들을 이용해서 트위터 데이터를 처리하는 방법을 알아보도록 하겠습니다. 우선, tidyverse 패키지를 R세션에 설치해 봅시다.
#install.packages(tidyverse")
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.2.1 √ purrr 0.3.3
## √ tibble 2.1.3 √ dplyr 0.8.5
## √ tidyr 1.0.2 √ stringr 1.4.0
## √ readr 1.3.1 √ forcats 0.5.0
## -- Conflicts ---------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
첫번째로 살펴 볼 dplyr 패키지의 함수는 select()
입니다. 이 함수는 데이터의 변수를 선택해서 해당 변수만 남기고 나머지 변수들은 제거하는 기능을 합니다. 예를 들어서, 우리의 트윗 데이터 객체인 covid_frames_406
은 90개의 변수로 구성이 되어있죠. 앞서 말했듯, 이 변수들은 우리가 모은 트윗들의 성격을 규정하는 역할을 합니다. 예를 들어서, 첫번째 변수의 이름을 user_id
이고 이 변수에는 각 트윗의 사용자 아이디가 문자 벡터 형태로 포함되어 있습니다.
# 데이터의 변수 선택은: 데이터 객체 이름에 Dollar 사인 후 변수 이름 입력
class(covid_frames_406$user_id) # 문자 벡터
## [1] "character"
covid_frames_406$user_id[1:10] # 첫번째 트윗부터 열번째 트윗의 사용자 아이디 인덱싱
## [1] "3595470853" "3595470853" "3595470853"
## [4] "1229426030592626689" "868634564121337856" "868634564121337856"
## [7] "1241440846718750721" "259483449" "259483449"
## [10] "374247499"
covid_frames 데이터는 90개의 변수로 구성되어 있고, 여기에서 우리가 필요한 변수 중 하나는 text
입니다. 이 변수에는 각 트윗의 내용, 즉 우리가 분석할 어휘들로 구성된 트윗 메세지가 문자열 벡터 형태로 포함되어 있습니다. 또, 트윗 유저의 아이디인 “user_id”, 각 트윗을 구별할 때 필요한 Twitter status 아이디 status_id
그리고 포스팅 시간을 알려주는 created_at
, 트윗의 좋아요 횟수 favorite_count
및 리트윗 횟수 ’retweet_count, 각 트윗이 어떤 언어로 구성되어 있는지 보여주는
lang` 등이 우리가 필요한 트윗 정보들이라 할 수 있겠네요.
이 변수들만 남기고 나머지 변수들을 제거하기 위해서 필요한 함수가 바로 select()
입니다.
select()
: 데이터의 변수(들)을 선택 및 처리class(covid_frames_406$text) #문자(열) 벡터
## [1] "character"
covid_frames_406$text[1:10] # 첫번째 트윗부터 열번째 트윗의 문자열 내용 인덱싱
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
## [2] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
## [3] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/Z5IbVPCwuU"
## [4] "장기전이 될 격리생활을 위해 아마존에서 사이클을 주문했다. 거리를 다닐 때마다 아시아인이라 긴장하게 되는 것도 싫고, 학교 체육관도 언제 열지 모르니. 모든 셀프케어 방법을 풀파워로 가동한다. #유학생격리일기 #코로나바이러스 #코로나19"
## [5] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/rAyNwfUVYP"
## [6] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/9dETskSkgE"
## [7] "코로나때문에 너랑 데이트도 못하네\n\n#코로나 #싫어 #섹트"
## [8] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/A1zQkWlvlM"
## [9] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/Z7vAJrT1Fh"
## [10] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/Iczq8E2hJ0"
covid_frames_406 %>% select(user_id, status_id, created_at, text, favorite_count, retweet_count, lang) # 데이터 처리 과정을 연쇄적으로 이어주는 파이프(pipe) 연산자; covid_frames_406에서 다음의 변수들만 남기고 나머지는 제거
## # A tibble: 818,525 x 7
## user_id status_id created_at text favorite_count retweet_count
## <chr> <chr> <dttm> <chr> <int> <int>
## 1 359547~ 12414398~ 2020-03-21 19:01:40 "우한 ~ 0 0
## 2 359547~ 12414398~ 2020-03-21 19:01:40 "우한 ~ 0 0
## 3 359547~ 12414403~ 2020-03-21 19:03:34 "우한 ~ 0 0
## 4 122942~ 12414425~ 2020-03-21 19:12:12 "장기전~ 1 0
## 5 868634~ 12414430~ 2020-03-21 19:14:29 "우한 ~ 0 0
## 6 868634~ 12414432~ 2020-03-21 19:15:00 "우한 ~ 0 0
## 7 124144~ 12414459~ 2020-03-21 19:25:58 "코로나~ 0 0
## 8 259483~ 12414542~ 2020-03-21 19:58:43 "우한 ~ 0 0
## 9 259483~ 12414553~ 2020-03-21 20:03:06 "우한 ~ 0 0
## 10 374247~ 12414595~ 2020-03-21 20:19:54 "우한 ~ 0 0
## # ... with 818,515 more rows, and 1 more variable: lang <chr>
covid_frames <- covid_frames_406 %>% select(user_id, status_id, created_at, text, favorite_count, retweet_count, lang) # 위 처리 과정을 거친 데이터를 covid19_text라는 새로운 객체에 할당
dim(covid_frames) # 새로운 데이터 프레임 구조 확인
## [1] 818525 7
filter()
: 데이터의 트윗(observation)을 선택 및 처리트윗 데이터를 처리하는데 있어, 특정 관측치를 선택할 필요 filter()
함수는 입력된 조건에 부합하는 행들만 남기고 나머지는 지워주는 역할을 합니다. 가령, 어떤 트윗의 텍스트에 특정 단어가 포함되어 있는지 여부에 따라 해당 트윗만 출력하기 위해 필요한 함수는: str_detect()
- 해당 벡터의 값 중 원하는 문자열이 포함되어 있는지 아닌지 판별하는 기능
covid_frames %>% filter(str_detect(text, "코로나")) %>% dim()
## [1] 812093 7
covid_frames %>% filter(str_detect(text, "우한|중국")) %>% dim()
## [1] 26698 7
만약 해당 문자열을 포함하지 않는 트윗을 추출하기 위해 필요한 연산자는: !
! 는 논리 연산에서 부정의 뜻을 의미: ~~이 아니다.
covid_frames %>% filter(!str_detect(text, regex("코로나|우한|중국", ignore_case = T)))
## # A tibble: 2 x 7
## user_id status_id created_at text favorite_count retweet_count lang
## <chr> <chr> <dttm> <chr> <int> <int> <chr>
## 1 475522~ 12458705~ 2020-04-03 00:27:29 존나스트~ 0 0 ko
## 2 475522~ 12458705~ 2020-04-03 00:27:29 존나스트~ 0 0 ko
text 변수에 문자열 벡터로 담겨있는 텍스트 내용이 “코로나”, “우한” 또는 “중국” 문자열 포함하는 조건에 해당하는 행만 남기고 나머지는 제거
dim(covid_frames)
## [1] 818525 7
covid_frames %>% filter(lang=="ko") %>% dim()
## [1] 812388 7
covid_frames %>% filter(!duplicated(text)) %>% dim()
## [1] 304754 7
covid_frames_unique <- covid_frames %>% filter(lang=="ko") %>% filter(!duplicated(text))
dim(covid_frames_unique)
## [1] 302628 7
covid_frames_unique$text[1:10]
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
## [2] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/Z5IbVPCwuU"
## [3] "장기전이 될 격리생활을 위해 아마존에서 사이클을 주문했다. 거리를 다닐 때마다 아시아인이라 긴장하게 되는 것도 싫고, 학교 체육관도 언제 열지 모르니. 모든 셀프케어 방법을 풀파워로 가동한다. #유학생격리일기 #코로나바이러스 #코로나19"
## [4] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/rAyNwfUVYP"
## [5] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/9dETskSkgE"
## [6] "코로나때문에 너랑 데이트도 못하네\n\n#코로나 #싫어 #섹트"
## [7] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/A1zQkWlvlM"
## [8] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/Z7vAJrT1Fh"
## [9] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/Iczq8E2hJ0"
## [10] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/sbaXGEfZve"
mutate()
: 기존 변수를 이용하여 생성한 새로운 변수를 데이터 열에 추가names(covid_frames_unique)
## [1] "user_id" "status_id" "created_at" "text"
## [5] "favorite_count" "retweet_count" "lang"
library(lubridate) # 날짜 정보를 다루기 위한 함수를 제공
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
covid_frames_unique$created_at[1:10]
## [1] "2020-03-21 19:01:40 UTC" "2020-03-21 19:03:34 UTC"
## [3] "2020-03-21 19:12:12 UTC" "2020-03-21 19:14:29 UTC"
## [5] "2020-03-21 19:15:00 UTC" "2020-03-21 19:25:58 UTC"
## [7] "2020-03-21 19:58:43 UTC" "2020-03-21 20:03:06 UTC"
## [9] "2020-03-21 20:19:54 UTC" "2020-03-21 20:20:58 UTC"
covid_frames_unique %>% mutate(date = floor_date(created_at, "day")) #floor_date 함수의 기능은?
## # A tibble: 302,628 x 8
## user_id status_id created_at text favorite_count retweet_count
## <chr> <chr> <dttm> <chr> <int> <int>
## 1 359547~ 12414398~ 2020-03-21 19:01:40 "우한 ~ 0 0
## 2 359547~ 12414403~ 2020-03-21 19:03:34 "우한 ~ 0 0
## 3 122942~ 12414425~ 2020-03-21 19:12:12 "장기전~ 1 0
## 4 868634~ 12414430~ 2020-03-21 19:14:29 "우한 ~ 0 0
## 5 868634~ 12414432~ 2020-03-21 19:15:00 "우한 ~ 0 0
## 6 124144~ 12414459~ 2020-03-21 19:25:58 "코로나~ 0 0
## 7 259483~ 12414542~ 2020-03-21 19:58:43 "우한 ~ 0 0
## 8 259483~ 12414553~ 2020-03-21 20:03:06 "우한 ~ 0 0
## 9 374247~ 12414595~ 2020-03-21 20:19:54 "우한 ~ 0 0
## 10 374247~ 12414598~ 2020-03-21 20:20:58 "우한 ~ 0 0
## # ... with 302,618 more rows, and 2 more variables: lang <chr>, date <dttm>
covid_frames_date <- covid_frames_unique %>% mutate(date = floor_date(created_at, "day"))
library(ggplot2) #시각화 예시
covid_frames_date %>%
count(date) %>%
ggplot(aes(x=date, y=n)) +
geom_col()
select()
와 filter()
, mutate()
등 dplyr
패키지의 함수를 이용해서 데이터 처리하는 과정을 살펴봄.
*보편적 고려사항: Basic-level 1) 빈칸 (white space) 2) 구두점 (punctuation) 3) 숫자 (digit numbers) 4) 한국어 (UTF-8) 이외의 문자 (e.g., ASCII code)
# 1) space
covid_frames_date$text[1]
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
str_squish(covid_frames_date$text[1])
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다 도매 대량구입 원하시면 문의바랍니다~최저가문의! 구매까똑:m13588 #코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
# 2) punctuation
str_replace_all(covid_frames_date$text[1], "[[:punct:]]+", " ")
## [1] "우한 페렴 황사 마스크 KF94 정품 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의 \n구매까똑 m13588\n 코로나18아니19 우한코로나 에티카마스크 코로나때문에 코로나엔라임 https t co xzmfsjPswB"
str_replace_all(covid_frames_date$text[1], "[^[:word:]#@]+", " ")
## [1] "우한 페렴 황사 마스크 KF94 정품 대량 판매합니다 도매 대량구입 원하시면 문의바랍니다 최저가문의 구매까똑 m13588 #코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https t co xzmfsjPswB"
# 3) number
str_view_all(covid_frames_date$text[1], "\\d+")
str_view_all(covid_frames_date$text[1], "\\d+(st|nd|rd|th)?") # ordinal number
# 4) 한국어 이외의 문자? 알파벳?
covid_frames_date$text[1]
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
str_view_all(covid_frames_date$text[1], "[[:ascii:]]+")
covid_frames_date$text[1]
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB"
RcppMeCab::pos(covid_frames_date$text[1])
## $`우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/xzmfsjPswB`
## [1] "우한/NNG" "페렴/UNKNOWN" "황사/NNG" "마스크/NNG"
## [5] "KF/SL" "94/SN" "(/SSO" "정품/NNG"
## [9] ")/SSC" "대량/NNG" "판매/NNG" "합니다/XSV+EF"
## [13] "도매/NNG" "대량/NNG" "구입/NNG" "원/NNG"
## [17] "하/XSV" "시/EP" "면/EC" "문/NNG"
## [21] "의/JKG" "바랍니다/VV+EF" "~/SY" "최저/NNG"
## [25] "가/JKS" "문의/NNG" "!/SY" "구매/NNG"
## [29] "까/VCP+EC" "똑/MAG" ":/SC" "m/SL"
## [33] "13588/SN" "#/SY" "코로나/NNP" "18/SN"
## [37] "아니/VCN" "19/SN" "#/SY" "우한/NNG"
## [41] "코로나/NNG" "#/SY" "에티카/NNP" "마스크/NNG"
## [45] "#/SY" "코로나/NNG" "때문/NNB" "에/JKB"
## [49] "#/SY" "코로나/NNG" "엔/JKB+JX" "라임/NNG"
## [53] "https/SL" ":/SC" "//SC" "//SC"
## [57] "t/SL" "./SY" "co/SL" "//SC"
## [61] "xzmfsjPswB/SL"
covid_frames_date$text[28]
## [1] "#코로나19\n거짓뉴스나 괴담에 빠르게 반응하고, 온갖 걱정과 염려를 보면서, 요즘 대세라는 #트로트 반응까지\n\n많은 남이 관심있거나, 좋아한다고 언론이 광고를 대행해주면 나도 관심있거나, 좋아할꺼라고 생각하는 것 같다. \n\n유행과 다양이 같은 뜻으로 쓰이는 걸 보니 세상 다양한 건 분명하다."
library(stringr)
RcppMeCab::pos(str_squish(covid_frames_date$text[20:28]))
## $`대체 왜 이러는 걸까요;; https://t.co/xokmblq5mJ #코로나19 #석계 #침`
## [1] "대체/MAG" "왜/MAG" "이러/VV"
## [4] "는/ETM" "걸까요/NNB+VCP+EC" ";;/SY"
## [7] "https/SL" ":/SC" "//SC"
## [10] "//SC" "t/SL" "./SY"
## [13] "co/SL" "//SC" "xokmblq/SL"
## [16] "5/SN" "mJ/SL" "#/SY"
## [19] "코로나/NNP" "19/SN" "#/SY"
## [22] "석계/NNG" "#/SY" "침/NNG"
##
## $`우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다 도매 대량구입 원하시면 문의바랍니다~최저가문의! 구매까똑:m13588 #시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/LHMhke9xY7`
## [1] "우한/NNG" "페렴/UNKNOWN" "황사/NNG" "마스크/NNG"
## [5] "KF/SL" "94/SN" "(/SSO" "정품/NNG"
## [9] ")/SSC" "대량/NNG" "판매/NNG" "합니다/XSV+EF"
## [13] "도매/NNG" "대량/NNG" "구입/NNG" "원/NNG"
## [17] "하/XSV" "시/EP" "면/EC" "문/NNG"
## [21] "의/JKG" "바랍니다/VV+EF" "~/SY" "최저/NNG"
## [25] "가/JKS" "문의/NNG" "!/SY" "구매/NNG"
## [29] "까/VCP+EC" "똑/MAG" ":/SC" "m/SL"
## [33] "13588/SN" "#/SY" "시트/NNG" "마스크/NNG"
## [37] "#/SY" "코로나/NNG" "물리치/VV" "기/ETN"
## [41] "#/SY" "코로나/NNP" "야/JKV" "#/SY"
## [45] "코로나/NNP" "19/SN" "#/SY" "미세먼지/NNP"
## [49] "마스크/NNG" "kf/SL" "94/SN" "https/SL"
## [53] ":/SC" "//SC" "//SC" "t/SL"
## [57] "./SY" "co/SL" "//SC" "LHMhke/SL"
## [61] "9/SN" "xY/SL" "7/SN"
##
## $`우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다 도매 대량구입 원하시면 문의바랍니다~최저가문의! 구매까똑:m13588 #코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/TVwMABOuoG`
## [1] "우한/NNG" "페렴/UNKNOWN" "황사/NNG" "마스크/NNG"
## [5] "KF/SL" "94/SN" "(/SSO" "정품/NNG"
## [9] ")/SSC" "대량/NNG" "판매/NNG" "합니다/XSV+EF"
## [13] "도매/NNG" "대량/NNG" "구입/NNG" "원/NNG"
## [17] "하/XSV" "시/EP" "면/EC" "문/NNG"
## [21] "의/JKG" "바랍니다/VV+EF" "~/SY" "최저/NNG"
## [25] "가/JKS" "문의/NNG" "!/SY" "구매/NNG"
## [29] "까/VCP+EC" "똑/MAG" ":/SC" "m/SL"
## [33] "13588/SN" "#/SY" "코로나/NNP" "18/SN"
## [37] "아니/VCN" "19/SN" "#/SY" "우한/NNG"
## [41] "코로나/NNG" "#/SY" "에티카/NNP" "마스크/NNG"
## [45] "#/SY" "코로나/NNG" "때문/NNB" "에/JKB"
## [49] "#/SY" "코로나/NNG" "엔/JKB+JX" "라임/NNG"
## [53] "https/SL" ":/SC" "//SC" "//SC"
## [57] "t/SL" "./SY" "co/SL" "//SC"
## [61] "TVwMABOuoG/SL"
##
## $`#코로나19 확산의 주범인 신천지교회... 아마도 국가적으로 구성권을 청구하는것이 다방면으로 괜찮을듯 하네요!!! 신천지교를 뿌리 뽑을 수 있는 타이밍입니다. https://t.co/kDIy4MfCRT`
## [1] "#/SY" "코로나/NNP" "19/SN" "확산/NNG"
## [5] "의/JKG" "주범/NNG" "인/VCP+ETM" "신천지/NNG"
## [9] "교회/NNG" "./SF" "../SY" "아마도/MAG"
## [13] "국가/NNG" "적/XSN" "으로/JKB" "구성/NNG"
## [17] "권/XSN" "을/JKO" "청구/NNG" "하/XSV"
## [21] "는/ETM" "것/NNB" "이/JKS" "다방면/NNG"
## [25] "으로/JKB" "괜찮/VA" "을/ETM" "듯/NNB"
## [29] "하/VV" "네요/EF" "!/SF" "!!/SY"
## [33] "신천/NNP" "지교/NNG" "를/JKO" "뿌리/NNG"
## [37] "뽑/VV" "을/ETM" "수/NNB" "있/VV"
## [41] "는/ETM" "타이밍/NNG" "입니다/VCP+EF" "./SF"
## [45] "https/SL" ":/SC" "//SC" "//SC"
## [49] "t/SL" "./SY" "co/SL" "//SC"
## [53] "kDIy/SL" "4/SN" "MfCRT/SL"
##
## $`#코로나19 로 정부에서 국민지침서를 발표! 우리 모두 이 고비를 현명하게 행동하여 코로나19를 빨리 소멸해요! #사회적거리두기 https://t.co/aJPfhIwNoL`
## [1] "#/SY" "코로나/NNP" "19/SN" "로/NNG"
## [5] "정부/NNG" "에서/JKB" "국민/NNG" "지침서/NNG"
## [9] "를/JKO" "발표/NNG" "!/SF" "우리/NP"
## [13] "모두/MAG" "이/MM" "고비/NNG" "를/JKO"
## [17] "현명/NNG" "하/XSV" "게/EC" "행동/NNG"
## [21] "하/XSV" "여/EC" "코로나/NNG" "19/SN"
## [25] "를/JKO" "빨리/MAG" "소멸/NNG" "해요/XSV+EF"
## [29] "!/SF" "#/SY" "사회/NNG" "적/XSN"
## [33] "거리/NNG" "두기/NNG" "https/SL" ":/SC"
## [37] "//SC" "//SC" "t/SL" "./SY"
## [41] "co/SL" "//SC" "aJPfhIwNoL/SL"
##
## $...
## [1] "신천지/NNP" "예수/NNP" "교회/NNG" "는/JX" "담임/NNG"
## [6] "강사/NNG" "강사/NNG" "전도사/NNG" "를/JKO" "위한/VV+ETM"
## [11] "복지/NNG" "차원/NNG" "의/JKG" "기숙사/NNG" "는/JX"
## [16] "제공/NNG" "하/XSV" "고/EC" "있/VX" "으나/EC"
## [21] "성도/NNG" "들/XSN" "의/JKG" "집단/NNG" "합숙/NNG"
## [26] "시설/NNG" "은/JX" "운영/NNG" "하/XSV" "지/EC"
## [31] "않/VX" "습니다/EF" "성도/NNG" "들/XSN" "의/JKG"
## [36] "거주지/NNG" "는/JX" "개인/NNG" "자유/NNG" "에/JKB"
## [41] "의한/VV+ETM" "것/NNB" "이/VCP" "며/EC" "교회/NNG"
## [46] "는/JX" "간섭/NNG" "할/XSV+ETM" "수/NNB" "없/VA"
## [51] "습니다/EF" "https/SL" ":/SC" "//SC" "//SC"
## [56] "t/SL" "./SY" "co/SL" "//SC" "VCKxQ/SL"
## [61] "7/SN" "uuTI/SL" "#/SY" "신천지/NNP" "#/SY"
## [66] "예수/NNP" "교회/NNG" "#/SY" "코로나/NNP" "#/SY"
## [71] "예방/NNG" "#/SY" "진실/NNG" "https/SL" ":/SC"
## [76] "//SC" "//SC" "t/SL" "./SY" "co/SL"
## [81] "//SC" "dcG/SL" "6/SN" "zW/SL" "5/SN"
## [86] "jjM/SL"
##
## $`#코로나19 확산을 늦추기 위해 우리 모두에겐 각자의 역할이 있습니다. 지금 자신의 몫을 하고 계신가요? 서약에 참여하고 많은 목숨을 살립시다! #coronavirus https://t.co/nADLAXl0fD`
## [1] "#/SY" "코로나/NNP" "19/SN" "확산/NNG"
## [5] "을/JKO" "늦추/VV" "기/ETN" "위해/VV+EC"
## [9] "우리/NP" "모두/NNG" "에겐/JKB+JX" "각자/NNG"
## [13] "의/JKG" "역할/NNG" "이/JKS" "있/VA"
## [17] "습니다/EF" "./SF" "지금/MAG" "자신/NNG"
## [21] "의/JKG" "몫/NNG" "을/JKO" "하/VV"
## [25] "고/EC" "계신가요/VX+EF" "?/SF" "서약/NNG"
## [29] "에/JKB" "참여/NNG" "하/XSV" "고/EC"
## [33] "많/VA" "은/ETM" "목숨/NNG" "을/JKO"
## [37] "살립시다/VV+EC" "!/SY" "#/SY" "coronavirus/SL"
## [41] "https/SL" ":/SC" "//SC" "//SC"
## [45] "t/SL" "./SY" "co/SL" "//SC"
## [49] "nADLAXl/SL" "0/SN" "fD/SL"
##
## $`대한민국 국민이라면 제발! 앞으로 15일간 최대한 집에 머물러 주세요! 제발! #사회적거리두기 #코로나19 #이기자 https://t.co/UaSLUDmR2H`
## [1] "대한민국/NNP" "국민/NNG" "이/VCP" "라면/EC" "제발/MAG"
## [6] "!/SF" "앞/NNG" "으로/JKB" "15/SN" "일/NNBC"
## [11] "간/NNG" "최대한/NNG" "집/NNG" "에/JKB" "머물러/VV+EC"
## [16] "주/VX" "세요/EP+EF" "!/SF" "제발/MAG" "!/SF"
## [21] "#/SY" "사회/NNG" "적/XSN" "거리/NNG" "두기/NNG"
## [26] "#/SY" "코로나/NNP" "19/SN" "#/SY" "이기자/NNP"
## [31] "https/SL" ":/SC" "//SC" "//SC" "t/SL"
## [36] "./SY" "co/SL" "//SC" "UaSLUDmR/SL" "2/SN"
## [41] "H/SL"
##
## $...
## [1] "#/SY" "코로나/NNP" "19/SN"
## [4] "거짓/NNG" "뉴스/NNG" "나/JC"
## [7] "괴담/NNG" "에/JKB" "빠르/VA"
## [10] "게/EC" "반응/NNG" "하/XSV"
## [13] "고/EC" ",/SC" "온갖/MM"
## [16] "걱정/NNG" "과/JC" "염려/NNG"
## [19] "를/JKO" "보/VV" "면서/EC"
## [22] ",/SC" "요즘/MAG" "대세/NNG"
## [25] "라는/VCP+ETM" "#/SY" "트로트/NNG"
## [28] "반응/NNG" "까지/JX" "많/VA"
## [31] "은/ETM" "남/NNG" "이/JKS"
## [34] "관심/NNG" "있/VV" "거나/EC"
## [37] ",/SC" "좋/VA" "아/EC"
## [40] "한다고/VX+EC" "언론/NNG" "이/JKS"
## [43] "광고/NNG" "를/JKO" "대행/NNG"
## [46] "해/XSV+EC" "주/VX" "면/EC"
## [49] "나/NP" "도/JX" "관심/NNG"
## [52] "있/VV" "거나/EC" ",/SC"
## [55] "좋/VA" "아/EC" "할꺼/VV+ETM+NNB+VCP"
## [58] "라고/EC" "생각/NNG" "하/XSV"
## [61] "는/ETM" "것/NNB" "같/VA"
## [64] "다/EF" "./SF" "유행/NNG"
## [67] "과/JC" "다양/NNG" "이/JKS"
## [70] "같/VA" "은/ETM" "뜻/NNG"
## [73] "으로/JKB" "쓰이/VV" "는/ETM"
## [76] "걸/NNB+JKO" "보/VV" "니/EC"
## [79] "세상/NNG" "다양/NNG" "한/XSA+ETM"
## [82] "건/NNB+JX" "분명/MAG" "하/XSA"
## [85] "다/EF" "./SF"
RcppMeCab::pos(str_remove_all(str_squish(covid_frames_date$text[28]), "[^[:word:]#. ]"))
## $...
## [1] "#/SY" "코로나/NNP" "19/SN"
## [4] "거짓/NNG" "뉴스/NNG" "나/JC"
## [7] "괴담/NNG" "에/JKB" "빠르/VA"
## [10] "게/EC" "반응/NNG" "하/XSV"
## [13] "고/EC" "온갖/MM" "걱정/NNG"
## [16] "과/JC" "염려/NNG" "를/JKO"
## [19] "보/VV" "면서/EC" "요즘/NNG"
## [22] "대세/NNG" "라는/VCP+ETM" "#/SY"
## [25] "트로트/NNG" "반응/NNG" "까지/JX"
## [28] "많/VA" "은/ETM" "남/NNG"
## [31] "이/JKS" "관심/NNG" "있/VV"
## [34] "거나/EC" "좋/VA" "아/EC"
## [37] "한다고/VX+EC" "언론/NNG" "이/JKS"
## [40] "광고/NNG" "를/JKO" "대행/NNG"
## [43] "해/XSV+EC" "주/VX" "면/EC"
## [46] "나/NP" "도/JX" "관심/NNG"
## [49] "있/VV" "거나/EC" "좋/VA"
## [52] "아/EC" "할꺼/VV+ETM+NNB+VCP" "라고/EC"
## [55] "생각/NNG" "하/XSV" "는/ETM"
## [58] "것/NNB" "같/VA" "다/EF"
## [61] "./SF" "유행/NNG" "과/JC"
## [64] "다양/NNG" "이/JKS" "같/VA"
## [67] "은/ETM" "뜻/NNG" "으로/JKB"
## [70] "쓰이/VV" "는/ETM" "걸/NNB+JKO"
## [73] "보/VV" "니/EC" "세상/NNG"
## [76] "다양/NNG" "한/XSA+ETM" "건/NNB+JX"
## [79] "분명/MAG" "하/XSA" "다/EF"
## [82] "./SF"
*맥락 접근 고려사항: Context-level 1) 온라인 텍스트 (hashtag, handle, HTML) 2) URLs
# 1) 온라인 텍스트
covid_frames_date$text[37]
## [1] "<보령시 코로나19 현황 >\n2020. 3. 22. 09시 현재\n\n.\n<U+2611> 확진자 0명\n<U+2611> 의사환자검사중 0명\n<U+2611> 음성판정(누계) 305명\n<U+2611> 자가격리 2명 (2명 음성 판정 확인)\n.\n<U+0001F6A8> 보령시 선별진료소\n<U+25FE>보령시보건소 ☎ 041-930-0900\n<U+25FE>보령아산병원 ☎ 041-930-5131\n\n#보령시 #보령시청 #코로나19 #확진자현황 https://t.co/hsCPFnoJBs"
View(covid_frames_date)
html_reg <- " |&|<|>|"|#|'"
str_view_all(covid_frames_date$text[37], html_reg)
<
str_view_all(covid_frames_date$text[37], "[^[:word:]#@]+")
<div id="htmlwidget-6dd7402b97d5aaceb51d" style="width:960px;height:100%;" class="str_view html-widget">
# 2) URL
covid_frames_date$text[21:30]
## [1] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#시트마스크 #코로나물리치기 #코로나야 #코로나19 #미세먼지마스크kf94 https://t.co/LHMhke9xY7"
## [2] "우한 페렴 황사 마스크 KF94(정품) 대량 판매합니다\n도매 대량구입 원하시면 문의바랍니다~최저가문의!\n구매까똑:m13588\n#코로나18아니19 #우한코로나 #에티카마스크 #코로나때문에 #코로나엔라임 https://t.co/TVwMABOuoG"
## [3] "#코로나19 확산의 주범인 신천지교회... 아마도 국가적으로 구성권을 청구하는것이 다방면으로 괜찮을듯 하네요!!! 신천지교를 뿌리 뽑을 수 있는 타이밍입니다. https://t.co/kDIy4MfCRT"
## [4] "#코로나19 로 정부에서 국민지침서를 발표!\n\n우리 모두 이 고비를 현명하게 행동하여 코로나19를 빨리 소멸해요!\n\n#사회적거리두기 https://t.co/aJPfhIwNoL"
## [5] "신천지예수교회는 담임강사 강사 전도사를 위한 복지차원의 기숙사는 제공하고 있으나 성도들의 집단 합숙시설은 운영하지 않습니다 성도들의 거주지는 개인 자유에 의한 것이며 교회는 간섭할 수 없습니다 \n\nhttps://t.co/VCKxQ7uuTI\n\n#신천지 #예수교회 #코로나 #예방 #진실 https://t.co/dcG6zW5jjM"
## [6] "#코로나19 확산을 늦추기 위해 우리 모두에겐 각자의 역할이 있습니다. 지금 자신의 몫을 하고 계신가요? 서약에 참여하고 많은 목숨을 살립시다! #coronavirus https://t.co/nADLAXl0fD"
## [7] "대한민국 국민이라면 제발! 앞으로 15일간 최대한 집에 머물러 주세요! 제발! #사회적거리두기 #코로나19 #이기자 https://t.co/UaSLUDmR2H"
## [8] "#코로나19\n거짓뉴스나 괴담에 빠르게 반응하고, 온갖 걱정과 염려를 보면서, 요즘 대세라는 #트로트 반응까지\n\n많은 남이 관심있거나, 좋아한다고 언론이 광고를 대행해주면 나도 관심있거나, 좋아할꺼라고 생각하는 것 같다. \n\n유행과 다양이 같은 뜻으로 쓰이는 걸 보니 세상 다양한 건 분명하다."
## [9] "네......??? https://t.co/CiIn8bXAuM #자레드레토 #코로나 #조커"
## [10] "\"잠복기에는...\" https://t.co/sGJnagQvka #15세 #코로나 #증상"
url_reg <- "https?[^[:space:]]+|(www.)[^[:space:]]+"
url_ex <- c("https://t.co/CiIn8bXAuM",
"www.google.com")
str_view_all(url_ex, regex(url_reg, ignore_case = T))
<!iv id="htmlwidget-78aeec744d221af28117" style="width:960px;height:100%;" class="str_view html-widget">
<!iv id="htmlwidget-9b73b595079fe76115b6" style="width:960px;height:100%;" class="str_view html-widget">
# html, url, non-word
html_reg <- " |&|<|>|"|#|'"
url_reg <- "https?[^[:space:]]+|(www.)[^[:space:]]+"
nonword_reg <- "[^[:word:]#@ ]"
text_processor <- function(x){
x <- str_replace_all(x, url_reg, " ")
x <- str_replace_all(x, html_reg, " ")
x <- str_replace_all(x, nonword_reg, " ")
x <- str_squish(x)
return(x)
}
text_processor(covid_frames_date$text[37])
## [1] "보령시 코로나19 현황 2020 3 22 09시 현재 확진자 0명 의사환자검사중 0명 음성판정 누계 305명 자가격리 2명 2명 음성 판정 확인 보령시 선별진료소 보령시보건소 041 930 0900 보령아산병원 041 930 5131 #보령시 #보령시청 #코로나19 #확진자현황"
covid_frames_date$text[37]
## [1] "<보령시 코로나19 현황 >\n2020. 3. 22. 09시 현재\n\n.\n<U+2611> 확진자 0명\n<U+2611> 의사환자검사중 0명\n<U+2611> 음성판정(누계) 305명\n<U+2611> 자가격리 2명 (2명 음성 판정 확인)\n.\n<U+0001F6A8> 보령시 선별진료소\n<U+25FE>보령시보건소 ☎ 041-930-0900\n<U+25FE>보령아산병원 ☎ 041-930-5131\n\n#보령시 #보령시청 #코로나19 #확진자현황 https://t.co/hsCPFnoJBs"
# hashtags
str_extract_all(covid_frames_date$text[37], "#[[:word:]]+")
## [[1]]
## [1] "#보령시" "#보령시청" "#코로나19" "#확진자현황"
hashtag_extractor <- function(x){
x <- str_extract_all(x, "#[[:word:]]+")
x <- unlist(x)
x <- paste(x, collapse=" ")
return(x)
}
hashtag_extractor(covid_frames_date$text[37])
## [1] "#보령시 #보령시청 #코로나19 #확진자현황"
# 한국어 토큰화 (명사)
covid_frames_date$text[37]
## [1] "<보령시 코로나19 현황 >\n2020. 3. 22. 09시 현재\n\n.\n<U+2611> 확진자 0명\n<U+2611> 의사환자검사중 0명\n<U+2611> 음성판정(누계) 305명\n<U+2611> 자가격리 2명 (2명 음성 판정 확인)\n.\n<U+0001F6A8> 보령시 선별진료소\n<U+25FE>보령시보건소 ☎ 041-930-0900\n<U+25FE>보령아산병원 ☎ 041-930-5131\n\n#보령시 #보령시청 #코로나19 #확진자현황 https://t.co/hsCPFnoJBs"
RcppMeCab::pos(text_processor(covid_frames_date$text[37]))
## $`보령시 코로나19 현황 2020 3 22 09시 현재 확진자 0명 의사환자검사중 0명 음성판정 누계 305명 자가격리 2명 2명 음성 판정 확인 보령시 선별진료소 보령시보건소 041 930 0900 보령아산병원 041 930 5131 #보령시 #보령시청 #코로나19 #확진자현황`
## [1] "보령시/NNP" "코로나/NNP" "19/SN" "현황/NNG" "2020/SN"
## [6] "3/SN" "22/SN" "09/SN" "시/NNBC" "현재/MAG"
## [11] "확진/NNG" "자/XSN" "0/SN" "명/NNBC" "의사/NNG"
## [16] "환자/NNG" "검사/NNG" "중/NNB" "0/SN" "명/NNBC"
## [21] "음성/NNG" "판정/NNG" "누계/NNG" "305/SN" "명/NNBC"
## [26] "자/NNG" "가/JKS" "격리/NNG" "2/SN" "명/NNBC"
## [31] "2/SN" "명/NNBC" "음성/NNG" "판정/NNG" "확인/NNG"
## [36] "보령시/NNP" "선별/NNG" "진료소/NNG" "보령시/NNP" "보건소/NNG"
## [41] "041/SN" "930/SN" "0900/SN" "보령/NNG" "아산/NNP"
## [46] "병원/NNG" "041/SN" "930/SN" "5131/SN" "#/SY"
## [51] "보령시/NNP" "#/SY" "보령/NNG" "시청/NNG" "#/SY"
## [56] "코로나/NNP" "19/SN" "#/SY" "확진/NNG" "자/XSN"
## [61] "현황/NNG"
RcppMeCab::pos(text_processor(covid_frames_date$text[37:40]))
## $`보령시 코로나19 현황 2020 3 22 09시 현재 확진자 0명 의사환자검사중 0명 음성판정 누계 305명 자가격리 2명 2명 음성 판정 확인 보령시 선별진료소 보령시보건소 041 930 0900 보령아산병원 041 930 5131 #보령시 #보령시청 #코로나19 #확진자현황`
## [1] "보령시/NNP" "코로나/NNP" "19/SN" "현황/NNG" "2020/SN"
## [6] "3/SN" "22/SN" "09/SN" "시/NNBC" "현재/MAG"
## [11] "확진/NNG" "자/XSN" "0/SN" "명/NNBC" "의사/NNG"
## [16] "환자/NNG" "검사/NNG" "중/NNB" "0/SN" "명/NNBC"
## [21] "음성/NNG" "판정/NNG" "누계/NNG" "305/SN" "명/NNBC"
## [26] "자/NNG" "가/JKS" "격리/NNG" "2/SN" "명/NNBC"
## [31] "2/SN" "명/NNBC" "음성/NNG" "판정/NNG" "확인/NNG"
## [36] "보령시/NNP" "선별/NNG" "진료소/NNG" "보령시/NNP" "보건소/NNG"
## [41] "041/SN" "930/SN" "0900/SN" "보령/NNG" "아산/NNP"
## [46] "병원/NNG" "041/SN" "930/SN" "5131/SN" "#/SY"
## [51] "보령시/NNP" "#/SY" "보령/NNG" "시청/NNG" "#/SY"
## [56] "코로나/NNP" "19/SN" "#/SY" "확진/NNG" "자/XSN"
## [61] "현황/NNG"
##
## $`이슈클립 31번 감염경로 신천지 우한교회 교인 아니다 #신천지 #코로나19`
## [1] "이슈/NNG" "클립/NNG" "31/SN" "번/NNBC" "감염/NNG"
## [6] "경로/NNG" "신천지/NNG" "우한/NNG" "교회/NNG" "교인/NNG"
## [11] "아니/VCN" "다/EC" "#/SY" "신천지/NNP" "#/SY"
## [16] "코로나/NNP" "19/SN"
##
## $`기온과 말라리아약이 코로나19에 미치는 영향과 아프리카 #코로나19 #기온 #체온 #말라리아약 #아프리카 출처 배용석 블로그`
## [1] "기온/NNG" "과/JC" "말라리아/NNG" "약/NNG" "이/JKS"
## [6] "코로나/NNG" "19/SN" "에/JKB" "미치/VV" "는/ETM"
## [11] "영향/NNG" "과/JC" "아프리카/NNP" "#/SY" "코로나/NNP"
## [16] "19/SN" "#/SY" "기온/NNG" "#/SY" "체온/NNG"
## [21] "#/SY" "말라리아/NNG" "약/NNG" "#/SY" "아프리카/NNP"
## [26] "출처/NNG" "배/NNG" "용석/NNG" "블로그/NNG"
##
## $`기온과 말라리아약이 코로나19에 미치는 영향과 아프리카 #코로나19 #기온 #체온 #말라리아약 #아프리카 출처 배용석 블로그`
## [1] "기온/NNG" "과/JC" "말라리아/NNG" "약/NNG" "이/JKS"
## [6] "코로나/NNG" "19/SN" "에/JKB" "미치/VV" "는/ETM"
## [11] "영향/NNG" "과/JC" "아프리카/NNP" "#/SY" "코로나/NNP"
## [16] "19/SN" "#/SY" "기온/NNG" "#/SY" "체온/NNG"
## [21] "#/SY" "말라리아/NNG" "약/NNG" "#/SY" "아프리카/NNP"
## [26] "출처/NNG" "배/NNG" "용석/NNG" "블로그/NNG"
RcppMeCab::pos(text_processor(covid_frames_date$text[37])) %>% str_extract_all("[[:word:]]+/N[[:upper:]]+") %>% unlist()
## Warning in stri_extract_all_regex(string, pattern, simplify = simplify, :
## argument is not an atomic vector; coercing
## [1] "보령시/NNP" "코로나/NNP" "현황/NNG" "시/NNBC" "확진/NNG"
## [6] "명/NNBC" "의사/NNG" "환자/NNG" "검사/NNG" "중/NNB"
## [11] "명/NNBC" "음성/NNG" "판정/NNG" "누계/NNG" "명/NNBC"
## [16] "자/NNG" "격리/NNG" "명/NNBC" "명/NNBC" "음성/NNG"
## [21] "판정/NNG" "확인/NNG" "보령시/NNP" "선별/NNG" "진료소/NNG"
## [26] "보령시/NNP" "보건소/NNG" "보령/NNG" "아산/NNP" "병원/NNG"
## [31] "보령시/NNP" "보령/NNG" "시청/NNG" "코로나/NNP" "확진/NNG"
## [36] "현황/NNG"
noun_extractor <- function(x){
x <- str_remove_all(x, "#[[:word:]]+")
x <- RcppMeCab::pos(x)
x <- str_match_all(x, "[[:word:]]+/N[[:upper:]]+")
x <- unlist(x)
x <- paste(x, collapse = " ")
x <- str_remove_all(x, "/[[:upper:]]+")
return(x)
}
noun_extractor(covid_frames_date$text[37])
## Warning in stri_match_all_regex(string, pattern, omit_no_match = TRUE,
## opts_regex = opts(pattern)): argument is not an atomic vector; coercing
## [1] "보령시 코로나 현황 시 확진 명 의사 환자 검사 중 명 음성 판정 누계 명 자 격리 명 명 음성 판정 확인 보령시 선별 진료소 보령시 보건소 보령 아산 병원"
library(future.apply)
## Loading required package: future
plan(multicore)
#covid_frames_tweets <- covid_frames_date %>%
# filter(str_detect(text, "우한|중국|폐렴")) %>%
# mutate(tweet = future_sapply(text, text_processor)) %>%
# mutate(hashtag = future_sapply(tweet, hashtag_extractor)) %>%
# mutate(noun = future_sapply(tweet, noun_extractor))