감성분석
감성분석(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 |