# read data
library(readxl)
url <- "https://raw.githubusercontent.com/ywchiu/pytextmining/master/data/20171214news.xlsx"
destfile <- "news.xlsx"
curl::curl_download(url, destfile)
news <- read_excel(destfile)
## New names:
## * `` -> ...1
news$category
## [1] "政治" "論壇" "社會" "生活" "生活" "財經地產"
## [7] "娛樂" "財經地產" "政治" "體育" "財經地產" "國際"
## [13] "政治" "財經地產" "國際" "國際" "娛樂" "社會"
## [19] "國際" "財經地產" "國際" "社會" "社會" "政治"
## [25] "生活" "社會" "社會" "社會" "體育" "娛樂"
## [31] "論壇" "生活" "國際" "國際" "生活" "國際"
## [37] "國際" "生活" "生活" "國際" "娛樂" "生活"
## [43] "娛樂" "財經地產" "政治" "國際" "論壇" "生活"
## [49] "生活" "國際" "生活" "生活" "體育" "財經地產"
## [55] "體育" "財經地產" "娛樂" "社會" "娛樂" "副刊"
## [61] "娛樂" "體育" "國際" "生活" "體育" "生活"
## [67] "體育" "財經地產" "體育" "生活" "政治" "體育"
## [73] "生活" "娛樂" "娛樂" "體育" "體育" "娛樂"
## [79] "國際" "社會" "社會" "社會" "娛樂" "社會"
## [85] "國際" "體育" "生活" "財經地產" "體育" "體育"
## [91] "社會" "國際" "政治" "社會" "體育" "生活"
## [97] "生活" "財經地產" "財經地產" "國際" "娛樂" "生活"
## [103] "生活" "社會" "社會" "體育" "國際" "國際"
## [109] "體育" "體育" "生活" "財經地產" "體育" "政治"
## [115] "體育" "財經地產" "生活" "財經地產" "政治" "生活"
## [121] "生活" "社會" "財經地產" "動物" "動物" "動物"
## [127] "動物" "生活" "娛樂" "國際" "國際" "財經地產"
## [133] "國際" "國際" "副刊" "論壇" "國際" "國際"
## [139] "國際" "國際" "動物" "動物" "3C" "3C"
## [145] "3C" "3C" "3C" "副刊" "副刊" "副刊"
## [151] "副刊" "社會" "社會" "國際" "社會" "國際"
## [157] "社會" "國際" "生活" "社會" "國際" "社會"
## [163] "動物" "動物" "國際" "論壇" "娛樂" "動物"
## [169] "副刊" "論壇" "生活" "國際" "政治" "娛樂"
## [175] "國際" "論壇" "副刊" "政治" "生活" "副刊"
## [181] "3C" "論壇" "政治" "財經地產" "動物" "財經地產"
## [187] "生活" "社會" "論壇" "生活" "體育" "娛樂"
## [193] "國際" "國際" "政治" "國際" "娛樂" "娛樂"
## [199] "財經地產" "政治" "娛樂" "社會" "財經地產" "財經地產"
## [205] "國際" "財經地產" "財經地產" "財經地產" "國際" "國際"
## [211] "社會" "政治" "政治" "生活" "娛樂" "國際"
## [217] "財經地產" "娛樂" "國際" "財經地產" "生活" "娛樂"
## [223] "政治" "政治" "娛樂" "生活" "政治" "國際"
## [229] "國際" "財經地產" "社會" "社會" "社會" "財經地產"
## [235] "生活" "娛樂" "社會" "政治" "生活" "財經地產"
## [241] "財經地產" "社會" "體育" "財經地產" "生活" "娛樂"
## [247] "體育" "娛樂" "生活" "娛樂" "論壇" "生活"
## [253] "政治" "財經地產" "財經地產" "社會" "生活" "生活"
## [259] "娛樂" "財經地產" "財經地產" "娛樂" "生活" "社會"
## [265] "娛樂" "副刊" "政治" "社會" "娛樂" "論壇"
## [271] "娛樂" "政治" "生活" "社會" "國際" "社會"
## [277] "生活" "娛樂" "副刊" "財經地產" "國際" "生活"
## [283] "生活" "社會" "政治" "娛樂" "生活" "生活"
## [289] "財經地產" "論壇" "社會" "社會" "政治" "國際"
## [295] "生活" "國際" "社會" "娛樂" "社會" "社會"
## [301] "娛樂" "國際" "國際" "生活" "論壇" "生活"
## [307] "政治" "社會" "娛樂" "3C" "生活" "國際"
## [313] "財經地產" "生活" "娛樂" "政治" "體育" "娛樂"
## [319] "政治" "國際" "國際" "財經地產" "政治" "論壇"
## [325] "政治" "娛樂" "國際" "娛樂" "國際" "社會"
## [331] "財經地產" "社會" "國際" "娛樂" "社會" "財經地產"
## [337] "社會" "國際" "體育" "論壇" "社會" "政治"
## [343] "體育" "動物" "生活" "政治" "社會" "社會"
## [349] "社會" "生活" "社會" "娛樂" "政治" "社會"
## [355] "壹週刊" "論壇" "娛樂" "社會" "國際" "財經地產"
## [361] "社會" "體育" "政治" "社會" "社會" "娛樂"
## [367] "社會" "體育" "娛樂" "娛樂" "壹週刊" "社會"
## [373] "社會" "國際" "生活" "生活" "娛樂" "社會"
## [379] "副刊" "副刊" "壹週刊" "娛樂" "生活" "政治"
## [385] "政治" "娛樂" "體育" "娛樂" "生活" "政治"
## [391] "財經地產" "論壇" "財經地產" "社會" "國際" "副刊"
## [397] "社會" "生活" "副刊" "政治" "生活" "生活"
## [403] "政治" "生活" "政治" "社會" "生活" "政治"
## [409] "生活" "國際" "政治" "社會" "3C" "論壇"
## [415] "生活" "國際" "政治" "政治" "社會" "娛樂"
## [421] "3C" "社會" "財經地產" "政治" "財經地產" "生活"
## [427] "社會" "財經地產" "娛樂" "社會" "副刊" "娛樂"
## [433] "生活" "社會" "國際" "社會" "社會" "生活"
## [439] "娛樂" "社會" "社會" "社會" "財經地產" "論壇"
## [445] "社會" "生活" "財經地產" "社會" "政治" "體育"
## [451] "社會" "社會" "社會" "國際" "生活" "社會"
## [457] "生活" "政治" "副刊" "生活" "社會" "社會"
## [463] "政治" "社會" "社會" "社會" "娛樂" "國際"
## [469] "生活" "體育" "財經地產" "財經地產" "論壇" "國際"
## [475] "財經地產" "體育" "財經地產" "娛樂" "社會" "社會"
## [481] "娛樂" "財經地產" "國際" "論壇" "政治" "生活"
## [487] "社會" "生活" "生活" "社會" "娛樂" "政治"
## [493] "財經地產" "國際" "政治" "政治" "政治" "財經地產"
## [499] "國際" "生活" "政治" "政治" "體育" "生活"
## [505] "財經地產" "國際" "3C" "生活" "政治" "副刊"
## [511] "生活" "政治" "生活" "娛樂" "國際" "生活"
## [517] "娛樂" "生活" "生活" "社會" "國際" "社會"
## [523] "生活" "娛樂" "生活" "論壇" "政治" "政治"
## [529] "社會" "社會" "生活" "社會" "3C" "國際"
## [535] "社會" "政治" "生活" "生活" "娛樂" "財經地產"
## [541] "娛樂" "3C" "生活" "財經地產" "財經地產" "生活"
## [547] "社會" "娛樂" "政治" "論壇" "財經地產" "生活"
## [553] "社會" "體育" "娛樂" "體育" "政治" "社會"
## [559] "政治" "財經地產" "社會" "生活" "財經地產" "3C"
## [565] "社會" "體育" "社會" "政治" "財經地產" "國際"
## [571] "娛樂" "體育" "財經地產" "體育" "論壇" "社會"
## [577] "3C" "社會" "生活" "社會" "娛樂" "社會"
## [583] "國際" "財經地產" "娛樂" "生活" "財經地產" "社會"
## [589] "娛樂" "社會" "社會" "生活" "生活" "財經地產"
## [595] "論壇" "生活" "生活" "財經地產" "社會" "政治"
## [601] "財經地產" "國際" "社會" "財經地產" "生活" "生活"
## [607] "娛樂" "社會" "社會" "娛樂" "財經地產" "社會"
## [613] "政治" "生活" "壹週刊" "政治" "國際" "國際"
## [619] "動物" "國際" "國際" "生活" "娛樂" "生活"
## [625] "國際" "社會" "財經地產" "政治" "社會" "生活"
## [631] "財經地產" "娛樂" "財經地產" "生活" "國際" "生活"
## [637] "政治" "論壇" "社會" "財經地產" "社會" "3C"
## [643] "社會" "壹週刊" "財經地產" "國際" "社會" "生活"
## [649] "生活" "生活" "社會" "國際" "政治" "政治"
## [655] "生活" "生活" "體育" "娛樂" "動物" "國際"
## [661] "財經地產" "國際" "國際" "國際" "社會" "財經地產"
## [667] "社會" "財經地產" "國際" "生活" "社會" "生活"
## [673] "社會" "娛樂" "生活" "體育" "論壇" "生活"
## [679] "生活" "生活" "社會" "財經地產" "政治" "生活"
## [685] "國際" "生活" "政治" "生活" "社會" "國際"
## [691] "體育" "政治" "體育" "財經地產" "財經地產" "體育"
## [697] "政治" "政治" "生活" "體育" "財經地產" "財經地產"
## [703] "3C" "生活" "論壇" "生活" "體育" "生活"
## [709] "生活" "財經地產" "國際" "生活" "財經地產" "體育"
## [715] "財經地產" "國際" "生活" "生活" "娛樂" "體育"
## [721] "生活" "論壇" "國際" "生活" "副刊" "政治"
## [727] "政治" "娛樂" "體育" "生活" "社會" "社會"
## [733] "社會" "財經地產" "政治" "3C" "3C" "3C"
## [739] "論壇" "體育" "國際" "娛樂" "生活" "財經地產"
## [745] "財經地產" "生活" "社會" "生活" "體育" "論壇"
## [751] "財經地產" "體育" "財經地產" "娛樂" "國際" "體育"
## [757] "生活" "娛樂" "國際" "生活" "國際" "體育"
## [763] "國際" "娛樂" "國際" "娛樂" "體育" "生活"
## [769] "社會" "娛樂" "政治" "生活" "生活" "生活"
## [775] "娛樂" "體育" "政治" "財經地產" "生活" "政治"
## [781] "財經地產" "生活" "國際" "生活" "生活" "娛樂"
## [787] "體育" "社會" "社會" "體育" "娛樂" "生活"
## [793] "娛樂" "論壇" "副刊" "體育" "財經地產" "社會"
## [799] "體育" "財經地產" "國際" "國際" "國際" "財經地產"
## [805] "生活" "政治" "國際" "體育" "生活" "生活"
## [811] "政治" "財經地產" "國際" "財經地產" "體育" "國際"
## [817] "生活" "財經地產" "國際" "國際" "國際" "國際"
## [823] "國際" "國際" "國際" "國際" "國際" "國際"
## [829] "國際" "國際" "國際" "國際" "社會" "娛樂"
## [835] "國際" "國際" "社會" "社會" "3C" "社會"
## [841] "生活" "副刊" "動物" "國際" "3C" "動物"
## [847] "副刊" "動物" "生活" "動物" "副刊" "動物"
## [853] "社會" "副刊" "論壇" "生活" "論壇" "動物"
## [859] "論壇" "娛樂" "財經地產" "副刊" "論壇" "娛樂"
## [865] "社會" "娛樂" "娛樂" "論壇" "3C" "國際"
## [871] "財經地產" "生活" "財經地產" "財經地產" "社會" "國際"
## [877] "生活" "社會" "論壇" "財經地產" "娛樂" "娛樂"
## [883] "娛樂" "娛樂" "社會" "體育" "生活" "生活"
## [889] "生活" "國際" "生活" "財經地產" "社會" "財經地產"
## [895] "娛樂" "財經地產" "娛樂" "娛樂" "社會"
news <- news[news$category %in% c('社會', '娛樂'),]
head(news)
## # A tibble: 6 x 5
## ...1 category content link title
## <dbl> <chr> <chr> <chr> <chr>
## 1 2 社會 被控來台涉發展情報組織的中國學生周泓旭,因接觸我… https://tw.news.ap… 陸生共諜嗆台司法 「不敢公開審理…
## 2 6 娛樂 韓國女星「喬妹」宋慧喬10月嫁給宋仲基,隨即飛往… https://tw.enterta… 喬妹升格宋太太首上工 現身中國見…
## 3 16 娛樂 小嫻和何守正婚姻觸礁,雙方親友團各有說詞,何守正… https://tw.enterta… 小嫻婚變冒毒菇 勾于美人「奉茶」…
## 4 17 社會 桃園市蘆竹區大有街一間矽卡工廠宿舍,今天凌晨2時… https://tw.news.ap… 【不斷更新】桃園工廠惡火撲滅 6…
## 5 21 社會 (更新:新增最新玉山氣溫資訊)受到東北季風影響,… https://tw.news.ap… 玉山清晨降雪 陽光露臉融化糖霜潤…
## 6 22 社會 (更新:新增警方調查) 高雄市一家五星級飯店,… https://tw.news.ap… 畢旅變調 高職生五星級飯店抓狂嘶…
table(news$category)
##
## 娛樂 社會
## 101 146
# segmentation
library(jiebaR)
## Loading required package: jiebaRD
mixseg<- worker()
news.seg <- lapply(news$content, function(e) segment(code = e, jiebar = mixseg))
length(news.seg)
## [1] 247
#news.seg[[1]]
# 建立詞頻矩陣
library(tm)
## Loading required package: NLP
jieba_tokenizer=function(d){
unlist(segment(d[[1]],mixseg))
}
space_tokenizer=function(x){
unlist(strsplit(as.character(x[[1]]),'[[:space:]]+'))
}
doc=VCorpus(VectorSource(news.seg))
doc=unlist(tm_map(doc,jieba_tokenizer),recursive=F)
doc=lapply(doc,function(d)paste(d,collapse=' '))
control.list=list(wordLengths=c(2,Inf),tokenize=space_tokenizer)
corpus <- Corpus(VectorSource(doc))
doc <- tm_map(corpus, removeNumbers)
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
dtm=DocumentTermMatrix(doc,control=control.list)
dim(dtm)
## [1] 247 13397
dtm
## <<DocumentTermMatrix (documents: 247, terms: 13397)>>
## Non-/sparse entries: 43344/3265715
## Sparsity : 99%
## Maximal term length: 13
## Weighting : term frequency (tf)
#as.matrix(dtm)
Naive Bayes
library(e1071)
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
m <- naiveBayes(iris[,1:4], iris[,5])
predict(m, iris)
## [1] setosa setosa setosa setosa setosa setosa
## [7] setosa setosa setosa setosa setosa setosa
## [13] setosa setosa setosa setosa setosa setosa
## [19] setosa setosa setosa setosa setosa setosa
## [25] setosa setosa setosa setosa setosa setosa
## [31] setosa setosa setosa setosa setosa setosa
## [37] setosa setosa setosa setosa setosa setosa
## [43] setosa setosa setosa setosa setosa setosa
## [49] setosa setosa versicolor versicolor virginica versicolor
## [55] versicolor versicolor versicolor versicolor versicolor versicolor
## [61] versicolor versicolor versicolor versicolor versicolor versicolor
## [67] versicolor versicolor versicolor versicolor virginica versicolor
## [73] versicolor versicolor versicolor versicolor versicolor virginica
## [79] versicolor versicolor versicolor versicolor versicolor versicolor
## [85] versicolor versicolor versicolor versicolor versicolor versicolor
## [91] versicolor versicolor versicolor versicolor versicolor versicolor
## [97] versicolor versicolor versicolor versicolor virginica virginica
## [103] virginica virginica virginica virginica versicolor virginica
## [109] virginica virginica virginica virginica virginica virginica
## [115] virginica virginica virginica virginica virginica versicolor
## [121] virginica virginica virginica virginica virginica virginica
## [127] virginica virginica virginica virginica virginica virginica
## [133] virginica versicolor virginica virginica virginica virginica
## [139] virginica virginica virginica virginica virginica virginica
## [145] virginica virginica virginica virginica virginica virginica
## Levels: setosa versicolor virginica
新聞分類
convert_counts <- function(x) {
x <- ifelse(x > 0, 1, 0)
x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
return(x)
}
dtm.count <- apply(dtm, MARGIN = 2, convert_counts)
dtm.mat.df <-as.data.frame(dtm.count)
#dtm.mat.df[1:3,1:5]
X <- dtm.mat.df
#head(X)
Y <- as.factor(news$category)
Y
## [1] 社會 娛樂 娛樂 社會 社會 社會 社會 社會 社會 娛樂 娛樂 娛樂 娛樂 社會 娛樂
## [16] 娛樂 娛樂 娛樂 娛樂 社會 社會 社會 娛樂 社會 社會 社會 娛樂 社會 社會 社會
## [31] 娛樂 社會 社會 社會 社會 社會 社會 娛樂 娛樂 社會 娛樂 娛樂 娛樂 娛樂 社會
## [46] 社會 娛樂 娛樂 娛樂 娛樂 社會 社會 社會 娛樂 社會 社會 娛樂 娛樂 娛樂 社會
## [61] 娛樂 娛樂 社會 娛樂 社會 娛樂 娛樂 社會 社會 娛樂 社會 娛樂 社會 社會 社會
## [76] 娛樂 社會 社會 娛樂 社會 娛樂 娛樂 娛樂 娛樂 娛樂 社會 社會 娛樂 社會 社會
## [91] 社會 社會 社會 社會 社會 娛樂 社會 娛樂 社會 社會 社會 社會 娛樂 社會 娛樂
## [106] 娛樂 社會 社會 娛樂 社會 娛樂 娛樂 娛樂 社會 社會 社會 社會 社會 娛樂 社會
## [121] 社會 娛樂 社會 娛樂 社會 社會 社會 娛樂 社會 社會 社會 社會 社會 社會 社會
## [136] 社會 社會 社會 社會 社會 社會 社會 娛樂 娛樂 社會 社會 娛樂 社會 社會 娛樂
## [151] 娛樂 娛樂 社會 社會 娛樂 社會 社會 社會 社會 娛樂 娛樂 社會 娛樂 社會 娛樂
## [166] 社會 社會 社會 社會 娛樂 社會 社會 社會 娛樂 社會 娛樂 社會 娛樂 社會 社會
## [181] 社會 社會 娛樂 社會 社會 娛樂 社會 娛樂 社會 社會 娛樂 社會 社會 社會 社會
## [196] 社會 娛樂 社會 社會 社會 社會 娛樂 社會 社會 娛樂 娛樂 社會 社會 社會 娛樂
## [211] 社會 娛樂 娛樂 娛樂 娛樂 社會 娛樂 娛樂 娛樂 社會 社會 娛樂 娛樂 社會 社會
## [226] 娛樂 社會 社會 社會 社會 娛樂 娛樂 社會 娛樂 娛樂 社會 社會 娛樂 娛樂 娛樂
## [241] 娛樂 社會 社會 娛樂 娛樂 娛樂 社會
## Levels: 娛樂 社會
m <- naiveBayes(X,Y)
#predicted <- predict(m, X)
#tb <- table(predicted, Y)
#tb
nrow(X)
## [1] 247
idx <- sample.int(2, nrow(X), replace=TRUE, prob=c(0.7,0.3))
trainset <-X[idx==1,]
testset <- X[idx==2,]
traintag <-Y[idx==1]
testtag <-Y[idx==2]
model <- naiveBayes(trainset , traintag)
#pred <- predict(model, testset)
#tb <- table(pred, testtag)
#tb