# install.packages('stringr')
# install.packages('magrittr')
# install.packages('glue')
# install.packages('stringi')
# install.packages('tidytext')
# stringr 설치가 안되면 아래 코드로 설치
# install.packages('https://cran.r-project.org/src/contrib/Archive/stringr/stringr_1.4.1.tar.gz', repos = NULL, type = 'source')
NLP
Text Pre-processing & Basic Analysis
Download example data
Install required packages
Import required libraries
library(tidyverse)
library(stringr)
library(tidytext)
Text Pre-processing
Import speeches
# Set to the path within the file where the current R script exists
<- readLines('data/speech_moon.txt', encoding = 'UTF-8')
raw_moon head(raw_moon)
[1] "정권교체 하겠습니다!"
[2] " 정치교체 하겠습니다!"
[3] " 시대교체 하겠습니다!"
[4] " "
[5] " ‘불비불명(不飛不鳴)’이라는 고사가 있습니다. 남쪽 언덕 나뭇가지에 앉아, 3년 동안 날지도 울지도 않는 새. 그러나 그 새는 한번 날면 하늘 끝까지 날고, 한번 울면 천지를 뒤흔듭니다."
[6] ""
Remove unnecessary characters - str_replace_all()
# Learn how it works with sample text
<- "치킨은!! 맛있다. xyz 정말 맛있다!@#"
txt txt
[1] "치킨은!! 맛있다. xyz 정말 맛있다!@#"
# string = 처리할 텍스트,
# pattern = 규칙,
# replacement = 바꿀 문자
str_replace_all(string = txt, pattern = '[^가-힣]', replacement = ' ')
[1] "치킨은 맛있다 정말 맛있다 "
# raw_moon의 불필요한 문자 제거하기
<- raw_moon %>%
moon str_replace_all('[^가-힣]', ' ')
head(moon)
[1] "정권교체 하겠습니다 "
[2] " 정치교체 하겠습니다 "
[3] " 시대교체 하겠습니다 "
[4] " "
[5] " 불비불명 이라는 고사가 있습니다 남쪽 언덕 나뭇가지에 앉아 년 동안 날지도 울지도 않는 새 그러나 그 새는 한번 날면 하늘 끝까지 날고 한번 울면 천지를 뒤흔듭니다 "
[6] ""
Remove Consecutive Spaces
<- "치킨은 맛있다 정말 맛있다 "
txt txt
[1] "치킨은 맛있다 정말 맛있다 "
str_squish(txt)
[1] "치킨은 맛있다 정말 맛있다"
# moon에 있는 연속된 공백 제거하기
<- moon %>%
moon str_squish()
head(moon)
[1] "정권교체 하겠습니다"
[2] "정치교체 하겠습니다"
[3] "시대교체 하겠습니다"
[4] ""
[5] "불비불명 이라는 고사가 있습니다 남쪽 언덕 나뭇가지에 앉아 년 동안 날지도 울지도 않는 새 그러나 그 새는 한번 날면 하늘 끝까지 날고 한번 울면 천지를 뒤흔듭니다"
[6] ""
Convert data to tibble structure - as_tibble()
<- dplyr::as_tibble(moon)
moon moon
# A tibble: 117 × 1
value
<chr>
1 "정권교체 하겠습니다"
2 "정치교체 하겠습니다"
3 "시대교체 하겠습니다"
4 ""
5 "불비불명 이라는 고사가 있습니다 남쪽 언덕 나뭇가지에 앉아 년 동안 날지도 울…
6 ""
7 "그 동안 정치와 거리를 둬 왔습니다 그러나 암울한 시대가 저를 정치로 불러냈습…
8 ""
9 ""
10 "우리나라 대통령 이 되겠습니다"
# ℹ 107 more rows
Pre-processing at once (feat. %>%
)
<- raw_moon %>%
moon str_replace_all('[^가-힣]', ' ') %>% # 한글만 남기기
str_squish() %>% # 연속된 공백 제거
as_tibble() # tibble로 변환
moon
# A tibble: 117 × 1
value
<chr>
1 "정권교체 하겠습니다"
2 "정치교체 하겠습니다"
3 "시대교체 하겠습니다"
4 ""
5 "불비불명 이라는 고사가 있습니다 남쪽 언덕 나뭇가지에 앉아 년 동안 날지도 울…
6 ""
7 "그 동안 정치와 거리를 둬 왔습니다 그러나 암울한 시대가 저를 정치로 불러냈습…
8 ""
9 ""
10 "우리나라 대통령 이 되겠습니다"
# ℹ 107 more rows
Tokenization - unnest_tokens()
Practice with sample data
<- tibble(value = "대한민국은 민주공화국이다. 대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다.")
text text
# A tibble: 1 × 1
value
<chr>
1 대한민국은 민주공화국이다. 대한민국의 주권은 국민에게 있고, 모든 권력은 국민…
Sentence-based tokenization
%>% # 문장 기준 토큰화
text unnest_tokens(input = value, # 토큰화할 텍스트
output = word, # 토큰을 담을 변수명
token = 'sentences') # 문장 기준
# A tibble: 2 × 1
word
<chr>
1 대한민국은 민주공화국이다.
2 대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다.
Words-based Tokenization (Tokenization by spacing)
%>% # 띄어쓰기 기준 토큰화
text unnest_tokens(input = value,
output = word,
token = 'words')
# A tibble: 10 × 1
word
<chr>
1 대한민국은
2 민주공화국이다
3 대한민국의
4 주권은
5 국민에게
6 있고
7 모든
8 권력은
9 국민으로부터
10 나온다
Character-Based Tokenization
%>% # 문자 기준 토큰화
text unnest_tokens(input = value,
output = word,
token = 'characters')
# A tibble: 40 × 1
word
<chr>
1 대
2 한
3 민
4 국
5 은
6 민
7 주
8 공
9 화
10 국
# ℹ 30 more rows
Tokenizing speeches (Words-based)
# 연설문 토큰화하기
<- moon %>%
word_space unnest_tokens(input = value,
output = word,
token = 'words')
word_space
# A tibble: 2,025 × 1
word
<chr>
1 정권교체
2 하겠습니다
3 정치교체
4 하겠습니다
5 시대교체
6 하겠습니다
7 불비불명
8 이라는
9 고사가
10 있습니다
# ℹ 2,015 more rows
Word frequency visualization
Find word frequency - count()
# 단어 빈도 구하기 - count()
<- word_space %>%
temp_word_space count(word, sort = T)
temp_word_space
# A tibble: 1,440 × 2
word n
<chr> <int>
1 합니다 27
2 수 16
3 있습니다 13
4 저는 13
5 등 12
6 있는 12
7 함께 12
8 만들겠습니다 11
9 일자리 10
10 국민의 9
# ℹ 1,430 more rows
Remove single-letter words - filter(str_count())
str_count()
= Count the number of characters in a string
# 한 글자로 된 단어 제거하기 - filter(str_count())
# str_count = 문자열의 글자 수 구하기
str_count('배')
[1] 1
str_count('사과')
[1] 2
leave no more than two characters
# 두 글자 이상만 남기기
<- temp_word_space %>%
temp_word_space filter(str_count(word) > 1)
temp_word_space
# A tibble: 1,384 × 2
word n
<chr> <int>
1 합니다 27
2 있습니다 13
3 저는 13
4 있는 12
5 함께 12
6 만들겠습니다 11
7 일자리 10
8 국민의 9
9 우리 9
10 우리나라 9
# ℹ 1,374 more rows
Let’s work at once
# 한 번에 작업하기
<- word_space %>%
word_space count(word, sort = T) %>%
filter(str_count(word) > 1)
word_space
# A tibble: 1,384 × 2
word n
<chr> <int>
1 합니다 27
2 있습니다 13
3 저는 13
4 있는 12
5 함께 12
6 만들겠습니다 11
7 일자리 10
8 국민의 9
9 우리 9
10 우리나라 9
# ℹ 1,374 more rows
Extract frequently used words (Top 20)
# 자주 사용된 단어 추출하기
<- word_space %>%
top20 head(20)
top20
# A tibble: 20 × 2
word n
<chr> <int>
1 합니다 27
2 있습니다 13
3 저는 13
4 있는 12
5 함께 12
6 만들겠습니다 11
7 일자리 10
8 국민의 9
9 우리 9
10 우리나라 9
11 새로운 8
12 위해 8
13 그리고 7
14 나라 7
15 나라가 7
16 지금 7
17 낡은 6
18 대통령이 6
19 되겠습니다 6
20 없는 6
Create a bar graph - geom_col()
# 막대 그래프 만들기 - geom_col()
# mac 사용자, 그래프에 한글 지원폰트로 변경
# theme_set(theme_gray(base_family = "AppleGothic"))
::ggplot(top20, aes(x = reorder(word, n), y = n)) + # 단어 빈도순 정렬
ggplot2geom_col() +
coord_flip() # 회전
Graph Refinement
ggplot(top20, aes(x = reorder(word, n), y = n)) +
geom_col() +
coord_flip() +
geom_text(aes(label = n), hjust = -0.3) +
labs(title = '문재인 대통령 출마 연설문 단어 빈도',
x = NULL, y = NULL) +
theme(title = element_text(size = 12))
Creating a word cloud - geom_text_wordcloud()
# 워드 클라우드 만들기 - geom_text_wordcloud()
# install.packages('ggwordcloud')
library(ggwordcloud)
ggplot(word_space, aes(label = word, size = n)) +
geom_text_wordcloud(seed = 1234) +
scale_radius(limits = c(3, NA), # 최소, 최대 단어 빈도
range = c(3, 30)) # 최소, 최대 글자 크기
Graph Refinement
ggplot(word_space,
aes(label = word,
size = n,
col = n)) + # 빈도에 따라 색깔 표현
geom_text_wordcloud(seed = 1234) +
scale_radius(limits = c(3, NA),
range = c(3, 30)) +
scale_color_gradient(low = '#66aaf2', # 최소 빈도 색깔
high = '#004EA1') + # 최대 빈도 색깔
theme_minimal() # 배경 없는 테마 적용
Change the graph font 1. Loading Google Fonts - font_add_google()
# 그래프 폰트 바꾸기
# 1. 구글 폰트 불러오기 - font_add_google()
# install.packages('showtext')
library(showtext)
Loading required package: sysfonts
Loading required package: showtextdb
# install.packages('jsonlite')
# install.packages('curl')
font_add_google(name = 'Nanum Gothic', family = 'nanumgothic')
showtext_auto()
- Assign fonts to graphs
To prevent errors (or warnings), extrafont is installed and fonts in the operating system are imported into R with font_import. -> Takes some time..
(시간이 매우 오래 걸리니 수업 후에 실행해줍니다, 한 시간 정도 걸림)
# install.packages("extrafont")
library(extrafont)
Registering fonts with R
Attaching package: 'extrafont'
The following object is masked from 'package:showtextdb':
font_install
# font_import(paths=NULL, recursive = TRUE, prompt=TRUE, pattern=NULL)
# 2. 그래프에 폰트 지정하기
ggplot(word_space,
aes(label = word,
size = n,
col = n)) +
geom_text_wordcloud(seed = 1234,
family = 'nanumgothic') + # 폰트 적용
scale_radius(limits = c(3,NA),
range = c(3,30)) +
scale_color_gradient(low = '#66aaf2',
high = '#004EA1') +
theme_minimal()
Font change (Black Gothick)
# '검은고딕' 폰트 적용
font_add_google(name = 'Black Han Sans', family = 'blackhansans')
showtext_auto()
ggplot(word_space,
aes(label = word,
size = n,
col = n)) +
geom_text_wordcloud(seed = 1234,
family = 'blackhansans') + # 폰트 적용
scale_radius(limits = c(3,NA),
range = c(3,30)) +
scale_color_gradient(low = '#66aaf2',
high = '#004EA1') +
theme_minimal()
Font change (gamjaflower family)
# 3. ggplot2 패키지로 만든 그래프의 폰트 바꾸기
font_add_google(name = 'Gamja Flower', family = 'gamjaflower')
showtext_auto()
ggplot(top20, aes(x = reorder(word, n), y = n)) +
geom_col() +
coord_flip() +
geom_text(aes(label = n), hjust = -0.3) +
labs(title = '문재인 대통령 출마 연설문 단어 빈도',
x = NULL, y = NULL) +
theme(title = element_text(size = 12), text = element_text(family = 'gamjaflower')) # 폰트 적용
Optional: If you don’t’ want to specify the font using theme() every time, set the default theme font of the ggplot2
package like below.
# ggplot2 기본 테마 폰트 변경하기 --------------------------------------------------------
# 매번 theme()를 이용해 폰트를 지정하는게 번거롭다면 ggplot2 패키지 기본 테마 폰트 설정
theme_set(theme_gray(base_family = 'nanumgothic'))
Morphological analysis (형태소 단위 분석)
[KoNLP]
Installing the Korean Morphological Analysis Package. The order of installation is important, so be sure to do it in that order.
- Install Java and rJava packages
# install.packages('multilinguer')
library(multilinguer)
- After installing Amazon Corretto, close RStudio + restart
# install_jdk()
- Installing KoNLP dependencies
# install.packages(c('stringr', 'hash', 'tau', 'Sejong', 'RSQLite', 'devtools'), type = 'binary')
- Installing KoNLP dependencies
# install.packages('remotes')
# remotes::install_github('haven-jeon/KoNLP',
# upgrade = 'never',
# INSTALL_opts = c('--no-multiarch'))
# 'scala-library-2.11.8.jar' 에러 발생 시, download.file 코드 실행
# download.file(url = "https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.11.8/scala-library-2.11.8.jar",
# destfile = paste0(.libPaths()[1], "/KoNLP/Java/scala-library-2.11.8.jar"))
library(KoNLP) # Fail to locate
Checking user defined dictionary!
# Checking user defined dictionary! <- This is not an error
# useNIADic()
# 다운로드 항목 출력 시, 'All' 선택하여 다운로드
# When printing download items, select 'All' to download
Tokenize using a morpheme analyzer(형태소 분석기) - see how it works with noun extraction sample text
<- tibble(
text value = c("대한민국은 민주공화국이다.",
"대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다."))
text
# A tibble: 2 × 1
value
<chr>
1 대한민국은 민주공화국이다.
2 대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다.
extraNoun()
: Output nouns extracted from sentences in a list structure
# extraNoun(): 문장에서 추출한 명사를 list 구조로 출력
extractNoun(text$value)
[[1]]
[1] "대한민국" "민주공화국"
[[2]]
[1] "대한민국" "주권" "국민" "권력" "국민"
Extracting nouns using unnest_tokens()
, outputting nouns in a tractable tibble structure
# unnest_tokens()를 이용해 명사 추출하기, 다루기 쉬운 tibble 구조로 명사 출력
library(tidytext)
%>%
text unnest_tokens(input = value, # 분석 대상
output = word, # 출력 변수명
token = extractNoun) # 토큰화 함수
# A tibble: 7 × 1
word
<chr>
1 대한민국
2 민주공화국
3 대한민국
4 주권
5 국민
6 권력
7 국민
Let’s compare with spacing-based extraction
# 띄어쓰기 기준 추출과 비교해보자
%>%
text unnest_tokens(input = value,
output = word,
token = 'words')
# A tibble: 10 × 1
word
<chr>
1 대한민국은
2 민주공화국이다
3 대한민국의
4 주권은
5 국민에게
6 있고
7 모든
8 권력은
9 국민으로부터
10 나온다
Extracting Nouns from Speeches
# 연설문에서 명사 추출하기
# 문재인 대통령 연설문 불러오기
<- readLines('data/speech_moon.txt', encoding = 'UTF-8')
raw_moon
library(stringr)
library(textclean)
<- raw_moon %>%
moon str_replace_all('[^가-힣]', ' ') %>%
str_squish() %>%
as_tibble()
moon
# A tibble: 117 × 1
value
<chr>
1 "정권교체 하겠습니다"
2 "정치교체 하겠습니다"
3 "시대교체 하겠습니다"
4 ""
5 "불비불명 이라는 고사가 있습니다 남쪽 언덕 나뭇가지에 앉아 년 동안 날지도 울…
6 ""
7 "그 동안 정치와 거리를 둬 왔습니다 그러나 암울한 시대가 저를 정치로 불러냈습…
8 ""
9 ""
10 "우리나라 대통령 이 되겠습니다"
# ℹ 107 more rows
# 명사 기준 토큰화
<- moon %>%
word_noun unnest_tokens(input = value,
output = word,
token = extractNoun)
word_noun
# A tibble: 1,757 × 1
word
<chr>
1 "정권교체"
2 "하겠습니"
3 "정치"
4 "교체"
5 "하겠습니"
6 "시대"
7 "교체"
8 "하겠습니"
9 ""
10 "불비불명"
# ℹ 1,747 more rows
Find word frequency
# 단어 빈도 구하기
<- word_noun %>%
word_noun count(word, sort = T) %>% # 단어 빈도 구해 내림차순 정렬
filter(str_count(word) > 1) # 두 글자 이상만 남기기
word_noun
# A tibble: 704 × 2
word n
<chr> <int>
1 국민 21
2 일자리 21
3 나라 19
4 우리 17
5 경제 15
6 사회 14
7 성장 13
8 대통령 12
9 정치 12
10 하게 12
# ℹ 694 more rows
Comparison with the previous spacing-based extraction
# 띄어쓰기 기준 추출과 비교
%>%
moon unnest_tokens(input = value,
output = word,
token = 'words') %>%
count(word, sort = T) %>%
filter(str_count(word) > 1)
# A tibble: 1,384 × 2
word n
<chr> <int>
1 합니다 27
2 있습니다 13
3 저는 13
4 있는 12
5 함께 12
6 만들겠습니다 11
7 일자리 10
8 국민의 9
9 우리 9
10 우리나라 9
# ℹ 1,374 more rows
Do at once (Noun extraction from the speech)
# 명사 추출
%>%
moon unnest_tokens(input = value,
output = word,
token = extractNoun) %>%
count(word, sort = T) %>%
filter(str_count(word) > 1)
# A tibble: 704 × 2
word n
<chr> <int>
1 국민 21
2 일자리 21
3 나라 19
4 우리 17
5 경제 15
6 사회 14
7 성장 13
8 대통령 12
9 정치 12
10 하게 12
# ℹ 694 more rows
Extract Top 20 Nouns and create a bar graph
# 상위 20개 단어 추출
<- word_noun %>%
top20 head(20)
top20
# A tibble: 20 × 2
word n
<chr> <int>
1 국민 21
2 일자리 21
3 나라 19
4 우리 17
5 경제 15
6 사회 14
7 성장 13
8 대통령 12
9 정치 12
10 하게 12
11 대한민국 11
12 평화 11
13 복지 10
14 우리나라 10
15 확대 10
16 들이 9
17 사람 9
18 산업 9
19 정부 9
20 복지국가 8
# 막대 그래프 만들기
library(showtext)
font_add_google(name = 'Nanum Gothic', family = 'nanumgothic')
showtext_auto()
ggplot(top20, aes(x = reorder(word, n), y = n)) +
geom_col() +
coord_flip() +
geom_text(aes(label = n), hjust = -0.3) +
labs(x = NULL) +
theme(text = element_text(family = 'nanumgothic'))
Word Cloud of Nouns extracted from the speec
# 워드 클라우드 만들기
font_add_google(name = 'Black Han Sans', family = 'blackhansans')
showtext_auto()
library(ggwordcloud)
ggplot(word_noun, aes(label = word, size = n, col = n)) +
geom_text_wordcloud(seed = 1234, family = 'blackhansans') +
scale_radius(limits = c(3,NA),
range = c(3,15)) +
scale_color_gradient(low = '#66aaf2', high = '#004EA1') +
theme_minimal()
Extract sentences with specific words
- Tokenize by sentence
# 문장 기준으로 토큰화하기
<- raw_moon %>%
sentences_moon str_squish() %>%
as_tibble() %>%
unnest_tokens(input = value,
output = sentence,
token = 'sentences')
sentences_moon
# A tibble: 207 × 1
sentence
<chr>
1 정권교체 하겠습니다!
2 정치교체 하겠습니다!
3 시대교체 하겠습니다!
4 ‘불비불명(不飛不鳴)’이라는 고사가 있습니다.
5 남쪽 언덕 나뭇가지에 앉아, 3년 동안 날지도 울지도 않는 새.
6 그러나 그 새는 한번 날면 하늘 끝까지 날고, 한번 울면 천지를 뒤흔듭니다.
7 그 동안 정치와 거리를 둬 왔습니다.
8 그러나 암울한 시대가 저를 정치로 불러냈습니다.
9 더 이상 남쪽 나뭇가지에 머무를 수 없었습니다.
10 이제 저는 국민과 함께 높이 날고 크게 울겠습니다.
# ℹ 197 more rows
Extract sentences with specific words - str_detect()
# 특정 단어가 사용된 문장 추출하기 - str_detect()
# 예시
str_detect('치킨은 맛있다', '치킨')
[1] TRUE
str_detect('치킨은 맛있다', '피자')
[1] FALSE
Example (1): Extract sentences with “국민”
# 특정 단어가 사용된 문장 추출하기, '국민'
%>%
sentences_moon filter(str_detect(sentence, '국민'))
# A tibble: 19 × 1
sentence
<chr>
1 이제 저는 국민과 함께 높이 날고 크게 울겠습니다.
2 오늘 저는 제18대 대통령선거 출마를 국민 앞에 엄숙히 선언합니다.
3 존경하는 국민 여러분!
4 국민이 모두 아픕니다.
5 국민 한 사람 한 사람이 모두 아픕니다.
6 국민들에게 희망을 주는 정치가 절실하게 필요합니다.
7 국민의 뜻이 대통령의 길입니다.
8 저는 대선출마를 결심하고 국민 여러분께 출마선언문을 함께 쓰자고 제안 드렸습…
9 시민의 한숨과 눈물을 닦아주지 못하는 정치가 있었고, 오히려 국민의 걱정거리가…
10 상식이 통하는 사회, 권한과 책임이 비례하는 사회, 다름을 인정하는 세상, 개천…
11 그러나 거창하게만 들리는 이 국가비전 역시 국민의 마음속에 있었습니다.
12 더욱 낮아지고 겸손해져서 국민의 마음속으로 들어가라.
13 국민들이 제게 준 가르침입니다.
14 국민의 뜻에서 대통령의 길을 찾겠습니다.
15 문화혁신을 통해 모든 국민의 창조성을 높이고 이를 통해 기술혁신과 신산업 형성…
16 이렇게 하면 국민의 살림이 서서히 나아질 것이며 5년 뒤에는 큰 성과가 나타날 …
17 이명박 정부의 방해에도 불구하고 끝내 국민이 지켜준 세종시, 혁신도시를 지방 …
18 존경하는 국민 여러분!
19 국민의 마음에서 길을 찾는 우리나라 대통령이 되겠습니다.
Example (2): Extract sentences with “일자리”
# 특정 단어가 사용된 문장 추출하기, '일자리'
%>%
sentences_moon filter(str_detect(sentence, '일자리'))
# A tibble: 18 × 1
sentence
<chr>
1 빚 갚기 힘들어서, 아이 키우기 힘들어서, 일자리가 보이지 않아서 아픕니다.
2 상생과 평화의 대한민국은 공평과 정의에 바탕을 두고, 성장의 과실을 함께 누리…
3 복지의 확대를 통해 보육, 교육, 의료, 요양 등 사회서비스 부문에 수많은 일자리…
4 결국 복지국가로 가는 길은 사람에 대한 투자, 일자리 창출, 자영업 고통 경감, …
5 ‘일자리 정부’로 ‘일자리 혁명’을 이루겠습니다.
6 복지의 확대와 함께 저는 강력한 ‘일자리 혁명’을 이루고자 합니다.
7 지금 너무나 많은 젊은이들과 실업자, 비정규직 종사자, 근로능력이 있는 고령자…
8 좋은 일자리 창출을 위해 비정규직의 정규직 전환 촉진, 비정규직에 대한 차별철…
9 또한 정보통신 산업, 바이오산업, 나노 산업, 신재생에너지 산업, 문화산업과 콘…
10 그리고 앞에서 말한 보육, 교육, 의료, 복지 등 사회서비스 부문은 무궁무진한 잠…
11 일자리 없는 곳에서 희망을 찾을 수 없습니다.
12 지방 일자리에 대해 특별한 노력을 기울이겠습니다.
13 지역균형발전은 곧 산업 균형, 일자리 균형이 목표입니다.
14 이명박 정부의 방해에도 불구하고 끝내 국민이 지켜준 세종시, 혁신도시를 지방 …
15 이 모든 정책의 실효성을 담보하기 위해 대통령이 되면 저는 가장 먼저 대통령 직…
16 저는 먼 훗날 ‘일자리 혁명을 일으킨 대통령’으로 평가받기를 희망합니다.
17 또한 좋은 일자리와 산업혁신을 위해서는 평생학습체제가 뒷받침되어야 합니다.
18 노인 일자리를 늘리고, 특히 그 연륜과 경험을 지역사회에 활용할 수 있는 방안도…