Day 43. Learning review│폭탄 터졌ㄷr...💣💣💣

2021. 7. 15. 21:28📸 기자 교육/Learning review

[ 210715(목)│서준영 선생님_텍스트 마이닝을 활용한 기사쓰기 day 2. 데이터 구조와 빈도수 분석 ]

<한국잡지교육원_취재기자20기_주하은>


#오전_실습
#실습용_기사로_워드클라우드_만들기

(* 볼드체 부분만 실제 적용된 코드!)

#먼저 패키지 설치하기
#Natural language processing (자연어 처리)
install.packages('NLP')
#text mining
install.packages('tm')
#visualizing (시각화)
install.packages('wordcloud')
#color displaying
install.packages('RColorBrewer')
#다 쓴 코드 앞에 "#" 붙여두기!

#확인용 실행하기 -> library(데이터)
library(NLP)
library(tm)
library(wordcloud)
library(RColorBrewer)
#대소문자 구분 잘하기!

#######################################

#20 new articles from Reuter - 21578 data set
#연습용 기사 데이터 불러오기
data(crude)

#crude[[1]][1] #데이터탐색하기
#[[]]]번째 폴더의 []번째 항목인 기사의 내용 불러오기
#<Ex.> 5번째 폴더의 기사 불러오기 crude[[5]][1]

#crude 데이터의 기사번호 708의 기사 출력
crude[[20]][1]

#데이터에 대한 설명 보기(오른쪽 아래 창)
help(crude)

#구조 #crude폴더의 1번째 폴더 기사에 대한 구조를 보여달라는 코드 (structure의 줄임말)
str(crude[[1]])
#내용 #컨텐츠만 보고싶을 때
content(crude[[1]])
#정보
meta(crude[[1]])
#글자 수, 내용 탐색
inspect(crude[[1]])

#여러 개를 한 번에 확인하고 싶을 때
inspect(crude[1:20])
#내용은 표기되지 않아도 정보는 한꺼번에 확인 가능!

#크루드 데이터의 모든 콘텐츠(내용)를 한번에 보기
lapply(crude, cpntent)
엘 어플라이 → 전에에 적용시키는 느낌

#전처리
#1. remove punctuation(문장기호) in document
#1. 문장부호 없애기
crude1 <- tm_map(crude, removePunctuation)
#60개 정도의 문장부호가 사라진 것을 확인할 수 있음!
#(참고) 1.50 -> 150이 되어버리는 참사를 방지하기 위해, 원래 일반적으로 숫자는 제외시킨다.

#실행 후 확인작업
inspect(crude[[1]])
inspect(crude1[[1]])

#2. remove numbers
crude2 <- tm_map(crude1 , removeNumbers)
inspect(crude[[2]])
inspect(crude2[[2]])

#3. remove stopwords(불용어)
stopwords() crude3 <- tm_map(crude2, function(x) removewords(x, stopwords()))
inspect(crude[[1]])
inspect(crude3[[1]])
#stopword의 W가 대문자인 점 주의!

#4. construct term-document matrix
tdm <- TermDocumentMatrix(crude3)
inspect(tdm)

#5. read tdm as a matrix
m <- as.matrix(tdm)
#오른쪽 창의 num [1:962, 1:20]의 의미는 962개의 단어와 20개의 문서가 있다는 의미

#6. sorting in high frequency to low frequency
v <- sort(rowSums(m), decreasing = TRUE)
v[1:10]

#7. match with freq and word names (빈도분석표 생성)
d <- data.frame(이름=names(v), 빈도=v)

#d라는 데이터 프레임 안의 바꾸고 싶은 위치를 찾아서 [수,수]
#표의 구성 항목을 원하는대로 변경
d[1,2] <- 100
d[3.2] <- 50
d$word
d$freq

#8. 시각화
#wordcloud(d$이름, d$빈도, c(8,.5),2,,FALSE,.1)
wordcloud(d$이름, d$빈도)

▲ 워드클라우드만 만들면 자꾸 폭탄이 터져서 2번이나 다시했다 ^~^!!🔥🔥🔥│그리고 힘들게 완성한 완성본 ▲


#오후_실습
#내가_가져온_영어기사로_만들기

#먼저 설치할 것들!
install.packages('tm')
install.packages('wordcloud')
install.packages('RColorBrewer')
install.packages('SnowballC')
install.packages('tidyverse')

#패키지 실행 확인!
library(tm)
library(wordcloud)
library(RColorBrewer)
library(SnowballC)
library(tidyverse)

#######################################

#option start options(encoding = 'UTF-8')
#영어 기사 긁어오기 #저장시UTF-8로 하고 #제목도 영어로 저장할 것

#load files (편한 방식으로 파일 가져오기)
text <- read_lines(file.choose()) #chr [1:119] means 119줄짜리!

#빠른 파일 불러오기 (파일 위치 직접 입력하기)
#오른쪽 아래 창의 Files-홈버튼에 나오는 곳은 얘가 어디를 홈으로 인식하는지 보여준다. 여기서는 "문서"일 것!
#text1 <- read_lines('fruit from wikipedia.txt')
text <- read_lines('tart and pie from wikipedia.txt')

#내가 가져온 119줄을 리스트로 만들기
docs <- Corpus(VectorSource(text))

inspect(docs[[1]]) inspect(docs[[3]])

#특이한 문장부호 없애는 코드
toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")
#부호 "\"는 백스페이스 아래에 있고, |는 \와 쉬프트를 함께!

#Convert the text to lower case 모든 글자를 소문자로 바꾸기
docs <- tm_map(docs, content_transformer(tolower))
#잘 적용됐는지 확인! [[안에]] 줄 숫자 넣기
inspect(docs[[3]])

#number, punctuation, stopwords
docs <- tm_map(docs, removeNumbers)
inspect(docs[[11]])
docs <- tm_map(docs, removePunctuation)
inspect(docs[[11]])
docs <- tm_map(docs, removeWords, stopwords("english"))
#removeWords는 W가 대문자고, stopwords는 w가 소문자!
inspect(docs[[11]])

#빈공간 없애서 용량 줄이기 #대소문자 주의!!!
docs <- tm_map(docs, stripWhitespace)
inspect(docs[[11]])

#행은 단어, 열은 문서인 행렬을 만들어서 횟수를 적어주는 기능
tdm <- TermDocumentMatrix(docs)
#매트릭스 형태로 바꾸기 (이렇게 해야 클릭해서 보기 가능!)
m <- as.matrix(tdm)
#정렬하기 (내림차순)
v <- sort(rowSums(m), decreasing = TRUE)
#너무 많을 때, 앞의 n개만 볼 수 있게 하는 코드 : head(v,숫자)
#원하는 숫자만큼 앞에서부터 표시
head(v, 10)

d <- data.frame(word = names(v), freq = v)

#워드클라우드 만들기
wordcloud(words = d$word, freq = d$freq, min.freq = 3, random.order = FALSE, rot.per = 0, colors = brewer.pal(8,"Dark2"))
#여기서 min.freq = 3 의 의미는, 3번 이상 나온 단어를 보여달라는 의미!
#여기서 random.order = FALSE 의 의미는, 중앙에 나오게 하려면 false! 아무대나 있어도 된다면 true
#여기서 rot.per = 0 의 의미는, 단어가 수평으로 나오게 하기 위해!
  1로 하면 세로로, 0.5로 하면 반은 세로, 반은 가로로 나옴!

#3행 2열을 원하는 숫자로(3) 수정
#d[3,2] <- 3
#d[1,]
#d[2,]

#제거를 희망하는 줄의 번호를 입력
#d <- d[-2,] #2번줄 제거
#d <- d[-(9:11),] #9~11까지 제거
#원하는 부분만 골라서 제거하기
#d <- d[-c(1,3,5),] #1,3,5번 제거

wordcloud(words = d$word, freq = d$freq, min.freq = 3, random.order = FALSE, rot.per = 0.1, colors = brewer.pal(8,"Dark2"))

install.packages('writexl')
library("writexl")

#표를 엑셀 파일로 내보내기 #write_xlsx(데이터프레임 이름, "저장할 파일 이름.xlsx")
write_xlsx(d,"data.xlsx")


#오늘의_결과물
#영문기사_워드클라우드

#워드 클라우드의 활용

예를 들어 어떤 도시에 대해 어떤 것을 주제로 잡아 기사를 써야 할지 모를 때,
데이터를 전부 긁어서 워드클라우드로 만들어놓고 볼 수 있다. 결과를 보며 회의를 해도 좋을 것 같다.
혹은 기사에 워드클라우드 자체를 실을 때나, 설문조사 결과를 나타낼 때, 제안서에 첨부 시,
발표에 근거 자료로도 활용하면 좋을 것 같다.

#기타_참고사항

▷ ""큰따옴표나 _ _ _ _ 이런 건 폰트마다 걸러지는 게 다르다.
▷ 유니그램과 바이그램의 차이
   ㄴ예시) 한글 텍스트 마이닝을 위한 추가 패키지 설치
* 유니그램(Unigram) → 유니그램에서는 하나씩 끊어서 본다.
  <Ex.> 한글/텍스트/마이닝
* 바이그램(Bigram) → 문장이 있으면 두개씩 끊어서 본다.
  <Ex.> 한글 텍스트 / 텍스트 마이닝 / 마이닝을 위한 / 위한 추가