덴하덴하~
최근에 참여하고 있는 프로젝트에서 안과 판독문을 가지고 text mining을 하고 있는데요 안과 fundus photo는 뭐 이쪽 분야에서 google이 한번 달려들어서 우리 전세계인 모두가 달려들고 있쥬??
그건 그렇고 text mining의 t자도 모르는 본인이 어떻게 text mining을 해보겠어유 data camp로 떠나야지 ㅎ; data camp에 Text mining with R 코스가 있어서 한번 해봤슈
그럼 같이 data camp로 떠나 볼까유??!!
https://www.datacamp.com/courses/intro-to-text-mining-bag-of-words
text mining을 하기 위해서는 우선 data를 가져 와야겠쥬
그리고 corpus라는 형태로 만들어 줘야 해요
그러기 위해서 사용되는 packages = 'qdap', 'tm' 이에유
# make corpus source scr
```{r}
library(qdap)
library(tm)
dm <- read.csv("D:/google/workground/datasea/original/df_epi/dm_total_epi.csv", fileEncoding = "utf-8")
#dm_source <- dm[,c(1,6)]
#dm_source$exam_result <- substring(dm_source$exam_result, 17)
#head(dm_source)
#str(dm_source)
#dm_source$exam_result[which(is.na(dm_source$exam_result))] <- "NULLVALUE"
```
Corpus형태로 만들기 위해서는 우선 vector화를 거친후 VCorpus를 이용해야 해유
dm_Vec <- VectorSource(dm_source_rl$exam_result)
dm_Vec[1:10]
dm_corpus <- VCorpus(dm_Vec)
dm_corpus
Corpus형태로 만들었다면 간단한 cleaning 과정을 거칠거예유 puctuation, stopwords, wgitespace 를 제거해주는 작업을 할 겁니다.
clean_corpus <- function(x) {
x <- tm_map(x, removePunctuation)
x <- tm_map(x, removeWords, words = c("기본안저촬영", "양측", "종합검진센터용", "양측종합검진센터용", "양측종합검진센터", "ro", "RO", "CD", "cd"))
x <- tm_map(x, stripWhitespace)
return(x)
}
dm_corpus_cl <- clean_corpus(dm_corpus)
dm_tdm <- TermDocumentMatrix(dm_corpus)
그리고 단어들의 frequency들을 한번 봐 봅세다.
# freq tdm
```{r}
dm_tdm
dm_m <- as.matrix(dm_tdm)
dim(dm_m)
dm_freq <- rowSums(dm_m)
dm_freq <- sort(dm_freq, decreasing = T)
dm_freq
```
이번에는 Corpus 형태화 할 필요없이 Text에서 바로 frequency들을 plot을 통해 보는 방법이에유 나름 제대로 textmining에 들어가기 앞서 term들을 파악하기에 좋은 방법이에유
# freq 2 no tdm
```{r}
freq_dm_2 <- freq_terms(
dm_source_rl$exam_result,
top = 40,
stopwords = c(stopwords("en"), "normal", "ou")
)
plot(freq_dm_2)
```
그럼 visualization을 시작해 볼까요 term의 빈도수에 따라 같이나오는 확률에 따라 cloud를 그려주는 package를 통해 한번 그려 봤어유
#wordcloud
```{r}
library(wordcloud)
dm_term_vec <- names(dm_freq)
dm_term_vec
wordcloud(dm_term_vec, dm_freq, max.words = 50, color = "red")
```
이번에는 기본 wordcloud 골자에 추가적인 잡기술을 추가해 봤어유
#wordcloud
```{r}
install.packages(viridisLite)
library(viridisLite)
color_pal <- cividis(n = 5 )
wordcloud(freq_dm_2$WORD,
freq_dm_2$FREQ,
max.words = 50,
colors = color_pal)
```
이번에는 계층적 구조를 확인해 볼거에유 dendrogram을 통해서 말이죠 dendrogram에 대한 자세한 개념은 구글에서 찾아봐유 대충 최하위부터 두개 묶여있으면 같은 계층에 있다는 거에유
removeSparseTerms를 해주는 이유는 단어들이 너무 많으면 저거 못그려유 그래서 단어들을 제거해 줄건데 sparse = 1 에 가까우면 단어들을 많이 살리는 거구유 0에 가까우면 단어들을 없애는 거예유 보통 25 ~65 사이가 좋다고 하던데 걍 보기 좋게 뽑아서 써유
#dendrogram
```{r}
dm_tdm <- TermDocumentMatrix(dm_corpus)
dim(dm_tdm)
dm_tdm
dm_tdm_t1 <- removeSparseTerms(dm_tdm, sparse = 0.995)
dm_tdm_t1
dm_tdm_t1_m <- as.matrix(dm_tdm_t1)
dm_tdm_dist <- dist(dm_tdm_t1_m)
dm_tdm_dist
hc_dm <- hclust(dm_tdm_dist)
hc_dm
plot(hc_dm)
```
저 봐봐유 추가적으로 잡기술을 원하는 특정 term에 알록달록 색을 칠할 수 있네유
#dendrogram more skill
```{r}
library(dendextend)
hcd_dm <- as.dendrogram(hc_dm)
labels(hcd_dm)
hcd_colored_dm <- branches_attr_by_labels(hcd_dm, c("hazy", "erm", "hemorrhage", "백내장", "녹내장", "매체혼탁", "기저질환"), "red")
plot(hcd_colored_dm, main = "dm center")
```
마지막으로 term 간의 association을 볼거에유 findAssocs funtion을 통해 x data에서 "hemorrhage" term에 관련된 단어들 중 0.2 이상인 단어들을 뽑아줘 라는 말이구요 score 즉 x축은 hemorrhage가 등장할때 같이 등장하는 빈도수에요 score가 0.5면 hemmorrhage가 2번 나올때 1번 같이 등장한 셈이쥬
#word association
```{r}
dim(dm_tdm)
associ_dm <- findAssocs(dm_tdm, "hemorrhage", 0.2)
associ_dm
library(ggplot2)
associ_df_dm <- list_vect2df(associ_dm, col2 = "word", col3 = "score")
ggplot(associ_df_dm, aes(score, word)) +
geom_point(size = 3) +
ggtitle("dm center hemorrhage")
```
지금까지 text mining 무작정 따라하기를 해봤슈 수고했슈