본문 바로가기
공부/R & Python

16-3. 웹문서 텍스트마이닝 - 한글 웹문서의 자연어 처리와 정보 추출 -

by 드인 2020. 3. 6.

16-3. 웹문서 텍스트마이닝

- 한글 웹문서의 자연어 처리와 정보 추출 -


1) 텍스트 마이닝

- 텍스트 마이닝(text mining)이란, 다양한 알고리즘을 이용하여 대용량의 텍스트 문서로부터 트렌드와 관심어를 찾아내는 기법이다.

2) 자연어 처리

- 자연어 처리(Natural Language Processing)란,

 컴퓨터로 사람 언어를 분석, 이해, 생성하는 기술을 일컫는다.

- 품사 분석 : SimplePos09()

 

- str_match()를 이용한 N(체언), P(용언) 추출

3) 워드 클라우드

- 워드 클라우드(word cloud)는 텍스트의 키워드, 개념을 직관적으로 파악하도록 핵심 단어를 시작적으로 보여주는 기법이다.

 

4) 웹문서의 텍스트마이닝 실습

(1) '네이버 영화'에서 영화 <머니볼>의 네티즌 140자 평을 '크롤링'한다.

(2) '단어-문서 행렬'을 산출한다.

(3) 출현 빈도가 높은 단어들의 '워드 클라우드'를 생성한다.

(4) 단어 사이의 상관관계를 보여주는 '동시 발생 행렬'을 산출한다.

(5) 동시 발생 행렬을 바탕으로 단어들의 '네트워크'를 생성한다.

 

- 패키지 설치

install.packages("xml2") # to read html
install.packages("rvest") # to use 'html_nodes'
install.packages("KoNLP") # korean natural language processing
install.packages("tm") # corpus, term-document matrix, etc. 정보추출 도구
install.packages("stringr") # to use 'str_match' string 처리
install.packages("wordcloud") # word cloud
# install.packages("qgraph") # qgraph of co-occurence matrix  네트워크

 

- 인코딩(UTF-8)방식 변경 (한글 인코딩)

Tools_Global options 메뉴에서 Code_Saving으로 가서 UTF-8로 변경

 

- 크롤링(crawling)

- 웹페이지를 그대로 가져와서 데이터를 추출해 내는 행위이다.

- 데이터를 개인 하드에 소장하는 것은 합법이나, 배포는 불법이다.

 

- 네이버 영화 <머니볼> 네티즌 140자 평

url_base <- 'http://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=51786&type=after&isActualPointWriteExecute=false&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false&page='

 

네이버 영화

지금까지 본 최고의 야구 영화. 훌륭한 각본과 브래드 피트의 중압감있는 연기. 브래드 피트: 그는 최고였다. tang**** 2013.06.26 20:34 신고

movie.naver.com

# 크롤링 대상 URL

 

reviews <- c()
# 140자평 저장 벡터

for(page in 1:10){
  url <- paste(url_base, page, sep='') # from page 1 to 70 1~10페이지까지 데이터 수집
  htxt <- read_html(url)
  comment <- html_nodes(htxt, 'div')%>%html_nodes('div.input_netizen')%>%
    html_nodes('div.score_result')%>%html_nodes('ul')%>%html_nodes('li')%>%
    html_nodes('div.score_reple')%>%html_nodes('p') # exact location of comments 140자평 위치
  review <- html_text(comment) # extract only texts from comments 실제 리뷰 text 파일만 추출
  review <- repair_encoding(review, from = 'utf-8') # repair faulty encoding 인코딩 변경
  review <- str_trim(review) # trim whitespace from start and end of string 앞뒤 공백 문자 제거
  reviews <- c(reviews, review) # save results 결과값 저장
}

 

6) 자연어 처리

- 용언, 체언 추출 function

ext_func <- function(doc){
  doc_char <- as.character(doc)
  ext1 <- paste(SimplePos09(doc_char))          # 품사 분석
  ext2 <- str_match(ext1, '([A-Z가-힣]+)/[NP]')  # 용언, 체언 선택
  keyword <- ext2[,2]
  keyword[!is.na(keyword)]                           # NA 값 제외
}

 

7) 정보 추출

- 단어-문서 행렬

corp <- Corpus(VectorSource(reviews)) # generate a corpus 말뭉치(corpus) 생성

tdm <- TermDocumentMatrix(corp, # generate a term-document matrix 용어-문서 행렬 산출
                          control=list(
                            tokenize=ext_func,
                            removePunctuation=T,
                            removeNumbers=T,
                            wordLengths=c(4,8)))

tdm_matrix <- as.matrix(tdm) # save as a matrix 행렬로 변환
Encoding(rownames(tdm_matrix)) <- "UTF-8" # encoding 인코딩

word_count <- rowSums(tdm_matrix) # sum of term frequencies of each word 각단어별 총출현빈도 계산
word_order <- word_count[order(word_count, decreasing=T)] # sort in descending order 내림차순 정렬

doc <- as.data.frame(word_order) # save as a data frame 데이터 프레임으로 변환

 

8) 워드 클라우드 구현

- wordcloud() 함수

library(wordcloud)

windowsFonts(font=windowsFont("맑은 고딕")) # set font

set.seed(1234) # 동일한 워드 클라우드 생성 (난수 고정)


wordcloud(words=rownames(doc),    # 키워드

               freq=doc$word_order,     # 빈도

               min.freq=2,                   # 최소 출현 빈도
               max.words=100,             # 출력 키워드 수

               random.order=FALSE,      # 고빈도 키워드 중앙 배치

               scale=c(5,1),                  # 키워드 크기 범위

               rot.per=0.35,                 # 회전 키워드 비율 
               family="font", colors=brewer.pal(8,"Dark2"))

 

9) 고급 텍스트 마이닝