系統參數設定

Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") # 避免中文亂碼
## [1] ""

安裝需要的packages

packages = c("readr", "dplyr", "jiebaR", "tidyr", "tidytext", "igraph", "topicmodels", "ggplot2", "stringr")
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)

讀進library

library(readr)
library(dplyr)
library(jiebaR)
library(tidyr)
library(tidytext)
library(igraph)
library(topicmodels)
library(stringr)
library(ggplot2)
library(reshape2)
library(wordcloud2)

資料基本介紹

  • 資料來源: 文字平台收集PTT nCov2019/Gossip/版文章、回覆
  • 關鍵字:陳時中
  • 資料時間:2020-01-01 ~ 2021-05-15

這次我們針對近1年半的資料,討論ptt版上陳時中相關討論的發文風向,主要針對以下方向分析:

1.與陳時中相關的討論主題有哪些?
2.討論陳時中個人的社群網路如何分布?

1. 資料前處理

在本篇分析中,我們希望建構特定議題的社群網路圖,並分析網路中討論的議題主題

我們需要兩種資料: (1) 每篇文章的主題分類(LDA) (2) 社群網路圖的link和nodes

載入文章和網友回覆資料

posts <- read_csv("../data/tttttt_articleMetaData.csv") # 文章 1399
reviews <- read_csv("../data/tttttt_articleReviews.csv") # 回覆 56079

head(posts)
## # A tibble: 6 x 10
##   artTitle   artDate    artTime  artUrl  artPoster artCat commentNum  push   boo
##   <chr>      <date>     <time>   <chr>   <chr>     <chr>       <dbl> <dbl> <dbl>
## 1 [新聞]陳時中籲「~ 2020-01-28 00:49:13 https:~ tsengcc   Gossi~         67    29     6
## 2 Re:[新聞]陳時~ 2020-01-28 05:22:52 https:~ israelii  Gossi~         27     9     4
## 3 [新聞]口罩是防疫~ 2020-01-28 08:09:22 https:~ xxx80076  Gossi~         35     7     8
## 4 [問卦]陳時中的表~ 2020-01-31 04:16:53 https:~ Iam5566   Gossi~         26    11     4
## 5 [新聞]確診第10~ 2020-01-31 04:25:10 https:~ wendycla~ Gossi~        221   123    10
## 6 [新聞]中央統一調~ 2020-02-01 21:32:11 https:~ Jack3023~ Gossi~        101    27     7
## # ... with 1 more variable: sentence <chr>
head(reviews)
## # A tibble: 6 x 10
##   artTitle    artDate    artTime artUrl     artPoster artCat cmtPoster cmtStatus
##   <chr>       <date>     <time>  <chr>      <chr>     <chr>  <chr>     <chr>    
## 1 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ greg7575  →        
## 2 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ CREA      推       
## 3 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ CREA      →        
## 4 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ lesnaree2 推       
## 5 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ ChungLi5~ 推       
## 6 [新聞]陳時中籲「莫~ 2020-01-28 49'13"  https://w~ tsengcc   Gossi~ color3258 推       
## # ... with 2 more variables: cmtDate <dttm>, cmtContent <chr>

2.LDA 主題分類

文章斷句

#> 移除PTT貼新聞時會出現的格式用字
posts <- posts %>% 
  mutate(sentence=gsub("媒體來源|記者署名|完整新聞標題|完整新聞內文|完整新聞連結|(或短網址)|備註|備註請放最後面|違者新聞文章刪除|張貼問卦請注意|充實文章內容|是否有專板|本板並非萬能問板|一天只能張貼|自刪及被刪也算兩篇之內|超貼者將被水桶|本看板嚴格禁止政治問卦|發文問卦前請先仔細閱讀相關板規|未滿30繁體中文字水桶3個月|嚴重者以鬧板論", "", sentence))
# 文章斷句("\n\n"取代成"。")
mask_meta <- posts %>%
              mutate(sentence=gsub("[\n]{2,}", "。", sentence))

# 以全形或半形 驚歎號、問號、分號 以及 全形句號 爲依據進行斷句
mask_sentences <- strsplit(mask_meta$sentence,"[。!;?!?;]")

# 將每句句子,與他所屬的文章連結配對起來,整理成一個dataframe
mask_sentences <- data.frame(
                        artUrl = rep(mask_meta$artUrl, sapply(mask_sentences, length)),
                        sentence = unlist(mask_sentences)
                      ) %>%
                      filter(!str_detect(sentence, regex("^(\t|\n| )*$")))
                      # 如果有\t或\n就去掉

mask_sentences$sentence <- as.character(mask_sentences$sentence)

文章斷詞

## 文章斷詞
# # load mask_lexicon(特定要斷開的詞,像是user_dict)
# mask_lexicon <- scan(file = "../dict/word.txt", what=character(),sep='\n',
#                    encoding='utf-8',fileEncoding='utf-8')
# # load stop words
# stop_words <- scan(file = "../dict/stop_words.txt", what=character(),sep='\n',
#                    encoding='utf-8',fileEncoding='utf-8')
# 
# # 使用默認參數初始化一個斷詞引擎
# jieba_tokenizer = worker()
# 
# # 使用口罩字典重新斷詞
# new_user_word(jieba_tokenizer, c(mask_lexicon))
# 
# # tokenize function
# chi_tokenizer <- function(t) {
#   lapply(t, function(x) {
#     if(nchar(x)>1){
#       tokens <- segment(x, jieba_tokenizer)
#       tokens <- tokens[!tokens %in% stop_words]
#       # 去掉字串長度爲1的詞彙
#       tokens <- tokens[nchar(tokens)>1]
#       return(tokens)
#     }
#   })
# }
# 
# 
# # 用剛剛初始化的斷詞器把sentence斷開
# tokens <- mask_sentences %>%
#     mutate(sentence = gsub("[[:punct:]]", "",sentence)) %>%
#     mutate(sentence = gsub("[0-9a-zA-Z]", "",sentence)) %>%
#     unnest_tokens(word, sentence, token=chi_tokenizer) %>%
#   count(artUrl, word) %>% # 計算每篇文章出現的字頻
#   rename(count=n)
# tokens
# save.image(file = "../data/token_result.rdata")

斷詞結果可以先存起來,就不用再重跑一次

load("../data/token_result.rdata")

清理斷詞結果

。根據詞頻,選擇只出現3字以上的字
。整理成url,word,n的格式之後,就可以轉dtm

P.S. groupby by之後原本的字詞結構會不見,把詞頻另存在一個reserved_word裡面

freq = 3
# 依據字頻挑字
reserved_word <- tokens %>% 
  group_by(word) %>% 
  count() %>% 
  filter(n > freq) %>% 
  unlist()

mask_removed <- tokens %>% 
  filter(word %in% reserved_word)

#mask_dtm 裡面 nrow:幾篇文章 ; ncol:幾個字
mask_dtm <- mask_removed %>% cast_dtm(artUrl, word, count) 

(2) LDA 主題分析

將剛處理好的dtm放入LDA函式分析

# LDA分成4個主題
mask_lda <- LDA(mask_dtm, k = 4, control = list(seed = 2021,alpha = 2,delta=0.1),method = "Gibbs")

p.s. 。tidy(mask_lda, matrix = “beta”) # 取字 topic term beta值 。tidy(mask_lda, matrix=“gamma”) # 取主題 document topic gamma

取出代表字詞(term)

removed_word = c("陳時中","沒有","相關","台灣","部長","不是","市長","中央","大家","政府","不要","目前","記者會","國家","公布","可能","不會") 

# 看各群的常用詞彙
tidy(mask_lda, matrix = "beta") %>% # 取出topic term beta值
  filter(! term %in% removed_word) %>% 
  group_by(topic) %>%
  top_n(15, beta) %>% # beta值前15的字
  ungroup() %>%
  mutate(topic = as.factor(topic),
         term = reorder_within(term, beta, topic)) %>%
  ggplot(aes(term, beta, fill = topic)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~ topic, scales = "free") +
  coord_flip() +
  scale_x_reordered()

可以歸納出
topic 1 = “檢疫狀況”
topic 2 = “陳時中個人新聞”
topic 3 = “疫苗接種”
topic 4 = “美豬事件”
以下我們挑出第一個主題與第三個主題來做比較。

取出代表主題(topic)

每篇文章拿gamma值最大的topic當該文章的topic

# 在tidy function中使用參數"gamma"來取得 theta矩陣
mask_topics <- tidy(mask_lda, matrix="gamma") %>% # document topic gamma
                  group_by(document) %>%
                  top_n(1, wt=gamma)
mask_topics
## # A tibble: 3,583 x 3
## # Groups:   document [3,546]
##    document                                                 topic gamma
##    <chr>                                                    <int> <dbl>
##  1 https://www.ptt.cc/bbs/Gossiping/M.1580218136.A.251.html     1 0.451
##  2 https://www.ptt.cc/bbs/Gossiping/M.1580228124.A.03A.html     1 0.831
##  3 https://www.ptt.cc/bbs/Gossiping/M.1580473872.A.066.html     1 0.858
##  4 https://www.ptt.cc/bbs/Gossiping/M.1580632630.A.857.html     1 0.583
##  5 https://www.ptt.cc/bbs/Gossiping/M.1580637593.A.E42.html     1 0.552
##  6 https://www.ptt.cc/bbs/Gossiping/M.1580638519.A.26D.html     1 0.574
##  7 https://www.ptt.cc/bbs/Gossiping/M.1580641627.A.B5E.html     1 0.545
##  8 https://www.ptt.cc/bbs/Gossiping/M.1580646887.A.0A2.html     1 0.808
##  9 https://www.ptt.cc/bbs/Gossiping/M.1580781970.A.A56.html     1 0.790
## 10 https://www.ptt.cc/bbs/Gossiping/M.1580782609.A.647.html     1 0.420
## # ... with 3,573 more rows

資料內容探索

posts_topic <- merge(x = posts, y = mask_topics, by.x = "artUrl", by.y="document")

# 看一下各主題在說甚麼
set.seed(123)
posts_topic %>% # 主題一
  filter(topic==1) %>%
  select(artTitle) %>%
  unique() %>%
  sample_n(10)
##                                           artTitle
## 1     [新聞]1968熱點成「危險地區」?陳時中嘆:這是
## 2       [新聞]各國首波解封未列台灣陳時中:政治凌駕
## 3  [新聞]第3度包機能否成行陳時中:牽涉互信有待觀察
## 4       [新聞]【美官訪台】明簽合作備忘錄陳時中提醒
## 5       [新聞]追蹤513位3月從歐洲返台者陳時中:案例
## 6        [新聞]邊境不解封陳時中:安全跟開放是兩回事
## 7      [新聞]外籍人士入境禁令陳時中:3/1後可望鬆綁
## 8       [新聞]華航自英國載百人27日晚返台陳時中:入
## 9      [新聞]旅遊泡泡陳時中:除帛琉其他國家暫不考慮
## 10      [新聞]前天開始發燒、咳嗽陳時中:我去做新冠
posts_topic %>% # 主題二
  filter(topic==2) %>%
  select(artTitle) %>%
  unique() %>%
  sample_n(10)
##                                         artTitle
## 1     [新聞]柯文哲槓上陳時中!黃珊珊鬆口:我才是
## 2  Re:[新聞]柯文哲前往和平醫院視察明早和陳時中碰
## 3     [新聞]若520改組7成民眾挺陳時中續任衛福部長
## 4   Re:[新聞]超帥!陳時中登時尚雜誌封面「大衣+黑
## 5   [新聞]中選會手伸入罷韓案?韓粉呼叫陳時中出來
## 6   [新聞]洩露足跡雙標?柯文哲緩頰:不能怪陳時中
## 7    [新聞]Kolas見證陳時中不眠不休 淚讚:男兒淚
## 8     [新聞]陳佩琪為「小明」逆時中陳時中:掛滿箭
## 9     [新聞]陳時中迅速走紅?中官媒不爽:專業無能
## 10      [新聞]陳時中遊墾丁鼓勵國旅國外解禁還要等
posts_topic %>% # 主題三
  filter(topic==3) %>%
  select(artTitle) %>%
  unique() %>%
  sample_n(10)
##                                         artTitle
## 1   [新聞]陳時中下午親主持健保醫材新制「閉門會議
## 2     [新聞]記者列疫苗施打第三順位陳時中:建議有
## 3     [新聞]又一本土疫苗邁二期試驗陳時中:發展樂
## 4  Re:[新聞]英國包機防疫不如武漢嚴謹陳時中:武漢
## 5     [新聞]陳時中與美衛生部長電話會議美方挺台擴
## 6      [新聞]陳時中投書泰媒籲各方支持WHO納入台灣
## 7     [新聞]採購500萬劑BNT疫苗破局!陳時中證實:
## 8     [新聞]陸國台辦槓上陳時中痛批台「防疫機構負
## 9   [新聞]康匠口罩違法私設產線!陳時中:不影響口
## 10  [新聞]陳時中打垮柯文哲?北市口罩販賣機傳出可
posts_topic %>% # 主題四
  filter(topic==4) %>%
  select(artTitle) %>%
  unique() %>%
  sample_n(10)
##                                         artTitle
## 1     [新聞]萊豬增訂貨品分類號列陳時中反對用殘留
## 2  Re:[新聞]發文罵衛福部長陳時中「無恥舔美賣台」
## 3     [新聞]國民黨要推公投反瘦肉精美豬陳時中:科
## 4     [新聞]美豬標示及示範如何做?陳時中:大家一
## 5       [新聞]陳時中坦言:全面標示是個「大工程」
## 6     [新聞]不贊成食安健康捐陳時中扯「走路也有打
## 7    [新聞]侯友宜砲轟未有紓困SOP陳時中:中央會做
## 8   [新聞]有房有地也來申請紓困?陳時中:受疫情影
## 9  Re:[新聞]健保自付差額上限醫界有疑慮陳時中夜襲
## 10      [新聞]何者更傷手次氯酸水與酒精差異陳時中

日期主題分布

畫出每天topic的分布,可以發現整年關於陳時中的個人新聞都保持一定的討論度

posts_topic %>%
  mutate(artDate = as.Date(artDate)) %>% 
  group_by(artDate= format(artDate,'%Y%m'),topic) %>%
  summarise(sum =sum(topic)) %>%
  ggplot(aes(x= artDate,y=sum,fill=as.factor(topic))) +
  geom_col(position="fill") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
## `summarise()` has grouped output by 'artDate'. You can override using the `.groups` argument.

posts_topic %>%
  group_by(artCat,topic) %>%
  summarise(sum = n())  %>%
  ggplot(aes(x= artCat,y=sum,fill=as.factor(topic))) +
  geom_col(position="dodge") 
## `summarise()` has grouped output by 'artCat'. You can override using the `.groups` argument.

4. 社群網路圖

資料合併

# 文章和留言
reviews <- reviews %>%
      select(artUrl, cmtPoster, cmtStatus, cmtContent)
posts_Reviews <- merge(x = posts, y = reviews, by = "artUrl")

# 把文章和topic
posts_Reviews <- merge(x = posts_Reviews, y = mask_topics, by.x = "artUrl", by.y="document")
head(posts_Reviews,3)
##                                                     artUrl
## 1 https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html
## 2 https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html
## 3 https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html
##                                     artTitle    artDate  artTime artPoster
## 1 [新聞]陳時中籲「莫挑釁戴口罩原則」侯友宜: 2020-01-28 00:49:13   tsengcc
## 2 [新聞]陳時中籲「莫挑釁戴口罩原則」侯友宜: 2020-01-28 00:49:13   tsengcc
## 3 [新聞]陳時中籲「莫挑釁戴口罩原則」侯友宜: 2020-01-28 00:49:13   tsengcc
##      artCat commentNum push boo
## 1 Gossiping         67   29   6
## 2 Gossiping         67   29   6
## 3 Gossiping         67   29   6
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    sentence
## 1 1.:\n\n民視\n\n\n2.\n\n楊凱安、嚴俊強 新北市報導)\n\n3.:\n\n陳時中籲「莫挑釁戴口罩原則」 侯友宜:只是建議\n\n\n4.:\n\n新北市長侯友宜,大年初四到板橋發福袋,全程依舊戴上口罩,不過日前衛福部長陳時中\n提到戴口罩三原則,要政治人物別做不當宣導,造成物資緊張,此話一出被指是針對雙北\n兩位市長。對此侯友宜強調他是建議,沒有強制,而黨內主席改選議題,他樂觀其成,但\n自己忙於市政沒有介入。\n\n大年初四上午,新北市長侯友宜到板橋慈惠宮走春拜廟,並發福袋給民眾。但面對武漢肺\n炎疫情持續升溫,過年行程滿檔的侯友宜,不論走到哪,口罩都戴好戴滿。\n\n不過日前衛福部長陳時中提到戴口罩三原則,包含有慢性病、有疫情症狀,以及到通風不\n良的密閉空間要戴,但有政治人物用自己的想法做不當宣導,造成物資緊張,這話似乎也\n對準侯友宜。\n\n對此,侯友宜表示「我是給大家做一個建議,在公共場合人口聚集的地方,或是密閉空間\n,我們原則上盡量把口罩戴起來,身為防疫指揮官、身為防疫成員,如果不保護好自己的\n健康,如何保護好市民?我知道很多的民眾都在說口罩買不到,那我們整個流程要非常清\n楚,春節期間大家多辛苦一下,那希望大家不要恐慌,政府一定會全力以赴,中央跟地方\n防疫是大家一起來」。\n\n侯友宜強調戴口罩只是建議,沒有強制,針對口罩缺貨問題也要大家別恐慌。不過除了疫\n情問題,外界也關心國民黨內部情況,目前包含前台北市長郝龍斌、立委江啟臣都表態參\n選黨主席,侯友宜則說「謝謝很多人願意出來,為黨做事扛起責任,我都是樂觀其成,自\n己因為市政工作非常繁忙,尤其在春節這段時間,所以我是以市政為最大優先、最大考量\n」。\n\n強調市政優先,侯友宜堅持走自己的路,不介入黨內的政治風暴。\n\n\n5. ():\nhttps://www.ftvnews.com.tw/news/detail/2020128P03M1\n6.:\n\n全民口罩檢定\n
## 2 1.:\n\n民視\n\n\n2.\n\n楊凱安、嚴俊強 新北市報導)\n\n3.:\n\n陳時中籲「莫挑釁戴口罩原則」 侯友宜:只是建議\n\n\n4.:\n\n新北市長侯友宜,大年初四到板橋發福袋,全程依舊戴上口罩,不過日前衛福部長陳時中\n提到戴口罩三原則,要政治人物別做不當宣導,造成物資緊張,此話一出被指是針對雙北\n兩位市長。對此侯友宜強調他是建議,沒有強制,而黨內主席改選議題,他樂觀其成,但\n自己忙於市政沒有介入。\n\n大年初四上午,新北市長侯友宜到板橋慈惠宮走春拜廟,並發福袋給民眾。但面對武漢肺\n炎疫情持續升溫,過年行程滿檔的侯友宜,不論走到哪,口罩都戴好戴滿。\n\n不過日前衛福部長陳時中提到戴口罩三原則,包含有慢性病、有疫情症狀,以及到通風不\n良的密閉空間要戴,但有政治人物用自己的想法做不當宣導,造成物資緊張,這話似乎也\n對準侯友宜。\n\n對此,侯友宜表示「我是給大家做一個建議,在公共場合人口聚集的地方,或是密閉空間\n,我們原則上盡量把口罩戴起來,身為防疫指揮官、身為防疫成員,如果不保護好自己的\n健康,如何保護好市民?我知道很多的民眾都在說口罩買不到,那我們整個流程要非常清\n楚,春節期間大家多辛苦一下,那希望大家不要恐慌,政府一定會全力以赴,中央跟地方\n防疫是大家一起來」。\n\n侯友宜強調戴口罩只是建議,沒有強制,針對口罩缺貨問題也要大家別恐慌。不過除了疫\n情問題,外界也關心國民黨內部情況,目前包含前台北市長郝龍斌、立委江啟臣都表態參\n選黨主席,侯友宜則說「謝謝很多人願意出來,為黨做事扛起責任,我都是樂觀其成,自\n己因為市政工作非常繁忙,尤其在春節這段時間,所以我是以市政為最大優先、最大考量\n」。\n\n強調市政優先,侯友宜堅持走自己的路,不介入黨內的政治風暴。\n\n\n5. ():\nhttps://www.ftvnews.com.tw/news/detail/2020128P03M1\n6.:\n\n全民口罩檢定\n
## 3 1.:\n\n民視\n\n\n2.\n\n楊凱安、嚴俊強 新北市報導)\n\n3.:\n\n陳時中籲「莫挑釁戴口罩原則」 侯友宜:只是建議\n\n\n4.:\n\n新北市長侯友宜,大年初四到板橋發福袋,全程依舊戴上口罩,不過日前衛福部長陳時中\n提到戴口罩三原則,要政治人物別做不當宣導,造成物資緊張,此話一出被指是針對雙北\n兩位市長。對此侯友宜強調他是建議,沒有強制,而黨內主席改選議題,他樂觀其成,但\n自己忙於市政沒有介入。\n\n大年初四上午,新北市長侯友宜到板橋慈惠宮走春拜廟,並發福袋給民眾。但面對武漢肺\n炎疫情持續升溫,過年行程滿檔的侯友宜,不論走到哪,口罩都戴好戴滿。\n\n不過日前衛福部長陳時中提到戴口罩三原則,包含有慢性病、有疫情症狀,以及到通風不\n良的密閉空間要戴,但有政治人物用自己的想法做不當宣導,造成物資緊張,這話似乎也\n對準侯友宜。\n\n對此,侯友宜表示「我是給大家做一個建議,在公共場合人口聚集的地方,或是密閉空間\n,我們原則上盡量把口罩戴起來,身為防疫指揮官、身為防疫成員,如果不保護好自己的\n健康,如何保護好市民?我知道很多的民眾都在說口罩買不到,那我們整個流程要非常清\n楚,春節期間大家多辛苦一下,那希望大家不要恐慌,政府一定會全力以赴,中央跟地方\n防疫是大家一起來」。\n\n侯友宜強調戴口罩只是建議,沒有強制,針對口罩缺貨問題也要大家別恐慌。不過除了疫\n情問題,外界也關心國民黨內部情況,目前包含前台北市長郝龍斌、立委江啟臣都表態參\n選黨主席,侯友宜則說「謝謝很多人願意出來,為黨做事扛起責任,我都是樂觀其成,自\n己因為市政工作非常繁忙,尤其在春節這段時間,所以我是以市政為最大優先、最大考量\n」。\n\n強調市政優先,侯友宜堅持走自己的路,不介入黨內的政治風暴。\n\n\n5. ():\nhttps://www.ftvnews.com.tw/news/detail/2020128P03M1\n6.:\n\n全民口罩檢定\n
##   cmtPoster cmtStatus                        cmtContent topic     gamma
## 1  greg7575         →                       :民進黨的眼     2 0.5463415
## 2      CREA        推     :相信政府相信黨不須擔憂不須慌     2 0.5463415
## 3      CREA         → :再說買不到口罩的就是挑釁政府權威     2 0.5463415

取出 cmtPoster(回覆者)、artPoster(發文者)、artUrl(文章連結) 三個欄位

link <- posts_Reviews %>% select(cmtPoster, artPoster, artUrl)
head(link,3)
##   cmtPoster artPoster                                                   artUrl
## 1  greg7575   tsengcc https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html
## 2      CREA   tsengcc https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html
## 3      CREA   tsengcc https://www.ptt.cc/bbs/Gossiping/M.1580201716.A.D4A.html

基本網路圖

建立網路關係

reviewNetwork <- graph_from_data_frame(d=link, directed=T)
reviewNetwork
## IGRAPH fb5861e DN-- 42442 482344 -- 
## + attr: name (v/c), artUrl (e/c)
## + edges from fb5861e (vertex names):
##  [1] greg7575   ->tsengcc CREA       ->tsengcc CREA       ->tsengcc
##  [4] lesnaree2  ->tsengcc ChungLi5566->tsengcc color3258  ->tsengcc
##  [7] pauljet    ->tsengcc simata     ->tsengcc pauljet    ->tsengcc
## [10] CREA       ->tsengcc ps20012001 ->tsengcc pauljet    ->tsengcc
## [13] b777300    ->tsengcc lesnaree2  ->tsengcc pauljet    ->tsengcc
## [16] kenny945   ->tsengcc pauljet    ->tsengcc ganninian  ->tsengcc
## [19] pauljet    ->tsengcc jack250802 ->tsengcc remora     ->tsengcc
## [22] winnabe    ->tsengcc erick70109 ->tsengcc lwamp      ->tsengcc
## + ... omitted several edges

資料篩選

資料篩選的方式:

  • 文章:文章日期、留言數(commentNum)
  • link、node:degree
# 看一下留言數大概都多少(方便後面篩選)
posts %>%
  #filter(commentNum>100) %>%
  ggplot(aes(x=commentNum)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

依據發文數或回覆數篩選post和review

 # 帳號發文篇數
 post_count = posts %>%
   group_by(artPoster) %>%
   summarise(count = n()) %>%
   arrange(desc(count))
 post_count
## # A tibble: 1,424 x 2
##    artPoster   count
##    <chr>       <int>
##  1 ptt8592        75
##  2 weni302        59
##  3 skyhawkptt     54
##  4 joanzkow       43
##  5 ToHsiang       34
##  6 deathdecay     32
##  7 shinmoner      30
##  8 sukiyasuica    28
##  9 KTR5566        25
## 10 lovea          25
## # ... with 1,414 more rows
 # 帳號回覆總數
 review_count = reviews %>%
   group_by(cmtPoster) %>%
   summarise(count = n()) %>%
   arrange(desc(count))
 review_count
## # A tibble: 42,019 x 2
##    cmtPoster  count
##    <chr>      <int>
##  1 yufion      1844
##  2 birdy590    1323
##  3 kuma660224  1214
##  4 gwenwoo     1136
##  5 elainakuo   1090
##  6 soria       1090
##  7 trywish      967
##  8 abow0704     961
##  9 stvn2567     902
## 10 ymuit        857
## # ... with 42,009 more rows
 # 發文者
 poster_select <- post_count %>% filter(count >= 2)
 posts <- posts %>%  filter(posts$artPoster %in% poster_select$artPoster)

 # 回覆者
 reviewer_select <- review_count %>%  filter(count >= 20)
 reviews <- reviews %>%  filter(reviews$cmtPoster %in% reviewer_select$cmtPoster)
# 檢視參與人數
length(unique(posts_Reviews$artPoster)) # 發文者數量 1421
## [1] 1421
length(unique(posts_Reviews$cmtPoster)) # 回覆者數量 42019
## [1] 42019
allPoster <- c(posts_Reviews$artPoster, posts_Reviews$cmtPoster) # 總參與人數 42442
length(unique(allPoster))
## [1] 42442

標記所有出現過得使用者

  • poster:只發過文、發過文+留過言
  • replyer:只留過言
userList <- data.frame(user=unique(allPoster)) %>%
              mutate(type=ifelse(user%in%posts$artPoster, "poster", "replyer"))
head(userList,3)
##       user    type
## 1  tsengcc  poster
## 2 israelii  poster
## 3 xxx80076 replyer

使用者是否受到歡迎

PTT的回覆有三種,推文、噓文、箭頭,我們只要看推噓就好,因此把箭頭清掉。

filter_degree = 15 # 使用者degree

# 過濾留言者對發文者的推噓程度
link <- posts_Reviews %>%
      filter(commentNum > 1000) %>%
      filter(cmtStatus!="→") %>%
      group_by(cmtPoster, artUrl) %>%
      filter( n() > 4) %>%
      ungroup() %>% 
      select(cmtPoster, artPoster, artUrl, cmtStatus) %>% 
      unique()

# 接下來把網路圖畫出來,跟前面做的事都一樣,因此不再細述

# 篩選link中有出現的使用者
filtered_user <- userList %>%
          filter(user%in%link$cmtPoster | user%in%link$artPoster) %>%
          arrange(desc(type))

# 建立網路關係
reviewNetwork <- graph_from_data_frame(d=link, v=filtered_user, directed=F)

# 依據使用者身份對點進行上色
labels <- degree(reviewNetwork)
V(reviewNetwork)$label <- names(labels)
V(reviewNetwork)$color <- ifelse(V(reviewNetwork)$type=="poster", "yellow", "blue")


# 依據回覆發生的文章所對應的主題,對他們的關聯線進行上色
E(reviewNetwork)$color <- ifelse(E(reviewNetwork)$cmtStatus == "推", "green", "red")

# 畫出社群網路圖 #5432
set.seed(5432)
plot(reviewNetwork, vertex.size=1, edge.width=0.5, vertex.label.dist=0.2,
     vertex.label=ifelse(degree(reviewNetwork) > filter_degree, V(reviewNetwork)$label, NA),vertex.label.font=1)

# 加入標示
legend("bottomright", c("發文者","回文者"), pch=21,
  col="#777777", pt.bg=c("yellow","blue"), pt.cex=1, cex=1)
legend("topleft", c("推","噓"), 
       col=c("green","red"), lty=1, cex=1)

可以發現本次的討論中大部分都是推文、噓文較少

總結

  1. 與陳時中相關的討論主題有哪些?
    使用LDA後可看出與陳時中相關的討論主題有“檢疫狀況”,“陳時中個人新聞”,“疫苗接種”,“美豬事件”,因此我們選擇主題二“陳時中個人新聞”來做討論。

  2. 討論之中的意見領袖有誰?網友的推噓狀態如何?
    主要之意見領袖有KTR5566,Chaos12345,nba887125,cheinshin,cherrywish,Dream-Yeh,大部分都是推文。