워드 클라우드
IT 위키
더 많은 작업
- Word Cloud; 단어 구름, 태그 클라우드(tag cloud)
- 문서에 나온 단어를 빈도(또는 중요도)에 비례하는 글자 크기로 한 화면에 배치해 핵심 단어를 한눈에 보여 주는 시각화
워드 클라우드는 텍스트 마이닝 결과를 보여 주는 가장 흔한 방법이다. 자주 나온 단어일수록 글자를 크게, 진하게, 화면 가운데에 그리므로, 많은 양의 리뷰·기사·설문 응답이 주로 무엇에 관한 것인지 직관적으로 파악할 수 있다. 입력은 단어와 그 빈도의 쌍이며, 보통 문서 단어 행렬의 행 합계(또는 열 합계)로 얻는다. 웹 사이트에서 태그의 사용 빈도를 글자 크기로 보여 주는 태그 클라우드도 같은 원리이다.
ADP에서는 텍스트 마이닝 처리 결과의 시각화 방법으로 다루며, R의 wordcloud 패키지 사용법이 함께 나온다.
- 텍스트 수집: 리뷰, 기사, SNS 글 등을 모아 코퍼스를 만든다.
- 전처리: 토큰화, 소문자화, 문장 부호·숫자 제거, 불용어 제거, 필요하면 어간 추출이나 형태소 분석(한국어 명사 추출)을 한다.
- 빈도 계산: 문서 단어 행렬을 만들고 단어별 빈도 합계를 구한다. 빈도 대신 TF-IDF 합계를 쓰면 흔한 단어보다 특징적인 단어가 강조된다.
- 시각화: 최소 빈도, 최대 단어 수, 색상, 회전 비율 등을 정해 그린다.
| 장점 | 단점 |
|---|---|
| 많은 텍스트의 주제를 한눈에 파악할 수 있다 | 글자 크기로 빈도를 나타내므로 정확한 수치 비교가 어렵다. 길이가 긴 단어가 같은 빈도라도 더 크게 보인다 |
| 전문 지식이 없는 사람도 바로 이해할 수 있어 보고서·발표에 쓰기 좋다 | 단어의 문맥, 순서, 긍정·부정 의미를 잃는다("좋지 않다"의 "좋다"도 같이 센다) |
| 만들기가 쉽고 시각적 흥미를 끈다 | 위치와 색상에 대개 의미가 없어 잘못 해석할 수 있다. 실행할 때마다 배치가 달라질 수 있다 |
| 불용어 처리 결과를 점검하는 데도 쓸 수 있다(의미 없는 단어가 크게 보이면 전처리를 보완) | 전처리 품질(불용어, 동의어 통합, 형태소 분석)에 결과가 크게 좌우된다 |
- 정확한 빈도 비교가 필요하면 상위 단어의 막대 그래프를 함께 제시하는 것이 좋다. 길이와 위치는 넓이나 글자 크기보다 정확하게 지각된다(시각 변수 참고).
| 종류 | 설명 | R wordcloud 함수 |
|---|---|---|
| 기본 워드 클라우드 | 단어 빈도를 글자 크기로 표시 | wordcloud() |
| 비교 클라우드(comparison cloud) | 여러 문서 집단(예: 긍정 리뷰 대 부정 리뷰)에서 각 집단에 특히 많이 나온 단어를 구역별로 비교 | comparison.cloud() |
| 공통 클라우드(commonality cloud) | 여러 문서 집단에 공통으로 나온 단어만 표시 | commonality.cloud() |
| 감성 워드 클라우드 | 긍정어와 부정어를 색으로 구분 | colors 인자로 지정 |
wordcloud 패키지(Ian Fellows)의 wordcloud() 함수 기본 형식은 다음과 같다.
wordcloud(words, freq, scale = c(4, .5), min.freq = 3, max.words = Inf,
random.order = TRUE, random.color = FALSE, rot.per = .1,
colors = "black", ordered.colors = FALSE, ...)
| 인자 | 의미 |
|---|---|
| words, freq | 단어와 그 빈도 |
| scale | 글자 크기 범위(가장 큰 크기, 가장 작은 크기) |
| min.freq | 이 값보다 빈도가 낮은 단어는 그리지 않는다 |
| max.words | 그릴 최대 단어 수 |
| random.order | TRUE면 무작위 순서로 배치, FALSE면 빈도가 큰 단어부터 가운데에 배치 |
| rot.per | 세로(90도 회전)로 그릴 단어의 비율 |
| colors | 빈도 순으로 적용할 색상 벡터 |
tm 패키지로 만든 단어 문서 행렬에서 빈도를 구해 그리는 예이다.
library(tm)
library(wordcloud)
library(RColorBrewer)
corp <- VCorpus(VectorSource(reviews)) # reviews: 문자 벡터
corp <- tm_map(corp, content_transformer(tolower))
corp <- tm_map(corp, removePunctuation)
corp <- tm_map(corp, removeWords, stopwords("english"))
tdm <- TermDocumentMatrix(corp)
freq <- sort(rowSums(as.matrix(tdm)), decreasing = TRUE)
set.seed(1234) # 배치 재현
wordcloud(words = names(freq), freq = freq, min.freq = 2,
max.words = 100, random.order = FALSE, rot.per = 0.2,
colors = brewer.pal(8, "Dark2"))
# 긍정 리뷰와 부정 리뷰 비교: 열이 집단인 단어×집단 행렬
# comparison.cloud(term_matrix, max.words = 50, random.order = FALSE)
- 한국어 텍스트는 명사 추출 같은 형태소 분석을 먼저 하고, 그래픽 장치에서 한글 글꼴을 쓸 수 있도록 설정해야 한다.
Python에서는 wordcloud 패키지의 WordCloud 클래스를 많이 쓴다. 빈도 사전을 직접 넣을 때는 generate_from_frequencies()를, 원문을 넣어 패키지가 단어를 세게 할 때는 generate_from_text()(또는 generate())를 쓴다. 한글은 기본 글꼴로 표시되지 않으므로 font_path에 한글 글꼴 파일을 지정한다.
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
tokens = ["배송", "빠르다", "배송", "품질", "만족", "가격", "배송", "품질"]
stop = {"그리고", "하지만"}
freq = Counter(t for t in tokens if t not in stop)
wc = WordCloud(font_path="NanumGothic.ttf", # 한글 글꼴 경로
width=800, height=400, background_color="white",
max_words=100, random_state=42)
wc.generate_from_frequencies(freq)
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()
wc.to_file("wordcloud.png")
- 워드 클라우드는 단어 빈도를 글자 크기로 나타내는 텍스트 마이닝 결과 시각화라는 점, 입력이 단어와 빈도라는 점을 기억한다.
- 단점(정확한 수치 비교가 어렵고 문맥·순서를 잃음, 전처리 품질에 좌우됨)을 묻는 문제가 나온다.
- R wordcloud()의 주요 인자(min.freq, max.words, random.order, rot.per, colors)와 tm으로 만든 행렬에서 빈도를 구하는 흐름(TermDocumentMatrix → as.matrix → rowSums → sort)을 알아 둔다.
- comparison.cloud는 집단 간 차이, commonality.cloud는 공통 단어를 보여 준다.