트위티의 열하일기
5. 텍스트 마이닝 본문
# 텍스트 마이닝(Text Mining)이란?
문자로 된 데이터에서 가치 있는 정보를 얻어 내는 분석 기법
1. 준비 단계 (패키지 설치 및 데이터 준비)
- KoNLP (Korean Natural Language Processing) 패키지
- R에서 한국어 자연어 처리를 수행하는 패키지
- 형태소 분석, 명사 추출, 사전 추가 등의 기능 제공, 한국어 텍스트 마이닝에 자주 사용됨
- 형태소 분석: SimplePos22(), MorphAnalyzer() 등을 사용하여 단어의 품사 정보 분석
- 명사 추출: extractNoun() 함수를 사용하여 명사만 추출
- (주의) Java 환경이 필요하며, 설정이 번거로움 → 따라서 'multilinguer' 패키지와 함께 설치되는 방식을 추천!
a. 자바, rJava 패키지 설치
install.packages("multilinguer")
library(multilinguer)
install_jdk()
b. KoNLP 의존성 패키지(패키지가 의존하고 있는 패키지) 설치하기
install.packages(c("stringr", "hash", "tau", "Sejong", "RSQLite", "devtools"), type = "binary")
c. KoNLP 패키지 설치하기 (깃허브에 있는 KoNLP 패키지 설치 후 로드)
install.packages("remotes")
remotes::install_github("haven-jeon/KoNLP",
upgrade = "never",
INSTALL_opts = c("--no-multiarch"),
force = TRUE)
library(KoNLP)
d. 형태소 사전 설정하기
- KoNLP 패키지는 120만여 개단어로 구성된 'NIA 사전'을 사용함
- useNIADic(): 형태소 분석 할 때 NIA 사전을 사용하도록 함
useNIADic()
e. 데이터 준비하기
txt <- readLInes("hiphop.txt")
head(txt)
# 결과
[1] " 보고 싶다" "이렇게 말하니까 더 보고 싶다"
[3] "너희 사진을 보고 있어도" "보고 싶다"
[5] "너무 야속한 시간" "나는 우리가 밉다"
f. 특수문자 제거하기
- stringr: 문자 처리 패키지
- stringr의 str_replace_all() : 문자열에서 특정 패턴을 찾아 다른 문자열로 변경하는 함수
install.packages("stringr")
library(stringr)
txt <- str_replace_all(txt, "\\W", " ")
# \\W: 알파벳(a-z, A-Z), 숫자(0-9), 언더스코어(_)를 제외한 모든 문자
2. 가장 많이 사용된 단어 알아보기
a. 가사에서 명사 추출하기
- KoNLP의 extractNoun(): 문장에서 명사를 추출할 수 있음
- as.data.frame의 'stringAsFactors = F' : 문자열 데이터를 문자형(character)으로 유지하고 팩터(factor)로 변환되지 않도록 설정
- dplyr 패키지의 rename(): 데이터 프레임의 열 이름을 변경
# 가사에서 명사 추출
nouns <- extractNoun(txt)
# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))
# 데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringAsFactors = F)
# 변수명 수정
df_word <- rename(df_word,
word = Var1, # Var1을 word로 변경
freq = Freq) # Freq를 freq로 변경
*가사에서 명사 추출 → 각 단어가 몇 번씩 사용됐는지 나타낸 빈도표 생성 → 다루기 쉽도록 table 형태의 빈도표를 데이터 프레임으로 변환 → 변수명 수정
b. 자주 사용된 20개 단어의 빈도표 생성하기
- nchar() 이용: 두 글자 이상으로 된 단어만 추출
# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 2)
*만약 에러가 뜬다면, 그것은 아마도 df_word$word가 문자형으로 바뀌지 않았기 때문일 것 이다 (as.data.frame()에서 stringAsFactors = F 옵션을 주더라도 여전히 factor 타입일 수 있음). 이때, as.character()로 변환시켜줘야 한다.
# df_word$word가 문자형으로 바뀌지 않았을 때
df_word$word <- as.character(df_word$word)
df_word <- filter(df_word, nchar(word) >= 2)
- 빈도 순으로 정렬한 후 상위 20개 단어 추출
top20 <- df_word %>%
arrange(desc(freq)) %>%
head(20)
top20
#결과
word freq
1 12
2 2
3 1 9
4 100 3
5 168 1
6 17 1
> df_word$word <- as.charcter(df_word$word)
as.charcter(df_word$word)에서 다음과 같은 에러가 발생했습니다:
함수 "as.charcter"를 찾을 수 없습니다
> df_word$word <- as.character(df_word$word)
> df_word <- filter(df_word, nchar(word) >= 2)
> top20 <- df_word %>%
+ arrange(desc(freq)) %>%
+ head(20)
> top_20
에러: 객체 'top_20'를 찾을 수 없습니다
> top20
word freq
1 you 89
2 my 86
3 YAH 80
4 on 76
5 하나 75
6 오늘 51
7 and 49
8 사랑 49
9 like 48
10 우리 48
11 the 43
12 시간 39
13 love 38
14 to 38
15 we 36
16 it 33
17 em 32
18 not 32
19 역사 31
20 flex 30
3. 워드 클라우드 생성하기
- 워드 클라우드란, 단어의 빈도를 구름 모양으로 표현한 그래프이다.
- 단어의 빈도에 따라 글자의 크기와 색깔이 다르게 표현됨
- 어떤 단어가 얼마나 만이 사용됐는지 한눈에 파악이 가능함
a. 패키지 준비하기 (설치 및 로드)
#패키지 설치
install.packages("wordcloud")
#패키지 로드
library(wordcloud)
library(RColorBrewer)
b. 단어 색상목록 만들기
- RColorBrewer 패키지의 brewer.pal() : RColorBrewer 패키지에서 제공하는 색상 팔레트 중 지정된 개수와 유형의 색상을 추출하는 함수
#Dark2 색상 목록에서 8개 색상 추출
pal <- brewer.pal(8, "Dark2")
c. 난수 고정하기
: 항상 동일한 워드 클라우드가 생성되도록 난수 고정
#난수 고정하기
set.seed(1234)
d. 워드 클라우드 만들기
#워드 클라우드 만들기
wordcloud(words = df_word$word, # 단어
freq = df_word$freq, # 빈도
min.freq = 2, # 최소 단어 빈도
max.words = 200, # 표현 단어 수
random.order = F, # 고빈도 단어 중앙 배치
rot.per = .1, # 회전 단어 비율
scale = c(4, 0.3), # 단어 크기 범위
colors = pal) # 색상 목록
- 많이 사용된 단어일수록 글자가 크고 가운데에 배치됨
- 덜 사용된 단어일수록 글자가 자고 바깥쪽에 배치됨
e. 단어 색상 변경하기
- 단어 색상 목록을 활용하여 워드 클라우드의 단어 색을 바꿀 수 있음
#단어 색상 바꾸기 (파란색 계열의 색상 목록을 만들어 빈도가 높을수록 진한 파란색으로 표현되도록)
pal <- brewer.pal(9, "Blues")[5:9]
set.seed(1234)
wordcloud(words = df_word$word,
freq = df_word$freq,
min.freq=2,
max.words = 200,
random.order = F,
rot.per = .1,
scale = c(4, 0.3),
colors = pal)
# 예시: 국정원 트윗 텍스트 마이닝
데이터 준비하기 → 단어 빈도표 만들기 → 단어 추출 및 빈도순으로 정렬 → 단어 빈도 막대 그래프 생성 → 워드 클라우드 생성
1. 데이터 준비하기
a. 데이터 로드
twitter <- read.csv("twitter.csv",
header = T, # 첫 번째 행을 '열 이름'으로 인식
fileEncoding = "UTF-8") # UTF-8: 인코딩 방식, 전 세계 대부분의 문자 표현 가능
b. 변수명 수정
twitter <- rename(twitter,
no = 번호,
id = 계정이름,
date = 작성일,
tw = 내용)
c. 특수문자 제거
twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
head(twitter$tw)
#결과
[1] "민주당의 ISD관련 주장이 전부 거짓으로 속속 드러나고있다 미국이 ISD를 장악하고 있다고 주장하지만 중재인 123명 가운데 미국인은 10명뿐이라고 한다 "
[2] "말로만 미제타도 사실은 미제환장 김정일 운구차가 링컨 컨티넬탈이던데 북한의 독재자나 우리나라 종북들이나 겉으로는 노동자 서민을 대변한다면서 고급 외제차 아이팟에 자식들 미국 유학에 환장하는 위선자들인거죠"
[3] "한나라당이 보수를 버린다네요 뭔가착각하는모냥인에 국민들이보수를싫어하는게 아니라뻘짓거리하는분들을싫어하는겁니다야당이진보어쩌고저쩌고한다고해서그들을조아한다고생각하면대착각"
[4] "FTA를 대하는 현명한 자세 사실 자유주의 경제의 가장 큰 수해자는 한국이죠 농어업분야 피해를 줄이는 정부대안을 최대한 보완하고 일자리 창출 등 실익을 최대화해 나가는게 현실적인 대처자세일듯 "
[5] "곽노현씨 갈수록 가관입니다 뇌물질에 아들 병역 의혹까지 도대체 아이들이 뮐 보고 배우겠습니까 이래도 자리 연연하시겠습니까 "
[6] "과거 집권시 한미FTA를 적극 추진하던 세력이 이제 집권하면 폐기하겠다고 주장합니다 어이없어 말도 안 나오네요 표만 얻을 수 있다면 국가 안보나 경제가 어떻게 되든 상관없다는 무책임한 행태들 우리 정치의 후진성을 드러내는 거죠 "
2. 단어 빈도표 만들기
# 트윗에서 명사 추출
nouns <- extractNoun(twitter$tw)
# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))
# 데이터프레임으로 변환
df_word <- as.data.frame(wordcount)
# 변수명 수정
df_word <- rename(df_word,
word = Var1,
freq = Freq)
3. 단어 추출 및 빈도순으로 정렬하기
# 두 글자 이상 단어만 추출
df_word$word <- as.character(df_word$word)
df_word <- filter(df_word, nchar(word)>=2)
# 상위 20개 추출
top20 <- df_word %>%
arrange(desc(freq)) %>%
head(20)
top20
#결과
word freq
1 종북 2431
2 북한 2216
3 세력 1162
4 좌파 829
5 대한민국 804
6 우리 780
7 들이 566
8 국민 550
9 친북 430
10 단체 394
11 김정일 342
12 진보 335
13 대선 329
14 천안함 319
15 사회 307
16 정부 286
17 전교조 278
18 주장 269
19 정권 265
20 연평도 262
4. 단어 빈도 막대 그래프 생성하기
- ggplot2 사용
library(ggplot2)
order <- arrange(top20, freq)$word
ggplot(data = top20, aes(x = word, y = freq)) +
ylim(0, 2500) +
geom_col() +
coord_flip() +
scale_x_discrete(limit = order) + # 빈도순 막대 정렬
geom_text(aes(label = freq), hjust = 0.1) # 빈도 표시
5. 워드 클라우드 만들기
pal <- brewer.pal(9, "Blues")[5:9] # 색상 목록 생성
set.seed(1234) # 난수 고정
wordcloud(words = df_word$word, # 단어
freq = df_words$freq, # 빈도
min.freq = 10, # 최소 단어 빈도
max.words = 150, # 표현 단어 수
random.order = F, # 고빈도 단어 중앙 배치
rot.per = 0, # 회전 단어 비율
scale = c(6, 0.5), # 단어 크기 범위
colors = pal) # 색상 목록
'Programming Languages > R' 카테고리의 다른 글
[심화] R performance 패키지 (0) | 2025.03.04 |
---|---|
실전 데이터 분석 프로젝트 (0) | 2025.02.20 |
4. 그래프 만들기 (ggplot2) (0) | 2025.02.17 |
3. 데이터 가공, 정제하기 (0) | 2025.02.13 |
2. 데이터 프레임, 데이터 불러오기, 데이터 분석의 기초 (0) | 2025.02.06 |