DAY16. R ๋น์ ํ๋ฐ์ดํฐ (ํ ํฝ/์ฐ๊ด์ด/๊ฐ์ฑ๋ถ์)
๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (ํ ์คํธ ๋ง์ด๋)
1๋จ๊ณ : ํ ํฝ๋ถ์(๋จ์ด์ ๋น๋์)
2๋จ๊ณ : ์ฐ๊ด์ด ๋ถ์(๊ด๋ จ ๋จ์ด ๋ถ์)
3๋จ๊ณ : ๊ฐ์ฑ ๋ถ์(๋จ์ด์ ๊ธ์ /๋ถ์ ๋ถ์)
ํ ์คํธ ๋ง์ด๋ ํน์ง
ocial ๋ฐ์ดํฐ, ๋์งํธ๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ์ฌ์ ์ ๋น๊ตํ์ฌ ๋จ์ด์ ๋น๋๋ฅผ ๋ถ์ํ๋ค.
ํ๊ณ์ : ์ฌ์ ์์ฑ์ด ์ด๋ ค
KoNLP : ํ๊ธ ์์ฐ์ด ์ฒ๋ฆฌ ์ฌ์ , ์ธ์ข ์ฌ์ (์นด์ด์คํธ ๊ฐ๋ฐ) ์ ์ฉ
์์ฉํ๋ก๊ทธ๋จ ์ฌ์ฉ ๊ถ์ฅ
m : ์๋ฌธ ํ ์คํธ ๋ง์ด๋ ํจํค์ง
๋ฐ์ดํฐ Crawling ์์คํ or ์ ๋ฌธ ์ฌ์ดํธ ์๋ขฐ -> ๋ฐ์ดํฐ ์์ง
SNS / ๋ฌธํ ๋ฐ์ดํฐ ๋ถ์ ์ ์ฐจ
๋จ๊ณ1 : ํ ํฝ๋ถ์(๋จ์ด์ ๋น๋์)
ํํ์ ๋ถ์์ผ๋ก ์ฌ์ ์ ๋จ์ด ์ถ๊ฐ
์ฌ์ ๊ณผ ํ ์คํธ ๋ฐ์ดํฐ ๋น๊ต → ๋จ์ด ๋น๋ ๋ถ์
์๊ฐํ : Wordcloud
๋จ๊ณ2 : ์ฐ๊ด์ด ๋ถ์(๊ด๋ จ ๋จ์ด ๋ถ์)
ํน์ ๋จ์ด์ ์ฐ๊ด๋จ์ด ๋น๋ ๋ถ์
์๊ฐํ : ๋จ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ง ํํ๋ก ์๊ฐํ
๋จ๊ณ3 : ๊ฐ์ฑ ๋ถ์(๋จ์ด์ ๊ธ์ /๋ถ์ ๋ถ์)
์๊ฐํ : ๊ธ์ (ํ๋), ๋ถ์ (๋นจ๊ฐ) -> ๋ถ๋ง๊ณ ๊ฐ ์๊ฐํ
* ํํ์ ๋ถ์ : ๋ฌธ์ฅ์ ๋ถํด ๊ฐ๋ฅํ ์ต์ํ์ ๋จ์๋ก ๋ถ๋ฆฌํ๋ ์์
ํจํค์ง ์ค์น์ ์ค๋น
1) KoNLP ์ค์น
install.packages("KoNLP") # ์ต์ ๋ฒ์ ์์ ํจํค์ง ์ค์น ์ค๋ฅ
Warning in install.packages :
package ‘KoNLP’ is not available (for R version 4.0.0)
[์ค๋ฅ ํด๊ฒฐ ์ ์ฐจ]
ํ์ฌ R ๋ฒ์ ์์ ์ ๊ณตํ์ง ์๋ ํจํค์ง(KoNLP) ์ค์น ๋ฐฉ๋ฒ
[๋จ๊ณ1] Rstudio ์ข
๋ฃ
[๋จ๊ณ2] R 3.6.3 ๋ฒ์ ๋ค์ด๋ก๋ & ์ค์น : KoNLP ์ฌ์ฉ ๋ฒ์
https://cran.r-project.org/bin/windows/base/old/
์ ์ฌ์ดํธ ์ ์ ํ 'R 3.6.3 (February, 2020)' ํด๋ฆญ
[๋จ๊ณ3] Rstudio ์คํ & R ๋ฒ์ ํ์ธ
๋ฉ๋ด [Tools] -> [Global Options] -> [General] ํญ์์
R version : 64-bit R-3.6.3 ๋ณ๊ฒฝ -> RStudion ์ฌ์์
[๋จ๊ณ4] ์ด์ R ๋ฒ์ ์์ kONLP ์ค์น
install.packages("https://cran.rstudio.com/bin/windows/contrib/3.4/KoNLP_0.80.1.zip",
repos = NULL)
* package ‘KoNLP’ successfully unpacked and MD5 sums checked ๋ฌธ๊ตฌ ๋จ๋ฉด์ ์ค์น ์ฑ๊ณต
* C:\Program Files\R์์ R-3.6.3๊ณผ R-4.1.1์ค ์ ํํด์ ์คํ ๊ฐ๋ฅ
* C:\Users\KIM YOON\Documents\R\win-library์์ ์ค์น๋ ํจํค์ง ํ์ธ ๊ฐ๋ฅ
2) Sejong ์ค์น : KoNLP์ ์์กด์ฑ ์๋ Sejong ์ค์น
install.packages("Sejong")
3) wordcloud ์ค์น
install.packages("wordcloud")
4) tm ์ค์น
install.packages("tm")
5) ์ค์น ์์น ํ์ธ
.libPaths()
6) KoNLP ์์กด์ฑ ํจํค์ง ๋ชจ๋ ์ค์น & ๋ก๋
install.packages(c('hash','rJava','tau','RSQLite','devtools')) # 30๊ฑด ๊ฒฝ๊ณ
์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ํจํค์ง ๋ก๋
library(hash)
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_151') # jdk ๊ฒฝ๋ก
library(rJava)
library(tau)
library(RSQLite)
library(devtools)
7) KoNLP ํจํค์ง ๋ก๋ฉ
library(KoNLP) #๋ก๋ฉ ์ฑ๊ณต
library(tm) #์ ์ฒ๋ฆฌ ์ฉ๋
library(wordcloud) #๋จ์ด ๊ตฌ๋ฆ ์๊ฐํ
1. ํ ํฝ๋ถ์(ํ
์คํธ ๋ง์ด๋)
- ์๊ฐํ : ๋จ์ด ๋น๋์์ ๋ฐ๋ฅธ ์๋ ํด๋ผ์ฐ๋
๋จ๊ณ1 : facebook_bigdata.txt ๊ฐ์ ธ์ค๊ธฐ
facebook <- file(file.choose(), encoding="UTF-8")
facebook_data <- readLines(facebook) # ์ค ๋จ์ ์ฝ๊ธฐ
str(facebook_data) # chr [1:76]
facebook_data[1:6] # ์๋ถ๋ถ 6๋ฌธ์ฅ ํ์ธ
๋จ๊ณ2 : ์ธ์ข
์ฌ์ ์ ์ ๊ท ๋จ์ด ์ถ๊ฐ
term='์ถ๊ฐ๋จ์ด', tag=ncn(๋ช
์ฌ์ง์์ฝ๋)
user_dic <- data.frame(term=c("R ํ๋ก๊ทธ๋๋ฐ","ํ์ด์ค๋ถ","๊น์ง์ฑ","์์
๋คํธ์ํฌ"), tag='ncn')
Sejong ์ฌ์ ์ ์ ๊ท ๋จ์ด ์ถ๊ฐ : KoNLP ์ ๊ณต
buildDictionary(ext_dic='sejong', user_dic = user_dic)
๋จ๊ณ3 : ๋จ์ด์ถ์ถ ์ฌ์ฉ์ ํจ์ ์ ์
(1) Sejong ์ฌ์ ์ ๋ฑ๋ก๋ ์ ๊ท ๋จ์ด ํ
์คํธ
paste(extractNoun('ํ๊ธธ๋์ ๋ง์ ์ฌ๋๊ณผ ์ํต์ ์ํด์ ์์
๋คํธ์ํฌ์ ๊ฐ์
ํ์์ต๋๋ค.'), collapse=" ")
(2) ์ฌ์ฉ์ ์ ์ ํจ์ ์คํ ์์ : ๋ฌธ์๋ณํ -> ๋ช
์ฌ ๋จ์ด์ถ์ถ -> ๊ณต๋ฐฑ์ผ๋ก ํฉ์นจ
exNouns <- function(x) {
paste(extractNoun(as.character(x)), collapse=" ")
}
(3) exNouns ํจ์ ์ด์ฉ ๋จ์ด ์ถ์ถ
ํ์) sapply(vector, ํจ์) -> 76๊ฐ vector ๋ฌธ์ฅ(์์)์์ ๋จ์ด ์ถ์ถ
facebook_nouns <- sapply(facebook_data, exNouns)
(4) ๋จ์ด ์ถ์ถ ๊ฒฐ๊ณผ
str(facebook_nouns) # [1:76] attr(*, 'names')=ch [1:76]
facebook_nouns[1] # vector names:์๋๋ฌธ์ฅ(์๋ฌธ์ฅ), vector:๋จ์ด ์ถ์ถ(์๋ซ๋ฌธ์ฅ)
facebook_nouns[2]
๋จ๊ณ4 : ์๋ฃ ์ ์ฒ๋ฆฌ
(1) ๋ง๋ญ์น(์ฝํผ์ค:Corpus) ์์ฑ : ๋ฌธ์ฅ์ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฃ์ ์งํฉ
myCorpus <- Corpus(VectorSource(facebook_nouns))
myCorpus
<<SimpleCorpus>>
Metadata: corpus specific: 1, document level (indexed): 0
Content: documents: 76
corpus ๋ด์ฉ ๋ณด๊ธฐ
inspect(myCorpus[1])
inspect(myCorpus[2])
(2) ์๋ฃ ์ ์ฒ๋ฆฌ : ๋ง๋ญ์น ๋์ ์ ์ฒ๋ฆฌ
myCorpusPrepro <- tm_map(myCorpus, removePunctuation) # ๋ฌธ์ฅ๋ถํธ ์ ๊ฑฐ
myCorpusPrepro <- tm_map(myCorpusPrepro, removeNumbers) # ์์น ์ ๊ฑฐ
myCorpusPrepro <- tm_map(myCorpusPrepro, tolower) # ์๋ฌธ์ ๋ณ๊ฒฝ
์๋ฌธ ๋์ ๋ถ์ฉ์ด ์ ์ธ : stopwords()
myCorpusPrepro <-tm_map(myCorpusPrepro, removeWords, stopwords('english')) # ๋ถ์ฉ์ด์ ๊ฑฐ
(3) ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ํ์ธ
myCorpusPrepro # Content: documents: 76
inspect(myCorpusPrepro[1:3]) # ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ํ์ธ(์ซ์, ๋ฌธ์ฅ๋ถํธ, ์๋ฌธ ์ํ ํ์ธ)
๋จ๊ณ5 : ๋จ์ด ์ ๋ณ(๋จ์ด ๊ธธ์ด 2๊ฐ ์ด์)
(1) ํ๊ธ ๋จ์ด๊ธธ์ด 2์์ ~ 8์์ (ํ๊ธ 1๊ฐ 2byte)
myCorpusPrepro_term <- TermDocumentMatrix(myCorpusPrepro,
control=list(wordLengths=c(4,16)))
myCorpusPrepro_term
(2) Corpus -> ํ์๋ฌธ ๋ณํ : matrix -> data.frame ๋ณ๊ฒฝ
myTerm_df <- as.data.frame(as.matrix(myCorpusPrepro_term))
dim(myTerm_df)
๋จ๊ณ6 : ๋จ์ด ๋น๋์ ๊ตฌํ๊ธฐ
(1) ๋จ์ด ๋น๋์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
wordResult <- sort(rowSums(myTerm_df), decreasing=TRUE)
wordResult[1:10] # top10 ๋จ์ด
(2) ๋ถ์ฉ์ด ์ ๊ฑฐ
myStopwords = c(stopwords('english'), "์ฌ์ฉ"); # ์ ๊ฑฐํ ๋ฌธ์ ์ถ๊ฐ
myCorpusPrepro <-tm_map(myCorpusPrepro, removeWords, myStopwords) # ๋ถ์ฉ์ด์ ๊ฑฐ
(3) ๋จ์ด ์ ๋ณ๊ณผ ํ์๋ฌธ ๋ณํ
myCorpusPrepro_term <- TermDocumentMatrix(myCorpusPrepro,
control=list(wordLengths=c(4,16))) # 2์์ ~ 8์์
(4) ๋ง๋ญ์น ๊ฐ์ฒด๋ฅผ ํ์๋ฌธ์ผ๋ก ๋ณํ
myTerm_df <- as.data.frame(as.matrix(myCorpusPrepro_term))
(5) ๋จ์ด ์ถํ ๋น๋์ ๊ตฌํ๊ธฐ
wordResult <- sort(rowSums(myTerm_df), decreasing=TRUE)
wordResult[1:10]
๋จ๊ณ7 : ๋จ์ด๊ตฌ๋ฆ์ ๋์์ธ ์ ์ฉ(๋น๋์, ์์, ๋๋ค, ํ์ ๋ฑ)
(1) ๋จ์ด ์ด๋ฆ ์์ฑ -> ๋น๋์์ ์ด๋ฆ
myName <- names(wordResult)
(2) ๋จ์ด์ด๋ฆ๊ณผ ๋น๋์๋ก data.frame ์์ฑ
word.df <- data.frame(word=myName, freq=wordResult)
str(word.df) # word, freq ๋ณ์
head(word.df)
(3) ๋จ์ด ์์๊ณผ ๊ธ๊ผด ์ง์
pal <- brewer.pal(12,"Paired") # 12๊ฐ์ง ์์ pal <- brewer.pal(9,"Set1") # Set1~ Set3
ํฐํธ ์ค์ ์ธํ
: "๋ง์ ๊ณ ๋", "์์ธ๋จ์ฐ์ฒด B"
windowsFonts(malgun=windowsFont("๋ง์ ๊ณ ๋")) #windows
(4) ๋จ์ด ๊ตฌ๋ฆ ์๊ฐํ: ํฌ๊ธฐ,์ต์๋น๋์,์์,ํ์ ,์์,๊ธ๊ผด ์ง์
wordcloud(word.df$word, word.df$freq,
scale=c(3,1), min.freq=2, random.order=F,
rot.per=.1, colors=pal, family="malgun")
๋จ๊ณ8 : ์ฐจํธ ์๊ฐํ
(1) ์์ 10๊ฐ ํ ํฝ์ถ์ถ
topWord <- head(sort(wordResult, decreasing=T), 10) # ์์ 10๊ฐ ํ ํฝ์ถ์ถ
(2) ํ์ผ ์ฐจํธ ์์ฑ
pie(topWord, col=rainbow(10), radius=1)
#radius=1 : ๋ฐ์ง๋ฆ ์ง์ - ํ๋ ๊ธฐ๋ฅ
(3) ๋น๋์ ๋ฐฑ๋ถ์จ ์ ์ฉ
pct <- round(topWord/sum(topWord)*100, 1) # ๋ฐฑ๋ถ์จ
(4) ๋จ์ด์ ๋ฐฑ๋ถ์จ ํ๋๋ก ํฉ์น๋ค.
label <- paste(names(topWord), "\n", pct, "%")
(5) ํ์ด์ฐจํธ์ ๋จ์ด์ ๋ฐฑ๋ถ์จ์ ๋ ์ด๋ธ๋ก ์ ์ฉ
pie(topWord, main="SNS ๋น
๋ฐ์ดํฐ ๊ด๋ จ ํ ํฝ๋ถ์",
col=rainbow(10), cex=0.8, labels=label)
02. ์ฐ๊ด์ด ๋ถ์(๋จ์ด์ ๋จ์ด ์ฌ์ด ์ฐ๊ด์ฑ ๋ถ์)
- ์๊ฐํ : ์ฐ๊ด์ด ๋คํธ์ํฌ ์๊ฐํ,
ํ๊ธ ์ฒ๋ฆฌ๋ฅผ ์ํ ํจํค์ง ์ค์น
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jdk1.8.0_151')
library(rJava) # ์๋์ ๊ฐ์ Error ๋ฐ์ ์ Sys.setenv()ํจ์๋ก java ๊ฒฝ๋ก ์ง์
library(KoNLP) # rJava ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํจ
1.ํ
์คํธ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
marketing <- file("c:/ITWILL/2_Rwork/data/marketing.txt", encoding="UTF-8")
marketing2 <- readLines(marketing) # ์ค ๋จ์ ๋ฐ์ดํฐ ์์ฑ
close(marketing) # ๊ฐ์ฒด ๋ซ๊ธฐ
head(marketing2) # ์๋ถ๋ถ 6์ค ๋ณด๊ธฐ - ์ค ๋จ์ ๋ฌธ์ฅ ํ์ธ
str(marketing2) # chr [1:472]
marketing2[1:5]
2. ์ค ๋จ์ ๋จ์ด ์ถ์ถ
* Map()ํจ์ ์ด์ฉ ์ค ๋จ์ ๋จ์ด ์ถ์ถ
lword <- Map(extractNoun, marketing2) #๋ฌธ์ฅ->๋จ์ด ์ถ์ถ
length(lword) # [1] 472 (๋จ์ด๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ฌธ์ฅ ๊ฐ์)
class(lword) # list
str(lword) #list of 472
lword[1]
#$... -> key(๋จ์ด๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ฌธ์ฅ)
#[1] "๊ทผ๋์" "์์ฅ"->value(๋จ์ด)
#[33] "๊ฐ์ " ->์ด 33๊ฐ์ ๋จ์ด
lword <- unique(lword) # ์ค๋ณต๋ฌธ์ฅ ์ ๊ฑฐ
length(lword) # [1] 353(119๊ฐ ์ ๊ฑฐ)
lword <- sapply(lword, unique) # ์ค๋ณต๋จ์ด ์ ๊ฑฐ
length(lword)
list์ฒ๋ฆฌ ํจ์ uniqeu/sapply
lst = list(a=c(1,2,1), b=c(2,3,2), a=c(1,2,1)) #list(key=value, key=value)
lst #$a๊ฐ ์ค๋ณต
unique(lst) #์ค๋ณตkey(๋ฌธ์ฅ. ๊ดํธ ์ ์ซ์ ์ ์ฒด๊ฐ ๊ฒน์น๋์ง) ์ ๊ฑฐ
sapply(lst, unique) #์ค๋ณตvalue(๋จ์ด.๊ดํธ ์ ์ซ์ ํ๋ํ๋๊ฐ ๊ฒน์น๋์ง) ์ ๊ฑฐ
# a b a
#[1,] 1 2 1
#[2,] 2 3 2
3. ์ ์ฒ๋ฆฌ (ํ์ํ ๋จ์ด ์ ๋ณ)
1) ํ๊ธ์ด๋ฉด์, ๋จ์ด ๊ธธ์ด 2์์ ~4์์ ์ธ ๋จ์ด ํํฐ๋ง ํจ์ ์ ์
filter1 <- function(x){
nchar(x) <= 4 && nchar(x) >= 2 && is.hangul(x)
}
2) Filter(f,x) -> filter1() ํจ์๋ฅผ ์ ์ฉํ์ฌ x ๋ฒกํฐ ๋จ์ ํํฐ๋ง
filter2 <- function(x){
Filter(filter1, x)
}
is.hangul() : KoNLP ํจํค์ง ์ ๊ณต
Filter(f, x) : base
nchar() : base -> ๋ฌธ์ ์ ๋ฐํ
3) ์ค ๋จ์ด ๋์ ํํฐ๋ง
lword_final <- sapply(lword, filter2)
lword_final # ์ ์ฒ๋ฆฌ ๋จ์ดํ์ธ(2~4์์ ) [[353]]๋ฒ์งธ ๋ฌธ์ฅ์์ ํํฐ๋ง ๋ ๋จ์ด [1]~[71]
4. ํธ๋์ญ์
์์ฑ : ์ฐ๊ด๋ถ์์ ์ํด ๋จ์ด๋ฅผ ํธ๋์ญ์
์ผ๋ก ๋ณํ
arules ํจํค์ง ์ค์น
install.packages("arules")
library(arules)
* arules ํจํค์ง ์ ๊ณต ๊ธฐ๋ฅ
Adult,Groceries ๋ฐ์ดํฐ ์
as(),apriori(),inspect(),labels(),crossTable()=table()
as(dataset, 'class') # ํ๋ณํ (ex.dataset์ class๋ก)
wordtran <- as(lword_final, "transactions") # lword์ ์ค๋ณต๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด error๋ฐ์
wordtran
# 353 transactions (rows) and : ๊ฑฐ๋ ์(๋ฌธ์ฅ ์)
# 2349 items (columns) : ์ํ ์(๋จ์ด ์)
ํธ๋์ญ์ ๋ด์ฉ ๋ณด๊ธฐ -> ๊ฐ ํธ๋์ญ์ ์ ๋จ์ด ๋ณด๊ธฐ
inspect(wordtran)
5.๋จ์ด ๊ฐ ์ฐ๊ด๊ท์น ์ฐ์ถ
ํธ๋์ญ์
๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก ์ง์ง๋์ ์ ๋ขฐ๋๋ฅผ ์ ์ฉํ์ฌ ์ฐ๊ด๊ท์น ์์ฑ
ํ์) apriori(data, parameter = NULL, appearance = NULL, control = NULL)
tranrules <- apriori(wordtran, parameter=list(supp=0.25, conf=0.05)) #supp์ง์ง๋ conf์ ๋ขฐ๋
inspect(tranrules) #์์ฑ๋ rule = ์ฐ๊ด๊ท์น. lhs:์ ํ์ฌ๊ฑด rhs:ํํ์ฌ๊ฑด
6.์ฐ๊ด์ด ์๊ฐํ (์ฐ๊ด์ด ๋คํธ์ํฌํฌ)
(1) ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ณ๊ฒฝ : ์ฐ๊ด๊ท์น -> label ์ถ์ถ
rules <- labels(tranrules, ruleSep=" ")
rules
๋ฌธ์์ด๋ก ๋ฌถ์ธ ์ฐ๊ด๋จ์ด -> ๊ณต๋ฐฑ ๊ธฐ์ค list ๋ณ๊ฒฝ
rules <- sapply(rules, strsplit, " ", USE.NAMES=F) # list ๋ณํ
rules
list -> matrix ๋ฐํ
rulemat <- do.call("rbind", rules)
rulemat
class(rulemat)
(2) ์ฐ๊ด์ด ์๊ฐํ๋ฅผ ์ํ igraph ํจํค์ง ์ค์น
install.packages("igraph") # graph.edgelist(), plot.igraph(), closeness() ํจ์ ์ ๊ณต
library(igraph)
(3) edgelist๋ณด๊ธฐ - ์ฐ๊ด๋จ์ด๋ฅผ ์ ์ ํํ์ ๋ชฉ๋ก ์ ๊ณต
ruleg <- graph.edgelist(rulemat[c(12:59),], directed=F) # [1,]~[11,] "{}" ์ ์ธ
ruleg
(4) edgelist ์๊ฐํ
X11() # ํ์
์ฐฝ
plot.igraph(ruleg, vertex.label=V(ruleg)$name,
vertex.label.cex=1.2, vertex.label.color='black',
vertex.size=20, vertex.color='green', vertex.frame.color='blue')
*๊ทธ๋ํ ๋ฐ๊นฅ์ชฝ ํญ๋ชฉ์ด ์ ํ์ฌ๊ฑด, ์์ชฝ์ด ํํ์ฌ๊ฑด
ํํ์ฌ๊ฑด : '๋ง์ผํ '
sub_tran_rules = subset(tranrules, rhs %in% '๋ง์ผํ
')
sub_tran_rules #set of 14 rules
๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ณ๊ฒฝ : ์ฐ๊ด๊ท์น -> label ์ถ์ถ
rules <- labels(sub_tran_rules, ruleSep=" ")
rules
๋ฌธ์์ด๋ก ๋ฌถ์ธ ์ฐ๊ด๋จ์ด -> ๊ณต๋ฐฑ ๊ธฐ์ค list ๋ณ๊ฒฝ
rules <- sapply(rules, strsplit, " ", USE.NAMES=F) # list ๋ณํ
rules
list -> matrix ๋ฐํ
rulemat <- do.call("rbind", rules)
rulemat
class(rulemat)
edgelist๋ณด๊ธฐ - ์ฐ๊ด๋จ์ด๋ฅผ ์ ์ ํํ์ ๋ชฉ๋ก ์ ๊ณต
ruleg <- graph.edgelist(rulemat[c(2:14)], directed=F) #์ ํ์ฌ๊ฑด ์๋ [1]์ ์ ์ธ
ruleg
edgelist ์๊ฐํ
X11() # ํ์
์ฐฝ
plot.igraph(ruleg, vertex.label=V(ruleg)$name,
vertex.label.cex=1.2, vertex.label.color='black',
vertex.size=20, vertex.color='green', vertex.frame.color='blue')
๊ฒฐ๊ณผ : ํํ์ฌ๊ฑด '๋ง์ผํ
'์ ์ค์ฌ์ผ๋ก ํ ๊ทธ๋ํ
03. ๊ฐ์ฑ๋ถ์
1. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ()
setwd("C:/ITWILL/2_Rwork/data")
data<-read.csv("reviews.csv")
str(data)
#data.frame': 100 obs. of 2 variables:
#$ company, $ review
head(data,2)
2. ๋จ์ด ์ฌ์ ์ ๋จ์ด์ถ๊ฐ
๊ธ์ ์ด/๋ถ์ ์ด ์์ด ์ฌ์ ๊ฐ์ ธ์ค๊ธฐ
posDic <- readLines("posDic.txt")
negDic <- readLines("negDic.txt")
length(posDic) # 2006
length(negDic) # 4783
๊ธ์ ์ด/๋ถ์ ์ด ๋จ์ด ์ถ๊ฐ
posDic.final <-c(posDic, 'victor')
negDic.final <-c(negDic, 'vanquished')
3. ๊ฐ์ฑ ๋ถ์ ํจ์ ์ ์-sentimental
(1) ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ํจํค์ง ๋ก๋ฉ
library(plyr) # laply()ํจ์ ์ ๊ณต
library(stringr) # str_split()ํจ์ ์ ๊ณต
(2) ๊ฐ์ฑ๋ถ์์ ์ํ ํจ์ ์ ์ (ํจ์ํด์์ค์!)
sentimental = function(sentences, posDic, negDic){
scores = laply(sentences, function(sentence, posDic, negDic) { #sentence:๋ถ์๋์์ด ๋๋ ๋ฌธ์ฅ, posDic:๊ธ์ ์ฌ์ , negDic:๋ถ์ ์ฌ์
sentence์ ์ฒ๋ฆฌ:gsub('ํจํด', '๊ต์ฒด๋ฌธ์', ๋ฌธ์ฅ)
sentence = gsub('[[:punct:]]', '', sentence) #๋ฌธ์ฅ๋ถํธ ์ ๊ฑฐ
sentence = gsub('[[:cntrl:]]', '', sentence) #ํน์๋ฌธ์ ์ ๊ฑฐ
sentence = gsub('\\d+', '', sentence) # ์ซ์ ์ ๊ฑฐ
sentence = tolower(sentence) # ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝ(๋จ์ด๊ฐ ๋ชจ๋ ์๋ฌธ์ ์)
๋ฌธ์ฅ -> ๋จ์ด
word.list = str_split(sentence, '\\s+') # ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก ๋จ์ด ์์ฑ -> \\s+ : ๊ณต๋ฐฑ ์ ๊ท์, +(1๊ฐ ์ด์)
words = unlist(word.list) # unlist() : list๋ฅผ vector ๊ฐ์ฒด๋ก ๊ตฌ์กฐ๋ณ๊ฒฝ
๋จ์ด vs ์ฌ์ (Dic)
pos.matches = match(words, posDic) # words์ ๋จ์ด๋ฅผ posDic์์ matching
neg.matches = match(words, negDic)
์ฌ์ ์์์ ์์น์ ๋ณด ์ถ์ถ
pos.matches = !is.na(pos.matches) # NA ์ ๊ฑฐ, ์์น(์ซ์)๋ง ์ถ์ถ
neg.matches = !is.na(neg.matches)
๊ธ์ ์ ์-๋ถ์ ์ ์
core = sum(pos.matches) - sum(neg.matches) # pos.matches:๊ธ์ ์ ์, neg.matches:๋ถ์ ์ ์
return(score)
}, posDic, negDic)
scores.df = data.frame(score=scores, text=sentences) #score์ ์ ์๊ฐ ๋์ผ๋ฉด ๊ธ์ /๋ฎ์ผ๋ฉด ๋ถ์
return(scores.df)
}
4. ๊ฐ์ฑ ๋ถ์ : ๋๋ฒ์งธ ๋ณ์(review) ์ ์ฒด ๋ ์ฝ๋ ๋์ ๊ฐ์ฑ๋ถ์
result<-sentimental(data[,2], posDic.final, negDic.final) #data์ 2๋ฒ์งธ ์นผ๋ผ(review), ์ต์ข
๊ตฌ์ถ๋ ๊ธ์ /๋ถ์ ์ฌ์
head(result)
#score
#1 0 (1๋ฒ์งธ ๋ฌธ์ฅ ์ ์๋ 0์ )
#2 0
#3 7 (3๋ฒ์งธ ๋ฌธ์ฅ์ ๊ธ์ ์ ์ผ๋ก ํ๊ฐํ๊ณ ์์)
#4 -1
#5 3
#6 1
names(result) # "score" "text"
dim(result) # 100 2
result$text
result$score # 100์ค ๋จ์๋ก ๊ธ์ ์ด/๋ถ์ ์ด ์ฌ์ ์ ์ ์ฉํ ์ ์ ํฉ๊ณ
score๊ฐ์ ๋์์ผ๋ก color ์นผ๋ผ ์ถ๊ฐ
result$color[result$score >=1] <- "blue"
result$color[result$score ==0] <- "green"
result$color[result$score < 0] <- "red"
๊ฐ์ฑ๋ถ์ ๊ฒฐ๊ณผ ์ฐจํธ๋ณด๊ธฐ
plot(result$score, col=result$color) # ์ฐํฌ๋ ์์ ์ ์ฉ
barplot(result$score, col=result$color, main ="๊ฐ์ฑ๋ถ์ ๊ฒฐ๊ณผํ๋ฉด") # ๋ง๋์ฐจํธ
5. ๋จ์ด์ ๊ธ์ /๋ถ์ ๋ถ์
(1) ๊ฐ์ฑ๋ถ์ ๋น๋์
table(result$color)
(2) score ์นผ๋ผ ๋ฆฌ์ฝ๋ฉ
result$remark[result$score >=1] <- "๊ธ์ "
result$remark[result$score ==0] <- "์ค๋ฆฝ"
result$remark[result$score < 0] <- "๋ถ์ "
sentiment_result<- table(result$remark)
sentiment_result
(3) ์ ๋ชฉ, ์์, ์ํฌ๊ธฐ
pie(sentiment_result, main="๊ฐ์ฑ๋ถ์ ๊ฒฐ๊ณผ",
col=c("blue","red","green"), radius=0.8) # -> 1.2