1. 텍스트 데이터 분석 방법론

텍스트 데이터를 분석하는 시작은 정규표현식(Regular Expression)으로 시작된다. 정규표현식을 바탕으로 텍스트를 토큰(token)으로 유의미한 조각으로 쪼개고 나서, 이를 단어주머니(Bag of Words), 워드2벡(Word2Vec) 등을 통해 분석한다.

텍스트 데이터 분석 방법론

특히, word2vec은 초기 단어 유사도, 기계번역, 질의응답(QnA), 개체명 인식(NER, Named Entity Recognition)등에 주로 사용되었으나, 최근에는 추천시스템까지 영역을 확대하고 있다.

2. 참고문헌

3. 대통령 취임사 1 2

16대부터 19대까지 대통령 취임사는 다음 웹사이트에서 받아올 수 있다. 이를 바탕으로 Word2Vec 분석을 구현해 본다.

3.1. 텍스트 인코딩 확인

텍스트 데이터가 있다면 아마도 가장 먼저 작업해야 되는 사항은 인코딩을 확인하는 작업이다. readr 팩키지 guess_encoding() 함수를 통해 각 대통령별 연설문 인코딩을 확인하면 UTF-8이다. 그리고 불필요한 공백이 들어간 줄을 제거하여 전처리 작업을 수행한다.

guess_encoding("data/president/문재인_대통령.txt", n_max=100)
# A tibble: 1 x 2
  encoding confidence
     <chr>      <dbl>
1    UTF-8          1
guess_encoding("data/president/박근혜_대통령.txt", n_max=100)
# A tibble: 1 x 2
  encoding confidence
     <chr>      <dbl>
1    UTF-8          1
guess_encoding("data/president/이명박_대통령.txt", n_max=100)
# A tibble: 1 x 2
  encoding confidence
     <chr>      <dbl>
1    UTF-8          1
guess_encoding("data/president/노무현_대통령.txt", n_max=100)
# A tibble: 1 x 2
  encoding confidence
     <chr>      <dbl>
1    UTF-8          1
moon_19_txt <- readLines("data/president/문재인_대통령.txt", encoding = "UTF-8")
moon_19_txt <- moon_19_txt[which(moon_19_txt != "")]

park_18_txt <- readLines("data/president/박근혜_대통령.txt", encoding = "UTF-8")
park_18_txt <- park_18_txt[which(park_18_txt != "")]

lee_17_txt <- readLines("data/president/이명박_대통령.txt", encoding = "UTF-8")
lee_17_txt <- lee_17_txt[which(lee_17_txt != "")]

roh_16_txt <- readLines("data/president/노무현_대통령.txt", encoding = "UTF-8")
roh_16_txt <- roh_16_txt[which(roh_16_txt != "")]

3.2. 토큰화 과정

tokenizers 팩키지에 포함된 적당한 tokenize_ 계열 함수를 사용하여 문장을 토큰으로 잘라 놓는다.

# 2. 토큰화 과정 ----------------------------------------

moon_19_token <- tokenize_words(moon_19_txt)
park_18_token <- tokenize_words(park_18_txt)
lee_17_token  <- tokenize_words(lee_17_txt)
roh_16_token  <- tokenize_words(roh_16_txt)

3.3. word2vec 첫걸음

대통령 모두의 취임사가 담긴 디렉토리 datad의 텍스트를 하나로 모은다. 그리고 나서 train_word2vec 명령어를 실행시켜 word2vec 모형을 생성시킨다. 즉 벡터 20개로 단어를 벡터공간에 재배열시킨다.

# 3. Word2Vec  ----------------------------------------

prep_word2vec(origin="data/president", destination="data/president/president_speech.txt", lowercase=TRUE, bundle_ngrams=2)

word2vec_model <- wordVectors::train_word2vec(
    train_file = "data/president/president_speech.txt", output_file = "model/president_speech_20.bin",
    vectors = 20, window = 10, threads = 2,  min_count = 3)

word2vec_model

word2vec_model[["국민"]]

word2vec_model %>% 
   wordVectors::nearest_to(vector = word2vec_model[["국민"]], n = 10)

word2vec_model %>% 
    wordVectors::nearest_to(vector = word2vec_model[[c("민주", "국민")]], n = 10)

wordVectors::plot(
    x = word2vec_model,
    y = word2vec_model[[c("국민", "민주")]]
)

  1. GloVe vs word2vec revisited

  2. “An R package for creating and exploring word2vec and other vector models”を試す(+ GloVeと比較)