1 文本資料前處理 (共 100 分)

你的任務是撰寫一份程式碼,將 samesex_marriage/txt/ 內的所有的 .txt 檔斷詞處理後,整理成一個 document data frame,並將結果儲存於變數 docs_df

評分標準與提示

  1. 斷詞請使用自訂辭典 (辭典位於 samesex_marriage/user_dict.txt) (10 分)

  2. docs_df 需有 4 個變項:

  • id: 文章檔名 (15 分)

  • topic: 文章來源 (詳見課程影片) (25 分)
    每篇文章的 topic 資訊藏在文字檔的檔名中, 例如 samesex_marriage/txt/anti_7.txttopicantisamesex_marriage/txt/pro_108.txttopicpro。你可以透過 basename()strsplit() 取得檔名中的這項資訊。

  • title: 文章標題 (25 分)
    每篇文章的標題儲存於文字檔的第一行 (第二行為空行), 例如 samesex_marriage/txt/anti_7.txt 的第一行為 同性婚姻與多人婚姻

  • content: 文章內文 (25 分)
    需斷好詞且以 \u3000 作為詞彙分隔字元。 內文不包含文章標題 (i.e. 忽略文字檔第一行)

  1. 請在程式碼中加入適量註解 (沒有註解以致程式碼閱讀困難者,酌量扣分),例如:

    # Read post from file
    post <- readLines(fps[i], encoding = "UTF-8")
    
    # Extract title
    title <- ...
# Your code goes here
# please save the results to `docs_df`

########## Answer ###########
library(jiebaR)
# Get txt file paths
fps <- list.files("samesex_marriage/txt", full.names = T)
# Initialize jiebaR (注意:不要寫在 for loop 內,電腦會爆掉)
seg <- worker(user = "samesex_marriage/user_dict.txt")

# Initialize empty vector to use in for loop
contents <- vector("character", length(fps))
titles <- contents
topics <- contents
fnames <- contents

for (i in seq_along(fps)) {
  # Read post from file
  post <- readLines(fps[i], encoding = "UTF-8")
  
  # Metas
  fnames[i] <- basename(fps[i])
  topics[i] <- strsplit(fnames[i], "_")[[1]][1]
  titles[i] <- post[1]
  
  # Segment post
  content <- post[2:length(post)]
  content <- content[content != ""]
  segged <- segment(content, seg)
  contents[i] <- paste(segged, collapse = "\u3000")
}
# Combine results into a df
docs_df <- tibble::tibble(id = fnames,
                          topic = topics,
                          title = titles,  
                          content = contents)

###### 請勿更動下方程式碼 ######
# 輸出結果請參考 `samesex_marriage.rds`
knitr::kable(docs_df[234,], align = "c")
id topic title content
pro_39.txt pro 特派專欄 MeToo到反娘 中國性別平權道阻且長 從 MeToo 事件 到 網路 仇視 男性 陰柔 氣質 都 顯示 中國 性別 平權 意識 不足 北京 NGO 人士 坦言 日趨 緊縮 的 言論 控制 將是 一大 阻礙 曾 任 人大代表 的 學者 則認 為 中國 至少 還需 10 年 時間 狀況 才能 慢慢 改善 今年初 開始 中國 校園 知識 圈 公益 界 乃至 宗教界 接連 有 女性 出面 揭露 曾 遭 性騷擾 或性 侵 涉事 者 不乏 形象 良好 的 公眾 人物 一時之間 中國 版 的 MeToo 運動 擴散 延燒 一起 起 事件 並未 促使 中國政府 做出 積極 回應 反性 侵 和 反性 騷的 MeToo 運動 更成 為 網路 禁詞 在 多元 性別 議題 上 中國 現況 同樣 不容樂觀 微博 今年 4 月 一度 查禁 同性戀 內容 近來 網路上 更 熱衷 討論 男性 陰柔 化 議題 譏諷 少年 娘則 國娘 反 娘 化 情緒 升溫 中共 黨媒 人民日報 雖然 出面 發聲 呼籲 尊重 包容 卻 也 強調 性 傾向 不 應該 成為 少數 人嘩眾 取寵 的 內容 過於 沉迷 陰柔之美 就 需要 矯正 顯見 官方 態度 仍然 保守 北京 同志 中心 計畫 主管 蔡瑤 先前 接受 中央社 記者 訪問 時分 析 中國 大陸 缺乏 類似 台灣 多元 性別 教育 的 政策 無法 在 校園 中 宣講 原本 非政府 組織 NGO 能 透過 自 媒體 傳播 普及 多元 性別 教育 但 當局 加強 管控 網路 言論 無非 不是 件 棘手 的 問題 她 表示 由於 NGO 缺乏 與 政府部門 對話 的 管道 推動 相關 性別 平權 多元性 別的 相關 立法 確實 有 很大 困難 我們 永遠 不 知道 底線 在 哪裡 不 只 我們 不 知道 政府部門 也 不 知道 底線 在哪 因而 延伸 許多 過度 自我 審查 問題 雖然 官方 態度曖昧 不清 但 仍 有 許多 案例 顯示 中國 推動 性別 平權 尚有 牛步 前進 的 跡象 例如 在 2016 年 的 兩會 期間 中國 中央 電視 台 英文 頻道 曾 播出 10 多分鐘 的 新聞節目 介紹 一名 全國 人大代表 提交 保護 多元 性別 族群 LGBT 權利 的 提案 這名 提案 的 人大代表 便是 中華 女子 學院 女性 學系 教授 孫曉梅 她 日前 在 北京 出席 聯合國 開發 計畫署 駐 中國 代表處 舉辦 的 座談會 時 坦言 性別 平權 的 問題 可能 還 需要 再過 10 年 才 會 慢慢 解決 她 表示 一些 官方 學者 研究 機構 目前 仍 持續 進行 中國 大陸 境內 的 多元 性別 及 跨 性別 調查 發覺 40 歲 以下 的 民眾 普遍 都 能 接受 認同 但 再 年長 一些 的 人 便 不是 特別 認同 讓 他們 接受 會 是 一個 過程 對此 孫曉梅 認為 當局 與 學界 現階段 必須 加強 培訓 立法 司法 機構 人員 並且 出版 更多 通識 宣傳 書籍 讓民眾 能 逐漸 建立 對 多元 性別 性別 平權 的 認識 新聞 連結 中央社 繆宗翰 今日 新聞 2018-08-22

2 Type-token ratio (20 分)

請運用上方整理出來的 data frame (或直接讀取 samesex_marriage.rds),將文章依據 topic 分成兩組,計算出這兩個 topic 的詞彙豐富度 (以 type-token ratio 衡量,定義見下)。

# Your code goes here

########## Answer ###########
library(tidytext)
library(dplyr)

docs_df %>%
  unnest_tokens(output = "word", input = "content",
                token = "regex", pattern = "\u3000") %>%
  group_by(topic, word) %>%
  summarise(n = n()) %>%  # Calculate token freq.
  ungroup() %>%
  group_by(topic) %>%
  summarise(TTR = n() / sum(n))  # Calculate type/token ratio

###### 請勿更動下方程式碼 ######
# Should print out:
#> # A tibble: 2 x 2
#>   topic   TTR
#>   <chr> <dbl>
#> 1 anti  0.115
#> 2 pro   0.173
#> # A tibble: 2 x 2
#>   topic   TTR
#>   <chr> <dbl>
#> 1 anti  0.115
#> 2 pro   0.173

TTR 定義

type-token ratio (TTR) 是一種衡量文本詞彙豐富度的指標,其定義為:

A type-token ratio (TTR) is the total number of UNIQUE words (types) divided by the total number of words (tokens) in a given segment of language.

例如,每天 天剛亮 時 我 母親 便 把 我 喊醒 這句話含有 9 個 tokens。其中, 這個 token 出現了兩次,其它的 token 皆只出現一次,因此總共有 8 種 types。這句話的 type-token ratio 因此為 0.8889 (8/9)。