본문 바로가기

R

[R] 감성분석

감성분석

감성분석(sentiment analysis) 또는 opinion mining 
: 텍스트에 내재되어 있는 감정적 상태나 주관적 평가를 식별하고 추출하는 텍스트 분석 기법

install.packages("tidytext")
library(tidytext)
install.packages("textdata")
library(textdata)

bing : positive, negative 분류

get_sentiments('bing')
get_sentiments('bing')$word
unique(get_sentiments('bing')$sentiment)

 

 

 

afinn : -5(부정) ~ +5(긍정)의 범위를 갖는 점수로 표현

get_sentiments('afinn')
get_sentiments('afinn')$word
unique(get_sentiments('afinn')$value)

 

 

nrc : 10개의 감성 상태 분류 
"trust" "fear" "negative" "sadness" "anger" "surprise" "positive" "disgust" "joy" "anticipation"

get_sentiments('nrc')
get_sentiments('nrc')$word
unique(get_sentiments('nrc')$sentiment)



loughran : 6개의 감성 상태 분류(금융분야 text에 적합)
"negative" "positive" "uncertainty" "litigious" "constraining" "superfluous" 

get_sentiments('loughran')
get_sentiments('loughran')$word
unique(get_sentiments('loughran')$sentiment)


[문제212] 미국 트럼프 대통령의 취임사 전문을 수집해서 말뭉치로 변환 후, 정제 작업을 통해 DocumentTermMatrix를 생성한 후 시각화 해주세요. 감성 분석도 수행해보세요.

html <- read_html("https://trumpwhitehouse.archives.gov/briefings-statements/the-inaugural-address/")
trump <- html_nodes(html,xpath='//*[@id="main-content"]/div[2]/div/div/p')%>%html_text(trim=T)
head(trump)
trump <- trump[c(-1,-2)]

#텍스트 합치기
trump <- paste(trump,collapse = ' ')

#말뭉치
trump_corpus <- VCorpus(VectorSource(trump))
lapply(trump_corpus,content)

전처리

#소문자 변환
trump_corpus <- tm_map(trump_corpus,content_transformer(tolower))
lapply(trump_corpus,content)

#불용어 처리
trump_corpus <- tm_map(trump_corpus,removeWords,stopwords())

#<u+2013> 제거
lapply(trump_corpus,function(x) str_extract_all(x$content,'<[A-z0-9\\+]+>'))
trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("<[A-z0-9\\+]+>"," ",x)))

#특문 제거
lapply(trump_corpus,function(x) str_extract_all(x$content,'[A-z]+[[:punct:]]+[A-z]+'))
lapply(trump_corpus,function(x) str_extract_all(x$content,'[[:punct:]]ve'))
trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("[[:punct:]]s"," ",x)))

trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("[[:punct:]]ve"," ",x)))

trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("d.c","dc",x)))

trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("rusted-out","rusted out",x)))

lapply(trump_corpus,function(x) str_extract_all(x$content,'(and|the)'))
trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("(and|the)"," ",x)))

lapply(trump_corpus,function(x) str_extract_all(x$content,'[[:punct:]]'))
trump_corpus <- tm_map(trump_corpus,removePunctuation)
trump_corpus <- tm_map(trump_corpus,
                       content_transformer(function(x) gsub("[[:punct:]]"," ",x)))

#숫자 제거
lapply(trump_corpus,function(x) str_extract_all(x$content,'[^0-9\\s]*\\d+\\W\\d*'))
#trump_corpus <- tm_map(trump_corpus,removeNumbers) 2017 제거 안함

#연속되는 2개 이상의 공백을 하나의 공백으로 변환
trump_corpus <- tm_map(trump_corpus,stripWhitespace)
lapply(trump_corpus,content)

빈도표 만든 후 시각화

#빈도수표
trump_dtm <- DocumentTermMatrix(trump_corpus)
trump_termfreq <- colSums(as.matrix(trump_dtm))
trump_termfreq_df <- data.frame(word=names(trump_termfreq),freq=trump_termfreq)

#시각화
wordcloud2(trump_termfreq_df)

감성분석 bing, nrc

trump_sentiment <- merge(trump_termfreq_df,get_sentiments('bing'),by='word')
aggregate(word~sentiment,trump_sentiment,length)

trump_sentiment2 <- merge(trump_termfreq_df,get_sentiments('nrc'),by='word')
aggregate(word~sentiment,trump_sentiment2,length)

[문제213] 트럼프, 바이든 긍정단어를 이용해서 compare wordcloud 생성해주세요.
              biden   trump            =>      compare wordcloud
긍정단어  빈도수  빈도수     

긍정단어 추출

#긍정단어만 추출
trump_positive <- trump_sentiment[trump_sentiment$sentiment=='positive',c('word','freq')]
biden_positive <- biden_sentiment[biden_sentiment$sentiment=='positive',c('word','freq')]

trump_positive$president <- 'TRUMP'
biden_positive$president <- 'BIDEN'

보기와 같은 빈도표 만들기

positive <- rbind(trump_positive,biden_positive)

install.packages("reshape2")
library(reshape2)

df_compar <- acast(positive,word~president,value.var = 'freq',fill=0) #fill=0 값이 없으면 NA 대신 0

시각화

#시각화
library(wordcloud)
windows(width = 10,height = 10)
wordcloud::comparison.cloud(df_compar,colors = c('blue','red'),
                            title.colors = c('blue','red'),
                            title.bg.colors = 'white',
                            title.size = 2,
                            scale = c(2,0.5))

 

'R' 카테고리의 다른 글

[R] 감성분석 예제 - 취임사 분석(군산대 감성분석사전)  (0) 2022.02.18
[R] 자연어 처리 - NLP  (0) 2022.02.16
[R] text mining  (0) 2022.02.15
[R] 다나와 사이트 Web scrapling(selenium)  (0) 2022.02.15
[R] web scraping - selenium  (0) 2022.02.10
Recent Posts
Popular Posts
Recent Comments