網路爬蟲

library(rvest)
## Warning: package 'rvest' was built under R version 4.0.5
newsurl <- 'https://news.ltn.com.tw/list/breakingnews'
ltn <- read_html(newsurl)
title <- ltn %>% html_nodes('h3') %>% html_text()
newsdf <- data.frame(title = title)
newsdf
##                                                         title
## 1               耕興去年營收年增22.94%  喜迎2022龐大檢測需求
## 2               竹北新豐掩埋場又燒了! 火勢撲滅持續監控防復燃
## 3         小米手機真的會文字審查!NCC實測發現還會回傳瀏覽紀錄
## 4                        1/6 威力彩、雙贏彩、今彩539 開獎囉!
## 5               人夫、小三通姦釋憲除罪成功 卻無法獲得刑事補償
## 6              網球》律師爭取聽證會 喬帥下週一拚澳網最後生機 
## 7             小琉球珊瑚狀況全台最差 海保署曝「這兩處」也惡化
## 8       新聞360》中東歐抗中陣線拉警報?立陶宛總統髮夾彎藏盤算
## 9             NBA》K湯復出會打多久? 勇士主帥受訪透露未來規劃
## 10          健康網》寶寶禿頭怎麼辦?  醫:別驚慌!2歲應可長齊
## 11                     開車族好康!台新銀信用卡獨家免費送洗車
## 12              辱華!北京7-11官網標示「台灣」為國家 被罰64萬
## 13                        亞馬遜和斯泰蘭蒂斯跨界合作 盼創綜效
## 14  中二選戰倒數!陳世凱公開9年前防彈背心照:是為了拍給爸媽看
## 15         三星5G輕旗艦S21 FE來了    1月在台上市「近2.2萬元」
## 16                            美11月有453萬辭職不幹了  創新高
## 17   謠言終結站》觸電身亡可「一招復活」?專家警告:恐延誤就醫
## 18            反制北京再出拳!立陶宛:已備妥文件向WTO控告中國
## 19 當年穿防彈衣選舉照曝光!陳世凱:對抗惡勢力最好武器就是選票
## 20         桃機群聚案延燒  前台大醫一圖示警:疫情很快就出去了
#write.csv(x=newsdf, file = 'ltn.csv')

文章斷句

library(jiebaR)
## Warning: package 'jiebaR' was built under R version 4.0.5
## Loading required package: jiebaRD
## Warning: package 'jiebaRD' was built under R version 4.0.5
edit_dict()
## Warning in edit_dict(): You should save the dictionary without BOM on Windows
sentence <- '神預測地震再現身!炎亞綸看首映開示要找「三角點」'
mixseg <- worker()
segment(sentence, jiebar = mixseg)
##  [1] "神"     "預測"   "地震"   "再"     "現身"   "炎"     "亞"     "綸"    
##  [9] "看"     "首映"   "開示"   "要找"   "三角點"
mixseg <- worker()
s      <- "大巨蛋案對市府同仁下封口令?柯P否認"
s1     <- "柯P市府近來飽受大巨蛋爭議"

s.list <- lapply(list(s,s1), function(e) segment(e,jiebar = mixseg))

library(tm)
## Warning: package 'tm' was built under R version 4.0.5
## Loading required package: NLP
Sys.setlocale("LC_ALL", "C") 
## [1] "C"
s.corpus <-  Corpus(VectorSource(s.list))
s.dtm    <-  DocumentTermMatrix(s.corpus, 
                      control = list(wordLengths=c(2,20)))
inspect(s.dtm)
## <<DocumentTermMatrix (documents: 2, terms: 14)>>
## Non-/sparse entries: 17/11
## Sparsity           : 39%
## Maximal term length: 19
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs "<u+4e0b>", "<u+540c><u+4ec1>", "<u+5426><u+8a8d>") "<u+5927>",
##    1           1                   1                   1           0
##    2           0                   0                   0           1
##     Terms
## Docs "<u+5de8><u+86cb>", "<u+5e02><u+5e9c>", "<u+67ef>", "<u+6848><u+5c0d>",
##    1                   1                   1           1                   1
##    2                   1                   1           0                   0
##     Terms
## Docs "p", c("<u+5927>",
##    1    1             1
##    2    1             0
news <- '神預測地震再現身!炎亞綸看首映開示要找「三角點」

〔記者許世穎/台北報導〕由女神卡卡主演的電影《GUCCI:豪門謀殺案》,今晚在台舉辦首映派對,包括胡宇威、孫盛希、郭書瑤、劉品言、「炎P」炎亞綸等人一同出席。先前神準預測地震的炎P還當場開示:「大家注意聽,如果真的搖,不要往外衝!要找堅固的三角點」,要大家看電影遇到地震不要慌張。


炎亞綸笑稱自己是來支持好朋友Lady Gaga。(記者陳逸寬攝)

炎亞綸一現身就開玩笑說是來支持他的朋友(女神卡卡),被問到日前地震,他說當時在14樓開會,「我其實是在唐老師(唐綺陽)他們公司,以為血糖低或是高血壓,聽到一陣尖叫,就拿起手機回訊息」,笑說現在只要地震發生就知道要開始回訊息。

他說唐老師可能被他吸走了一點能量,所以預測神準,但也認為讓大家開始關心地球科學是滿好玩的事情。被問到能否再預測,他說現在這樣似乎有點違法,但也自我預測期許「希望我可以賺一百億,之前不是說要買媒體,一間一間買下來!」至於是否會想像女神卡卡一樣挑戰大銀幕演出,他說當演員要挑戰不同的東西,「比方說我可能在學校教地質學,然後殺學生這樣」。


劉品言出席電影首映會,卻被問《華燈初上》兇手是誰?(記者陳逸寬攝)

因演出《華燈初上》再受矚目的劉品言笑說看到媒體這麼大陣仗,「之後的通告可能要好好考慮一下」,被問到大家好奇的「兇手是誰」,她表示「每個人都很值得懷疑,我相信滿多人都有心裡不同的答案」。第三季之後有沒有可能變成主角?她說:「我們應該每個人都是主角吧!」

劉品言說從開拍到現在壓力都很大,想不到宣傳期還是不能跟大家分享劇情,「每一次編劇都會放不一樣的小驚喜,相信第三季也會有很多小驚喜跟大驚喜,而且第二季播出後大家看我的眼光不太一樣了,第一季是憐憫,這一季好像都用一種『是不是妳』的眼光」。她說媽媽因為看過劇本,也被追問的很勤勞,「她可能更要躲起來!」


「瑤瑤」郭書瑤表示自己是Lady Gaga的粉絲。(記者陳逸寬攝)

「瑤瑤」郭書瑤說自己是卡卡的腦粉,「她很多變,每個身分都做得很好」,也很想挑戰像她演出的蛇蠍美人,「但我外表不夠蠍,不然一直都想挑戰反差大的角色」。

該片由《異形》、《神鬼戰士》大導演雷利史考特執導,打造出關於知名時尚王朝是如何變遷的真實故事,刻劃野心、背叛與謀殺,視覺風格充滿時尚感。故事篇幅橫跨Gucci豪門家族時尚帝國最動蕩不安的數十年,豪華的演員陣容包括曾獲金像獎提名的女神卡卡、亞當崔佛、金獎影帝艾爾帕西諾、金獎得主傑瑞德雷托、以及金獎影帝傑瑞米艾朗、莎瑪海耶克等人一同演出。《GUCCI:豪門謀殺案》明天(7日)在台上映。

'
words <- segment(news, mixseg)
tb <- table(words)
tb <- tb[(nchar(names(tb)) >= 2)]

library(wordcloud2)
## Warning: package 'wordcloud2' was built under R version 4.0.5
wordcloud2(tb, shape = 'triangle')
e1 <- 'this is a book'
e2 <- 'this is my car'
e.split <- strsplit(c(e1, e2), ' ')
e.corpus <- Corpus(VectorSource(e.split) )
dtm <- DocumentTermMatrix(e.corpus)
inspect(dtm)
## <<DocumentTermMatrix (documents: 2, terms: 6)>>
## Non-/sparse entries: 8/4
## Sparsity           : 33%
## Maximal term length: 9
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs "a", "book") "car") "is", "my", c("this",
##    1    1       1      0     1     0         1
##    2    0       0      1     1     1         1

Machine Learning

https://rpubs.com/ywchiu/Demo20171204

library(rvest)

dfall <- data.frame()

for(page in 1:27){
  reviews <- read_html(paste0('https://movies.yahoo.com.tw/movieinfo_review.html/id=7064?sort=update_ts&order=desc&page=', page)) %>% html_nodes('.form_good') 
  
  
  for(ele in reviews){
    comments <- ele %>% html_nodes('span') %>% .[3] %>% html_text()
    score <- ele %>% html_node('input[name="score"]') %>% html_attr('value')
    dfall <- rbind(dfall, data.frame(comments, score, stringsAsFactors = FALSE))
  }

}
write.csv(x = dfall, file = 'movie_reviews.csv')

dfall <- read.csv('movie_reviews.csv', stringsAsFactors = FALSE)
head(dfall)

movies <- dfall[dfall$score %in% c(1,5), ]

movies$score <- factor(movies$score, levels = c(1,5), labels = c('bad', 'good'))


## Word Segmentation
library(jiebaR)
mixseg <- worker()

movie.seg <- lapply(movies$comments, 
       function(e) segment(e, jiebar = mixseg))

## Turning Data Into DocumentTermMatrix
library(tm)
corpus <- Corpus(VectorSource(movie.seg))
doc    <- tm_map(corpus, removeNumbers)
dtm.new<- DocumentTermMatrix(doc, 
            control = list(
              wordLengths = c(2,20)))

## Split Data into Training and Testing Dataset
convert_counts <- function(x){
  x <- ifelse(x > 0, 1, 0)
  x <- factor(x, levels=c(0,1), labels = c('No', 'Yes'))
  return(x)
}

m.count <- apply(dtm.new, MARGIN= 2, convert_counts)
m.count[1:3,1:10]

set.seed(123)
idx <- sample.int(2, nrow(m.count), replace=TRUE, prob=c(0.5,0.5))
m <- as.data.frame(m.count)
trainset <- m[idx == 1, ]
traintag <- movies[idx==1,"score"]


testset  <- m[idx == 2, ]
testtag  <- movies[idx==2,"score"]

## Building Model
library(e1071)
model     <- naiveBayes(trainset, traintag)
predicted <- predict(model, testset)

## Validate Result
sum(testtag == predicted) / length(testtag)

table(testtag, predicted)
#testtag