091
[R] 머신러닝(2): 텍스트마이닝- 감성분석 본문
1. 텍스트 마이닝 이론
- 텍스트 마이닝이란 비정형 텍스트 데이터를 숫자 데이터로 변환해주는 핵심 기술입니다. 머신 러닝은 숫자만을 다룰 수 있지만, SNS,리뷰, 뉴스 등의 대부분의 실제 데이터가 텍스트이기 때문에 분석 가능한 데이터로 만들기 위해 필요합니다. (ex) 자연어 처리, 데이터 마이닝, 기계 학습
- 감성분석(Sentiment Analysis)는 덱스트 데이터에서 감정,의견,태도를 자동으로 파악하고 분류하는 컴퓨터 과학 및 데이터 분석의 한 방법입니다.
감성분석 절차:
(1)(2)(3)감성사전 구축 ->
(4)(5)말뭉치 데이터 수집 및 저장 -> 감성 분석 -> 결과 시각화 및 분석
* 말뭉치(Corpus)란 여러개의 문장을 모아놓은 텍스트 집합으로, 내부에서 이런 구조를 차용하여 분석하는 이유는 덱스트 데이터를 저장하고 처리하기 위한 컨테이너 역할을 이 말뭉치가 해주기 때문입니다.
2. 텍스트 마이닝 실습
| 라이브러리 | 설명 |
| readr | CSV,TSV,TXT 등 파일을 빠르게 편하게 읽어오는 패키지(base R의 read.csv()보다 빠름) |
| SentimentAnalysis | 감성사전 생성+텍스트 감성 점수 계산을 해주는 패키지 |
| tm | 텍스트 마이닝 전용 패키지로 Corpus 생성, 전처리, DTM 변환 등 텍스트 분석의 기반 도구 |
install.packages("readr")
library(readr)
rev <- read_delim("Reviewggi.txt",
delim="\t",col_names=c("word","score"))
#read_delim(file="파일경로", delim="구분자",col_names=열이름 지정)
rev
(1) 파일을 읽기 위해 readr 패키지를 설치하여 read_delim(...)함수를 사용합니다. Reviewggi 파일은 탭으로 단어와 점수가 나눠져있는 형태입니다.


install.packages("SentimentAnalysis")
library(SentimentAnalysis)
rev$score <- as.numeric(as.character(rev$score))
sentdic <- SentimentDictionaryWeighted(words=rev$word, scores=rev$score)
#SentimentDictionaryWeighted(words=단어벡터, scores=각 단어의 점수벡터(숫자형)
sentdic
(2) 감성사전을 만들기 위해 SentimentAnalysis 패키지를 설치하여 SentimentDictionaryWeighted(...)함수를 사용합니다.
-> 위에서 가져온 리뷰 감성사진 파일을 가져올 때 따로 col_types를 지정하지 않았기 때문에 자동적으로 판단될 때 factor로 읽을 수 있기 떄문에 as.character()을 통해 factor->character 그 다음 as.numeric()을 통해 character->numeric으로 강제 변환해줍니다.

sentdic <- SentimentDictionary(rev$word[rev$score>0], rev$word[rev$score<0])
#SentimentDictionary(positiveWords=긍정단어벡터,nagativeWords=부정단어벡터)
sentdic
(3) 일반 감성사전을 생성하여 점수값을 클리핑 마스크 해주어 긍/부정만을 구분합니다.
| 타입 | 함수 | 특징 |
| Weighted | SentimentDictionaryWeighted() | 단어마다 점수가 다름 |
| Binary | SentimentDictionary() | 긍정/부정만 구분(점수 동일) |
-> 아래에서 감성분석 때 사용할 함수가 analyzeSentiment()라서 이렇게 다시 긍/부정만으로 구분해준 것입니다.
txt <- readLines("stestjsm.txt", encoding="UTF-8")
#readLines(con="파일 경로", encoding="인코딩 방식") -> 각줄이 벡터의 한 원소
txt
txt_2 <- gsub("\\.", "", txt)
#gsub(pattern="정규표현식",replacement="바꿀내용",x="대상벡터")
txt_2
(4) readLines(...)를 통해 분석할 리뷰 텍스트를 읽고 gsub(...)으로 텍스트를 전처리해줍니다.


install.packages("tm")
library(tm)
co_txt <- Corpus(VectorSource(txt_2))
inspect(co_txt)
(5) VectorSource()를 통해 R 벡터를 Corpus가 읽을 수 있는 소스 형태로 변환해주고, Corpus()를 통해 텍스트 보관 컨테이너인 말뭉치를 변환해줍니다.

dtm_txt <- DocumentTermMatrix(co_txt)
#DocumentTermMatrix(x=Corpus 객체)
inspect(dtm_txt[1,])
inspect(dtm_txt[2,])
inspect(dtm_txt[3,])
(6)DocumnetTermMatrix()를 통해 Corpus 객체를 숫자 행렬인 DTM으로 변환해줘야 수학적 분석이 가능해집니다.

res <- analyzeSentiment(dtm_txt, language="korean",
rules=list("sentiment"=list(ruleSentiment, sentdic)))
#analyzeSentiment(x=DTM 객체, language="언어",
# rules=감성 계산 규칙 list)
head(res)
(7) 감성분석을 analyzeSenitment()를 사용하여 실행해줍니다.
-> rules 속성 내부에 들어가는 list의 구조는 아래와 같습니다. "sentiment"라는 컬럼 이름을 가진 열의 계산 방법은 ruleSentiment는 SentimentAnalysis 패키지의 기본 규칙이고, 계산에서 사용할 감성사전은 sentdic입니다.


res$pn <- ifelse(res$sentiment>0, "Positive",
ifelse(res$sentiment==0, "Neutral", "Negative")) #새로운 행 추가
head(res)
par(family = "AppleGothic") # Mac 한글
pie(table(res$pn), main="공구일 오늘 하루에 대한 평가")
(8)긍정/부정/중립 분류 및 시각화하는 과정입니다.
-> ifelse() 함수를 통해 삼항 연산자처럼 res 결과에 새로운 pn 행을 추가합니다.
-> pie()는 범주형 자료(긍정/부정/중립)의 단일 변수를 표로 나타낼 때 사용합니다. 아래의 글에서 추가적인 설명을 확인할 수 있습니다.
[R] 단일&다중변수자료의 탐색
1. 자료- 자료의 특성과 변수의 개수에 따른 분류를 통해 범주/연속형 자료로, 단일/다중변수 자료로 나눌 수 있습니다.-> 자료의 특성에 따른 분류• 범주형 자료: 숫자의 크고 작음이 아니라, 종
in-ouput91.tistory.com



'Programming Language > R' 카테고리의 다른 글
| [R] 머신러닝(4): 회귀분석 - 다중선형 회귀분석, 로지스틱 회귀분석 (0) | 2026.05.30 |
|---|---|
| [R] 머신러닝(3): 군집분석 - K-means 군집분석 (0) | 2026.05.30 |
| [R] 머신러닝(1): 연관규칙분석-아프리오리 알고리즘 (0) | 2026.05.23 |
| [R] 데이터 시각화(treemap, ggplot2) (0) | 2026.04.26 |
| [R] 데이터 전처리 (0) | 2026.04.26 |
