텍스트 정제 작업
1. tm라이브러리 설치 및 임포트 / 데이터 불러오기
# tm라이브러리 설치 및 임포트
install.packages("tm")
library(tm)
# 데이터 불러오기
data <- readLines("C:/data/Mommy_I_love_you.txt")
data
class(data)
2. VCorpus
: 텍스트 문서 -> corpus 변환하는 함수
corp1 <- VCorpus(VectorSource(data))
corp1
class(corp1)
summary(corp1) # 각각의 라인이 문서 / 9개의 문서가 만들어졌다.
# 라인 하나(문서 하나) 내용 확인하기
corp1[[1]]
corp1[[1]]$meta
corp1[[1]]$content
# meta정보 변경
meta(corp1[[1]],tag="author") <- "Happymeal"
corp1[[1]]$meta
3. TermDocumentMatrix
- 행이 Term(단어)이고 열이 Document(문서)인 행렬
- 전체 문서들중에 단어만 뽑아내서 단어는 행으로 표현, 열은 문서 번호로 표현해서 이 단어는 어느 문서에 있었다라고 표현
- 단어를 추출한 뒤 행에 출현했던 단어 리스트를 나열하고 열에 각 문서들을 나열한 행렬을 만든다.
tdm <- TermDocumentMatrix(corp1)
tdm
☞ Non-/sparse entries: 56/277
☞ Sparsity : 83% # 83%의 cell이 0의 빈도수를 갖는다는 의미 # 277/333 * 100 sparse data : 전체 공간에 비해 데이터가 있는 공간이 매우 협소한 데이터를 의미한다. dense data : 전체 공간에 비해 데이터가 있는 공간이 빽빽하게 차있는 데이터를 의미한다.
☞ Maximal term length: 10 # 가장 긴문자수를 갖는 단어의 문자수 |
rownames(tdm) # 공백문자를 기준으로해서 단어가 나뉘었다. 단어 목록 확인
colnames(tdm) # 문서 목록 확인
tdm$nrow # 단어의 수 확인
tdm$ncol # 문서의 수
tdm$dimnames # 단어 목록, 문서 목록을 같이 확인할 수 있다.
tdm$dimnames$Terms
tdm$dimnames$Docs
# inspect() : 데이터 요약과 실제 데이터 일부분 출력
inspect(tdm)
# 실제 데이터 출력
as.matrix(tdm)
4. tm_map
- 문서에 함수를 적용하여 변환한다.
- 텍스트 정제작업을 한꺼번에 처리할 수 있다.
1) stripWhitespace() : 여러개의 공백을 하나의 공백으로 변환하는 함수
# tm_map 미사용 library(stringr) corp1[[1]]$content corp1[[1]]$content <- str_replace_all(corp1[[1]]$content,"[[:space:]]{2,}"," ") corp1[[1]]$content |
|
# tm_map 사용 corp2 <- tm_map(corp1,stripWhitespace) corp2[[2]]$content |
2) removeNumbers() : 숫자를 제거
# tm_map 미사용 corp1[[1]]$content corp1[[1]]$content <- str_replace_all(corp1[[1]]$content,"[[:digit:]]{2,}","") corp1[[1]]$content |
|
# tm_map 사용 corp2[[1]]$content corp2 <- tm_map(corp1,stripWhitespace) corp2[[1]]$content |
3) removePunctuation() : 특수문자 제거
# tm_map 미사용 corp1[[9]]$content gsub('~','',corp1[[9]]$content) gsub('~','',corp1) # 난리남,적용안됨 |
|
# tm_map 사용 corp2[[9]]$content corp2 <- tm_map(corp2,removePunctuation) corp2[[9]]$content |
|
# tm_map에서 gsub 사용하기 tm_map(corp1,gsub('~','',corp1)) # 실행안됨. 변환작업이 필요함 corp1 <- tm_map(corp1,content_transformer(function(x) gsub('~','',x))) corp1[[9]]$content
corp1 <- tm_map(corp1,content_transformer(function(x) gsub('\\^','',x))) corp1 <- tm_map(corp1,content_transformer(function(x) gsub("I'm",'I am',x))) corp1 <- tm_map(corp1,content_transformer(function(x) gsub("\\$",'',x))) corp1[[9]]$content
toString <- content_transformer(function(x,from,to) gsub(from,to,x)) corp1 <- tm_map(corp1, toString, "[[:punct:]]","") corp1[[9]]$content |
5. stopwords
# 기본으로 제공하는 불용어 확인
stopwords()
# 불용어 추가하기
stopword2 <- c()
stopword2 <- c(stopwords('en'),'and','but','not')
stopword2
# removeWords : 단어 제거
# 원본 tdm1 <- TermDocumentMatrix(corp2) |
|
# 불용어 제거 corp2 <- tm_map(corp2,content_transformer(function(x) tolower(x))) corp2 <- tm_map(corp2,removeWords,stopwords('en')) corp2 <- tm_map(corp2,removeWords,stopword2) 또는 corp2 <- tm_map(corp2,removeWords,c('and','but','you'))
tdm2 <- TermDocumentMatrix(corp2) as.matrix(tdm2) |
텍스트 정제 작업 이후
1) 단어 빈도수 합 구하기
m2 <- as.matrix(tdm2)
freq1 <- sort(rowSums(m2),decreasing=T)
head(freq1,10)
2) 특정 횟수 이상 언급된 단어들만 출력
findFreqTerms(tdm2)
findFreqTerms(tdm2,2)
findFreqTerms(tdm2,3)
3) 워드클라우드 띄우기
library(wordcloud)
library(wordcloud2)
library(RColorBrewer)
palete <- brewer.pal(7,"Set3")
# 데이터(freq1) 안의 모든 단어 출력 wordcloud(names(freq1)) |
|
# 잘못나온것(전부다 나오지 않음) wordcloud(names(freq1),freq = freq1) |
|
# scale : 워드클라우드 전체 크기 wordcloud(names(freq1),freq = freq1, scale = c(5,1),min.freq = 1) |
|
# colors : 색상 넣기 wordcloud(names(freq1),freq = freq1, scale = c(5,1),min.freq = 1, colors=palete) |
|
# wordcloud2은 데이터프레임 형식으로 넣어야 한다. df <- data.frame(freq1) wordcloud2(data.frame(rownames(df),df$freq1)) |
4) 막대그래프로 만들기
barplot(freq1,las=2,horiz=T)
5) 문서별로 연관있는 단어 구하기
m2 %*% t(m2)
총 정리겸 연습
# txt 데이터 한줄씩 읽어들이기 data <- readLines("C:/data/취임사.txt") data |
|
# 벡터 -> corpus 형태로 변환 corp1 <- VCorpus(VectorSource(data)) corp1 |
|
# 내용 대략적으로 확인 inspect(corp1) |
|
# 숫자, 특수문자 제거 corp2 <- tm_map(corp1,removeNumbers) corp2 <- tm_map(corp2,removePunctuation) |
|
# KoNLP 라이브러리 임포트 Sys.setenv(JAVA_HOME="C:\\Program Files\\Java\\jdk1.8.0_102") library(KoNLP) |
|
# SejongDic을 사용한다. useSejongDic() |
|
# 데이터 출력 한도 설정 options(max.print = 100000) |
|
# extractNoun를 사용하여 명사만 뽑기 ko.words <- function(doc){ d <- as.character(doc) extractNoun(d) } |
|
# 확인 tdm <- TermDocumentMatrix(corp2, control=list(tokenize=ko.words)) as.matrix(tdm) |
|
# 두 글자 이상인 단어만 뽑아내기 tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words,wordLengths=c(2,Inf))) as.matrix(tdm) |
|
# SimplePos09를 사용하여 명사만 뽑기 ko.words <- function(doc){ d <- as.character(doc) pos <- paste(SimplePos09(d)) extracted <- str_match(pos,"([가-힣]+)/[N]")[,2] extracted[!is.na(extracted)] }
|
|
# 확인 tdm <- TermDocumentMatrix(corp2, control=list(tokenize=ko.words)) as.matrix(tdm)
|
|
# 두글자이상인 단어만 뽑아내기 tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words,wordLengths=c(2,Inf))) as.matrix(tdm)
|
|
# 빈도수를 구하고 정렬 m <- as.matrix(tdm) freq1 <- sort(rowSums(m),decreasing = T) freq1 |
|
# 데이터프레임 형식으로 변환 df <- data.frame(freq1) df |
|
# 워드클라우드로 출력 wordcloud2(data.frame(rownames(df),df$freq1)) |
|
# TermDocumentMatrix 만들면서 바로 불용어 제거 stop_word <- c("대통령","대통령의","되겠습니","것입니") tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words, wordLengths=c(2,Inf), stopwords=stop_word)) m <- as.matrix(tdm) freq1 <- sort(rowSums(m),decreasing = T) df <- data.frame(freq1) wordcloud2(data.frame(rownames(df),df$freq1)) |
'컴퓨터 > R' 카테고리의 다른 글
R - 크롤링 연습 ③ (0) | 2020.05.04 |
---|---|
R - RSelenium, xlsx 사용 (0) | 2020.04.28 |
R - 크롤링 연습 ② (0) | 2020.04.27 |
R - 크롤링 연습 ① (0) | 2020.04.27 |
R - 크롤링 (0) | 2020.04.27 |