R(quanteda)을 통한 텍스트 구문 분석
이 보도에 관하여
이것은 quanteda와 RcppMeCab의 텍스트 발굴을 사용한 예googledrive로 자신의 글을 분석한 과거 보도를 참조하십시오Qita 로그(revision/10).
또한 아래의 포장은 이곳에서 GiitHub에서 설치할 수 있습니다.
데이터 준비
뉴스 자료 라이브러리를 텍스트 데이터로 사용합니다.다음 9개의 카테고리.
data <- ldccr::read_ldnws(exdir = "cache")
#> Parsing dokujo-tsushin...
#> Parsing it-life-hack...
#> Parsing kaden-channel...
#> Parsing livedoor-homme...
#> Parsing movie-enter...
#> Parsing peachy...
#> Parsing smax...
#> Parsing sports-watch...
#> Parsing topic-news...
#> Done.
그 중 일부를quanteda의 어료 라이브러리 대상으로 저장하고 다양한 시도를 한다.corp <- data %>%
dplyr::sample_frac(size = .2)
corp <- corp %>%
dplyr::pull("body") %>%
stringr::str_remove_all("[\u25a0]+") %>%
audubon::strj_normalize() %>%
RcppMeCab::posParallel(format = "data.frame") %>%
tidyr::drop_na() %>%
audubon::pack() %>%
dplyr::bind_cols(corp) %>%
quanteda::corpus()
문자운
정지어로 사용하다
rtweet::stopwordslangs
.topwords <- rtweet::stopwordslangs %>%
dplyr::filter(lang == "ja") %>%
dplyr::filter(p >= .98) %>%
dplyr::pull(word)
corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_group(groups = category) %>%
quanteda::dfm_trim(min_termfreq = 10L) %>%
quanteda.textplots::textplot_wordcloud(color = viridis::cividis(8L))
출현 빈도 합계
corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_weight("prop") %>%
quanteda.textstats::textstat_frequency(groups = category) %>%
dplyr::top_n(-30L, rank) %>%
ggpubr::ggdotchart(
x = "feature",
y = "frequency",
group = "group",
color = "group",
rotate = TRUE
) +
ggplot2::theme_bw()
Keyness
나는 IT 생활 해커
it-life-hack
팀의 문서와 다른 비교를 보고 있다.corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_group(groups = category) %>%
quanteda.textstats::textstat_keyness(target = "it-life-hack") %>%
quanteda.textplots::textplot_keyness()
대응 분석
모든 그림을 그리면 붕괴가 보이지 않기 때문에 일부분만 추출합니다.
corp_sample <- quanteda::corpus_sample(corp, size = 32L)
corp_sample %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_weight(scheme = "prop") %>%
quanteda.textmodels::textmodel_ca() %>%
quanteda.textplots::textplot_scale1d(
margin = "documents",
groups = quanteda::docvars(corp_sample, "category")
)
공유 네트워크
공기망이 비교적 큰 텍스트 집합이면 붕괴가 보이지 않기 때문에 대응 분석과 같은 어료 라이브러리를 그려보려고 합니다.
corp_sample %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_group(groups = category) %>%
quanteda::dfm_trim(min_termfreq = 20L) %>%
quanteda::fcm() %>%
quanteda.textplots::textplot_network()
클러스터
맨해튼 거리.여기도 일부분만 추출합니다.
d <- corp_sample %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_weight(scheme = "prop") %>%
quanteda.textstats::textstat_dist(method = "manhattan") %>%
as.dist() %>%
hclust(method = "ward.D2") %>%
ggdendro::dendro_data(type = "rectangle") %>%
purrr::list_modify(
labels = dplyr::bind_cols(
.$labels,
names = names(corp_sample),
category = quanteda::docvars(corp_sample, "category")
)
)
ggplot2::ggplot(ggdendro::segment(d)) +
ggplot2::geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) +
ggplot2::geom_text(ggdendro::label(d), mapping = aes(x, y, label = names, colour = category, hjust = 0), size = 3) +
ggplot2::coord_flip() +
ggplot2::scale_y_reverse(expand = c(.2, 0)) +
ggdendro::theme_dendro()
LDA(Latent Dirichlet Allocation)
LDA
quanteda::convert
와 관련해서도 dfm를 전환해 직접 전달topicmodels::LDA
할 수 있다.공식빠른 시작 설명서을 참고하세요.weighted LDA 등의 구현keyATM을 포함하는 선택지도 있다.또 화제 수는 9로 정했다.테마 수를 포함한 파라미터를 검색하려면 ldatuning나 stm 등을 사용하는 것이 좋다.
dtm <- corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::dfm_tfidf()
features <- corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
quanteda::tokens_remove(stopwords, valuetype = "fixed") %>%
quanteda::dfm() %>%
quanteda::ntoken()
m <- dtm %>%
as("dgCMatrix") %>%
textmineR::FitLdaModel(k = 9, iterations = 200, burnin = 175)
m$phi %>%
textmineR::GetTopTerms(15L) %>%
knitr::kable()
t_1t_2
t_3
t_4
t_5
t_6
t_7
t_8
t_9
당선되다
살결
골프
홀로
직장을 옮기다
소프트웨어
스크린
한국어 공부 해요.
운동원
메달
빙그레 웃다
교과 과정
남성.
자전거.
통화
기능
게시판
시합
역할
치즈 치즈
손자
결혼하다.
직원 모집
docomo
나타내다
한
야촌
연출자
도시와 읍
합계
검푸르다
로고
단말기
탑재
후지 텔레비전 방송국
축구
액션
향기
연습하다
묻다
연수입
커뮤니케이션
대응
피라미드
올림픽 경기
공연하다
과 신사
꽃가루
점치다
전시
업데이트
docomo
발언하다
전중
주연
이빨.
브라
사상
다리
활용단어참조
설정
비평하다
대표자
여배우
초밥
수면
우편물
활용단어참조
다운로드
서류
프로그램
본전
문장
버섯.
클럽
남편.
채용하다
인텔리전스
직로
중국 명사
연출자
주인공.
간호하다
짐.
남자
활용단어참조
전화기
개평을 떼다
소택
송정
극장.
초콜릿 쵸콜렛
훈련
친구/친구
패션
서비스
×
소견
안나
우주.
두바이
자세.
외톨이
무대.
휴대폰
약속하다
이벤트
게시판
결정하다.
회의
체중계
작업
합성하다
숫자.
모델
파벌
우승자
개봉
케이크 케이크
골프 선수
활용단어참조
도시.
잇닿다
나타내다
토픽
아이를 어루만지다
공연하다
과자 과자
몸뚱이
세이프티
활용단어참조
소리
조작하다
보다
출장
LDAvis를 사용하여 시각화합니다.다만, LDAvis는 당분간 유지보수되지 않은 포장으로 다소 수상한 행동을 하고 있다.예를 들어 기본 로켈이 CP932인 Windows 환경에서는
LDAvis::createJSON
에 나열된 레이블(vocab)의 인코딩이 드래그되어 CP 932가 생성되므로 브라우저에 레이블이 표시되면 코드가 흐려집니다.썼어.json을 UTF-8로 변환하면 혼란을 없앨 수 있기 때문에 먼저 뒤에서 변환하고 덮어쓰는 것이 좋습니다.suppressWarnings({
LDAvis::createJSON(
phi = m$phi,
theta = m$theta,
doc.length = features,
vocab = stringi::stri_enc_toutf8(dtm@Dimnames$features),
term.frequency = quanteda::colSums(dtm)
) %>%
LDAvis::serVis(open.browser = FALSE, out.dir = file.path(getwd(), "cache/ldavis"))
})
readr::read_lines_raw(file.path(getwd(), "cache/ldavis", "lda.json")) %>%
iconv(from = "CP932", to = "UTF-8") %>%
jsonlite::parse_json(simplifyVector = TRUE) %>%
jsonlite::write_json(file.path(getwd(), "cache/ldavis", "lda.json"), dataframe = "columns", auto_unbox = TRUE)
LDAvis GloVe
이곳은 50차원의 매입을 얻었다.
toks <- corp %>%
quanteda::tokens(what = "fastestword", remove_punct = TRUE) %>%
as.list() %>%
text2vec::itoken()
vocab <- toks %>%
text2vec::create_vocabulary() %>%
text2vec::prune_vocabulary(term_count_min = 10L)
vectorize <- text2vec::vocab_vectorizer(vocab)
tcm <- text2vec::create_tcm(
it = toks,
vectorizer = vectorize,
skip_grams_window = 5L
)
glove <- text2vec::GlobalVectors$new(
rank = 50,
x_max = 15L
)
wv <- glove$fit_transform(
x = tcm,
n_iter = 10L
) %>%
as.data.frame(stringsAsFactors = FALSE) %>%
tibble::as_tibble(.name_repair = "minimal", rownames = NA)
#> INFO [21:04:40.364] epoch 1, loss 0.1814
#> INFO [21:04:42.002] epoch 2, loss 0.1063
#> INFO [21:04:43.651] epoch 3, loss 0.0888
#> INFO [21:04:45.242] epoch 4, loss 0.0785
#> INFO [21:04:46.878] epoch 5, loss 0.0717
#> INFO [21:04:48.460] epoch 6, loss 0.0667
#> INFO [21:04:50.077] epoch 7, loss 0.0629
#> INFO [21:04:51.703] epoch 8, loss 0.0599
#> INFO [21:04:53.328] epoch 9, loss 0.0575
#> INFO [21:04:54.920] epoch 10, loss 0.0554
umap로 차원을 줄여 가시화하다.색깔은 stats::kmeans
집합 (여현 유사도) 이다.pull_layout <- function(tbl) {
umap <- umap::umap(as.matrix(tbl))
layout <- umap$layout
rownames(layout) <- rownames(tbl)
return(as.data.frame(layout))
}
vec <- vocab %>%
dplyr::anti_join(
y = tibble::tibble(words = stopwords),
by = c("term" = "words")
) %>%
dplyr::arrange(desc(term_count)) %>%
dplyr::slice_head(n = 100L) %>%
dplyr::left_join(tibble::rownames_to_column(wv), by = c("term" = "rowname")) %>%
tibble::column_to_rownames("term") %>%
dplyr::select(starts_with("V"))
dist <- proxyC::simil(as(as.matrix(vec), "dgCMatrix"), method = "cosine")
clust <- kmeans(x = dist, centers = 9)
vec <- pull_layout(vec) %>%
tibble::rownames_to_column() %>%
dplyr::mutate(cluster = as.factor(clust$cluster))
vec %>%
ggplot2::ggplot(aes(x = V1, y = V2, colour = cluster)) +
ggplot2::geom_point() +
ggrepel::geom_text_repel(aes(label = rowname)) +
ggplot2::theme_light()
세션 정보
sessioninfo::session_info()
#> - Session info -----------------------------------------------------
#> setting value
#> version R version 4.1.2 (2021-11-01)
#> os Windows 10 x64 (build 19043)
#> system x86_64, mingw32
#> ui RStudio
#> language (EN)
#> collate Japanese_Japan.932
#> ctype Japanese_Japan.932
#> tz Asia/Tokyo
#> date 2022-02-05
#> rstudio 2021.09.1+372 Ghost Orchid (desktop)
#> pandoc 2.16.2 @ C:/Users/user/AppData/Local/Pandoc/ (via rmarkdown)
#>
#> - Packages ---------------------------------------------------------
#> ! package * version date (UTC) lib source
#> abind 1.4-5 2016-07-21 [1] CRAN (R 4.1.1)
#> askpass 1.1 2019-01-13 [1] CRAN (R 4.1.2)
#> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.2)
#> audubon 0.0.5 2022-01-30 [1] https://paithiov909.r-universe.dev (R 4.1.2)
#> backports 1.4.1 2021-12-13 [1] CRAN (R 4.1.2)
#> bit 4.0.4 2020-08-04 [1] CRAN (R 4.1.2)
#> bit64 4.0.5 2020-08-30 [1] CRAN (R 4.1.2)
#> broom 0.7.12 2022-01-28 [1] CRAN (R 4.1.2)
#> bslib 0.3.1 2021-10-06 [1] CRAN (R 4.1.2)
#> cachem 1.0.6 2021-08-19 [1] CRAN (R 4.1.2)
#> car 3.0-12 2021-11-06 [1] CRAN (R 4.1.2)
#> carData 3.0-5 2022-01-06 [1] CRAN (R 4.1.2)
#> cli 3.1.1 2022-01-20 [1] CRAN (R 4.1.2)
#> coda 0.19-4 2020-09-30 [1] CRAN (R 4.1.2)
#> codetools 0.2-18 2020-11-04 [2] CRAN (R 4.1.2)
#> colorspace 2.0-2 2021-06-24 [1] CRAN (R 4.1.2)
#> crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.2)
#> curl 4.3.2 2021-06-23 [1] CRAN (R 4.1.2)
#> data.table 1.14.2 2021-09-27 [1] CRAN (R 4.1.2)
#> DBI 1.1.2 2021-12-20 [1] CRAN (R 4.1.2)
#> digest 0.6.29 2021-12-01 [1] CRAN (R 4.1.2)
#> distill 1.3 2021-10-13 [1] CRAN (R 4.1.2)
#> downlit 0.4.0 2021-10-29 [1] CRAN (R 4.1.2)
#> dplyr 1.0.7 2021-06-18 [1] CRAN (R 4.1.2)
#> ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.2)
#> evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.2)
#> fansi 1.0.2 2022-01-14 [1] CRAN (R 4.1.2)
#> farver 2.1.0 2021-02-28 [1] CRAN (R 4.1.2)
#> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.2)
#> fastmatch 1.1-3 2021-07-23 [1] CRAN (R 4.1.1)
#> float 0.2-6 2021-09-20 [1] CRAN (R 4.1.1)
#> foreach 1.5.1 2020-10-15 [1] CRAN (R 4.1.2)
#> generics 0.1.2 2022-01-31 [1] CRAN (R 4.1.2)
#> ggdendro 0.1.22 2020-09-13 [1] CRAN (R 4.1.2)
#> ggplot2 * 3.3.5 2021-06-25 [1] CRAN (R 4.1.2)
#> ggpubr 0.4.0 2020-06-27 [1] CRAN (R 4.1.2)
#> ggrepel 0.9.1 2021-01-15 [1] CRAN (R 4.1.2)
#> ggsignif 0.6.3 2021-09-09 [1] CRAN (R 4.1.2)
#> glmnet 4.1-3 2021-11-02 [1] CRAN (R 4.1.2)
#> glue 1.6.1 2022-01-22 [1] CRAN (R 4.1.2)
#> gridExtra 2.3 2017-09-09 [1] CRAN (R 4.1.2)
#> gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.2)
#> highr 0.9 2021-04-16 [1] CRAN (R 4.1.2)
#> hms 1.1.1 2021-09-26 [1] CRAN (R 4.1.2)
#> htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.2)
#> httpuv 1.6.5 2022-01-05 [1] CRAN (R 4.1.2)
#> httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.2)
#> iterators 1.0.13 2020-10-15 [1] CRAN (R 4.1.2)
#> jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.1.2)
#> jsonlite 1.7.3 2022-01-17 [1] CRAN (R 4.1.2)
#> knitr 1.37 2021-12-16 [1] CRAN (R 4.1.2)
#> labeling 0.4.2 2020-10-20 [1] CRAN (R 4.1.1)
#> later 1.3.0 2021-08-18 [1] CRAN (R 4.1.2)
#> lattice 0.20-45 2021-09-22 [2] CRAN (R 4.1.2)
#> LDAvis 0.3.2 2015-10-24 [1] CRAN (R 4.1.2)
#> ldccr 0.0.6.900 2022-02-05 [1] Github (paithiov909/ldccr@b23ef2f)
#> lgr 0.4.3 2021-09-16 [1] CRAN (R 4.1.2)
#> LiblineaR 2.10-12 2021-03-02 [1] CRAN (R 4.1.2)
#> lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.2)
#> magrittr * 2.0.2 2022-01-26 [1] CRAN (R 4.1.2)
#> MASS 7.3-54 2021-05-03 [2] CRAN (R 4.1.2)
#> Matrix 1.3-4 2021-06-01 [2] CRAN (R 4.1.2)
#> memoise 2.0.1 2021-11-26 [1] CRAN (R 4.1.2)
#> mlapi 0.1.0 2017-12-17 [1] CRAN (R 4.1.2)
#> munsell 0.5.0 2018-06-12 [1] CRAN (R 4.1.2)
#> network 1.17.1 2021-06-14 [1] CRAN (R 4.1.2)
#> nsyllable 1.0 2020-11-30 [1] CRAN (R 4.1.2)
#> openssl 1.4.6 2021-12-19 [1] CRAN (R 4.1.2)
#> pillar 1.7.0 2022-02-01 [1] CRAN (R 4.1.2)
#> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.2)
#> png 0.1-7 2013-12-03 [1] CRAN (R 4.1.1)
#> promises 1.2.0.1 2021-02-11 [1] CRAN (R 4.1.2)
#> proxy 0.4-26 2021-06-07 [1] CRAN (R 4.1.2)
#> proxyC 0.2.4 2021-12-10 [1] CRAN (R 4.1.2)
#> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.2)
#> quanteda * 3.2.0 2021-11-30 [1] CRAN (R 4.1.2)
#> quanteda.textmodels 0.9.4 2021-04-06 [1] CRAN (R 4.1.2)
#> quanteda.textplots 0.94 2021-04-06 [1] CRAN (R 4.1.2)
#> quanteda.textstats 0.95 2021-11-24 [1] CRAN (R 4.1.2)
#> R.cache 0.15.0 2021-04-30 [1] CRAN (R 4.1.2)
#> R.methodsS3 1.8.1 2020-08-26 [1] CRAN (R 4.1.1)
#> R.oo 1.24.0 2020-08-26 [1] CRAN (R 4.1.1)
#> R.utils 2.11.0 2021-09-26 [1] CRAN (R 4.1.2)
#> R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.2)
#> Rcpp 1.0.8 2022-01-13 [1] CRAN (R 4.1.2)
#> RcppMeCab 0.0.1.3.900 2022-01-17 [1] local
#> D RcppParallel 5.1.5 2022-01-05 [1] CRAN (R 4.1.2)
#> RcppProgress 0.4.2 2020-02-06 [1] CRAN (R 4.1.2)
#> readr 2.1.1 2021-11-30 [1] CRAN (R 4.1.2)
#> reticulate 1.24 2022-01-26 [1] CRAN (R 4.1.2)
#> RhpcBLASctl 0.21-247.1 2021-11-05 [1] CRAN (R 4.1.2)
#> RJSONIO 1.3-1.6 2021-09-16 [1] CRAN (R 4.1.1)
#> rlang 1.0.0 2022-01-26 [1] CRAN (R 4.1.2)
#> rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.2)
#> rsparse 0.5.0 2021-11-30 [1] CRAN (R 4.1.2)
#> RSpectra 0.16-0 2019-12-01 [1] CRAN (R 4.1.2)
#> rstatix 0.7.0 2021-02-13 [1] CRAN (R 4.1.2)
#> rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.2)
#> rtweet 0.7.0 2020-01-08 [1] CRAN (R 4.1.2)
#> sass 0.4.0 2021-05-12 [1] CRAN (R 4.1.2)
#> scales 1.1.1 2020-05-11 [1] CRAN (R 4.1.2)
#> servr * 0.24 2021-11-16 [1] CRAN (R 4.1.2)
#> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.1.2)
#> shape 1.4.6 2021-05-19 [1] CRAN (R 4.1.1)
#> sna 2.6 2020-10-06 [1] CRAN (R 4.1.2)
#> SparseM 1.81 2021-02-18 [1] CRAN (R 4.1.1)
#> statnet.common 4.5.0 2021-06-05 [1] CRAN (R 4.1.2)
#> stopwords 2.3 2021-10-28 [1] CRAN (R 4.1.2)
#> stringi 1.7.6 2021-11-29 [1] CRAN (R 4.1.2)
#> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.2)
#> styler 1.6.2 2021-09-23 [1] CRAN (R 4.1.2)
#> survival 3.2-13 2021-08-24 [2] CRAN (R 4.1.2)
#> text2vec 0.6 2020-02-18 [1] CRAN (R 4.1.2)
#> textmineR 3.0.5 2021-06-28 [1] CRAN (R 4.1.2)
#> tibble 3.1.6 2021-11-07 [1] CRAN (R 4.1.2)
#> tidyr 1.1.4 2021-09-27 [1] CRAN (R 4.1.2)
#> tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.2)
#> tzdb 0.2.0 2021-10-27 [1] CRAN (R 4.1.2)
#> umap 0.2.7.0 2020-11-04 [1] CRAN (R 4.1.2)
#> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.2)
#> V8 4.0.0 2021-12-23 [1] CRAN (R 4.1.2)
#> vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.2)
#> viridis 0.6.2 2021-10-13 [1] CRAN (R 4.1.2)
#> viridisLite 0.4.0 2021-04-13 [1] CRAN (R 4.1.2)
#> vroom 1.5.7 2021-11-30 [1] CRAN (R 4.1.2)
#> withr 2.4.3 2021-11-30 [1] CRAN (R 4.1.2)
#> xfun 0.29 2021-12-14 [1] CRAN (R 4.1.2)
#> yaml 2.2.2 2022-01-25 [1] CRAN (R 4.1.2)
#>
#> [1] C:/Users/user/R/win-library/4.1
#> [2] C:/Program Files/R/R-4.1.2/library
#>
#> D -- DLL MD5 mismatch, broken installation.
#>
#> --------------------------------------------------------------------
Reference
이 문제에 관하여(R(quanteda)을 통한 텍스트 구문 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/paithiov909/articles/a47a097836e8a9ec12ef텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)