# 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